如何在WP8.1 / WinRT / XAML中快速加速8bpp调色板(Indexed8)图形硬件加速?

时间:2015-05-16 02:12:57

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

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

在Windows Phone 8.1 / WinRT / XAML上以60 FPS(硬件加速)对blped索引/调色的8bpp图像进行blit的最佳方法是什么?

软件转换为RGBA会在手机上花费太多CPU时间。理想情况下,如果可能的话,我希望远离DX,因为这可能是很多工作,因为WP不支持D3DFMT_P8。

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题