【问题标题】:How can I blit 8bpp paletted (Indexed8) graphics HW-accelerated in WP8.1/WinRT/XAML?如何在 WP8.1/WinRT/XAML 中 blit 8bpp 调色板 (Indexed8) 图形硬件加速?
【发布时间】:2015-05-16 02:12:57
【问题描述】:

我正在将旧的 DOS 游戏移植到 WP8.1。 DOS 游戏以 VGA 渲染所有图形,这是一种每像素 8 位的图形模式。调色板将 256 种颜色中的每一种都映射到特定的 RGB 三元组。现在我通过查找表手动将每帧的所有像素 (60 FPS) 转换为 32bpp (RGBA),因为WriteableBitmap 只接受这种格式的图像。

在 Windows Phone 8.1/WinRT/XAML 上以 60 FPS 的速度对索引/调色板 8bpp 图像进行 blit 的最佳方式是什么?

软件转换为 RGBA 会在手机上占用过多的 CPU 时间。理想情况下,如果可能的话,我想远离 DX,因为这可能会做很多工作,而且 WP 不支持 D3DFMT_P8。

【问题讨论】:

    标签: xaml windows-phone-8 windows-runtime gpu


    【解决方案1】:

    您可以在内存流中创建 8 个 BPP 图像文件数据,然后从该流中加载图像。平台上的BMP、GIF和PNG格式are supported,我认为BMP对你来说是最容易实现的。为了减轻内存管理器的压力,跨帧重用内存流,只需用新的数据覆盖图像数据。

    但是,我不确定这是否能解决您的性能问题。 做你想做的事的正确方法是 DirectX。不支持 D3DFMT_P8 没关系,您可以使用 D3DFMT_I8,并在像素着色器中应用您喜欢的任何调色板(例如,您可以从包含调色板的第二个 256x1 RGB 纹理中查找)。 看看“Direct3D and XAML App (Windows Phone)”项目模板,它并不复杂,甚至包含一个像素着色器,您可以更改它来进行这些纹理查找。

    更新:我很高兴更简单的解决方案对您有用。 现在记住所有 WP8 设备至少是双核的。因此,如果您想提高帧速率,可以使用 2 个 MemoryStream 实例。在后台线程中运行游戏循环,将帧数据写入一个 MS。同时,在 GUI 线程中,从第二个 MemoryStream 加载并显示图像。当两个任务都完成后,只需交换 MemoryStream 实例的指针,然后重复。如果演示所需的时间与您的游戏循环相当,您可能会获得高达 50% 的 FPS 提升。

    【讨论】:

    • 我的问题似乎不清楚:我正在以每帧 60 FPS 的速度实时进行转换。我更新了问题以使其更清楚。还是您认为您的解决方案应该以某种方式适用于动画? - 我去看看项目模板。
    • 当然适用。不要向闪存写入任何内容。使用调色板创建一个包含 256 色 BMP 图像的 MemoryStream 对象,然后每秒 60 次(更新 MemoryStream 覆盖图像数据,从流中加载图像)
    • 效果出奇的好。更令人惊讶的是:低 GC 压力……有时我低估了 WPF。
    • 好。查看更新。然而,它不是 WPF,而是 Silverlight。或者只是 XAML/WinRT。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多