如何在 WP8.1/WinRT/XAML 中对 8bpp 调色板 (Indexed8) 图形进行硬件加速?
How can I blit 8bpp paletted (Indexed8) graphics HW-accelerated in WP8.1/WinRT/XAML?
我正在将一个旧的 DOS 游戏移植到 WP8.1。 DOS 游戏在 VGA 中呈现所有图形,这是一种每像素 8 位图形模式。调色板将 256 种颜色中的每一种映射到特定的 RGB 三元组。现在我正在通过查找 table 手动将每帧的所有像素 (60 FPS) 转换为 32bpp (RGBA),因为 WriteableBitmap
只接受这种格式的图像。
在 Windows Phone 8.1/WinRT/XAML 上以 60 FPS 硬件加速 indexed/paletted 8bpp 图像的最佳方式是什么?
软件转换为 RGBA 在 phone 上花费了太多 CPU 时间。理想情况下,如果可能的话,我想远离 DX,因为这可能需要很多工作,而且因为 D3DFMT_P8 无论如何都不支持 WP。
您可以在内存流中创建 8 BPP 图像文件数据,然后从该流中加载图像。 BMP、GIF、PNG格式都在平台上are supported,我觉得BMP最容易实现。为了减少内存管理器的压力,跨帧重用内存流,只需用新的覆盖图像数据即可。
但是,我不确定这是否能解决您的性能问题。
做你想做的事的正确方法是 DirectX。不支持 D3DFMT_P8 并不重要,您可以使用 D3DFMT_I8,并在像素着色器中应用您喜欢的任何调色板(例如,您可以从包含调色板的第二个 256x1 RGB 纹理中查找)。
看看“Direct3D 和 XAML App (Windows Phone)”项目模板,它并不复杂,甚至包含一个像素着色器,您可以更改它来执行这些纹理查找。
更新: 很高兴这个更简单的解决方案对您有用。
现在记住所有 WP8 设备至少是双核的。所以如果你想提高你的帧率,你可以使用 MemoryStream 的 2 个实例。 运行 你的游戏在后台线程中循环,将一帧数据写入一个 MS。同时,在 GUI 线程中,加载并显示来自第二个 MemoryStream 的图像。当两个任务都完成后,只需交换 MemoryStream 实例的指针,然后重复。如果演示文稿所花的时间与您的游戏循环所花的时间相当,您可能会获得高达 50% 的 FPS 改进。
我正在将一个旧的 DOS 游戏移植到 WP8.1。 DOS 游戏在 VGA 中呈现所有图形,这是一种每像素 8 位图形模式。调色板将 256 种颜色中的每一种映射到特定的 RGB 三元组。现在我正在通过查找 table 手动将每帧的所有像素 (60 FPS) 转换为 32bpp (RGBA),因为 WriteableBitmap
只接受这种格式的图像。
在 Windows Phone 8.1/WinRT/XAML 上以 60 FPS 硬件加速 indexed/paletted 8bpp 图像的最佳方式是什么?
软件转换为 RGBA 在 phone 上花费了太多 CPU 时间。理想情况下,如果可能的话,我想远离 DX,因为这可能需要很多工作,而且因为 D3DFMT_P8 无论如何都不支持 WP。
您可以在内存流中创建 8 BPP 图像文件数据,然后从该流中加载图像。 BMP、GIF、PNG格式都在平台上are supported,我觉得BMP最容易实现。为了减少内存管理器的压力,跨帧重用内存流,只需用新的覆盖图像数据即可。
但是,我不确定这是否能解决您的性能问题。 做你想做的事的正确方法是 DirectX。不支持 D3DFMT_P8 并不重要,您可以使用 D3DFMT_I8,并在像素着色器中应用您喜欢的任何调色板(例如,您可以从包含调色板的第二个 256x1 RGB 纹理中查找)。 看看“Direct3D 和 XAML App (Windows Phone)”项目模板,它并不复杂,甚至包含一个像素着色器,您可以更改它来执行这些纹理查找。
更新: 很高兴这个更简单的解决方案对您有用。 现在记住所有 WP8 设备至少是双核的。所以如果你想提高你的帧率,你可以使用 MemoryStream 的 2 个实例。 运行 你的游戏在后台线程中循环,将一帧数据写入一个 MS。同时,在 GUI 线程中,加载并显示来自第二个 MemoryStream 的图像。当两个任务都完成后,只需交换 MemoryStream 实例的指针,然后重复。如果演示文稿所花的时间与您的游戏循环所花的时间相当,您可能会获得高达 50% 的 FPS 改进。