C#或C++游戏:许多16个彩色图像加载到RAM中.高效的解决方案?

Cod*_*olf 10 c# c++ memory-management image-processing

我正处于制作格斗游戏的计划阶段,并且不确定如何处理与记忆有关的一个问题.

背景信息:
- 仍在争论是否使用C#(XNA)或C++.在我们探索如何用两种语言解决这个问题之前,我们不想承诺.
- 如果可能的话,使用最大256MB的RAM会很棒.
- 一次出现两个角色,这些角色只能在战斗中改变.战斗之间有时间加载/释放内存,但游戏需要在战斗期间以每秒60帧的速度运行.每帧为16.67ms
- 每个字符的图像总数低至数百.每幅图像大约为200x400像素.在任何给定时刻,每个角色只能显示一个图像.

未压缩,每张图像大约需要300kb的计算量; 整个角色高达100MB.考虑到其他一些资源也需要内存,这推动得太接近256MB的限制.

由于每个图像可以制作总共16种颜色.从理论上讲,如果我可以利用这个,我应该可以使用1/8的空间.我环顾四周,但没有找到任何关于调色板图像的原生支持.(使用较少的位存储每个像素,每个像素映射到32位RGBa颜色)

我们尝试使用DXT压缩,但压缩工件非常明显.

我正在考虑使用每像素4位(以及一些额外的调色板信息)制作我自己的文件格式,在战斗之前将这种新格式的所有图像加载到RAM中,然后在绘制任何特定图像时,仅将该图像解压缩为原始图像所以它可以正确呈现.我不知道每帧执行如此多的赋值操作(每个字符的appx 200x400 = 160k)是否真实.这对我来说听起来很不好看.

有没有人对我的解决方案听起来是否合理以及是否有更好的解决方案有建议?

非常感谢!

(我还尝试使用只有1个通道的图像,然后使用着色器执行一系列if语句将各种值转换为其他颜色.不幸的是,着色器的代码行太多了.它也相当hacky并且不能很好地扩展.)

小智 2

如果您想以 Xbox 360 为目标并且没有合适的(成熟的)开发套件,那么 C# 是您唯一的选择。当开始使用 XNA 时,XNA 肯定会让您的工作变得更加轻松,特别是如果您现在只做 2D(并且可以处理许多您现在不需要担心的其他事情)。

至于内存限制问题,建议解决:

  • 使用 1555 纹理格式将大小减半(尽管您只有 1 位 alpha)
  • 不同的图像有共同的部分吗?您可以使用许多较小的图块而不是一个大的图块(即 2x4 或更大的网格)来渲染角色吗?最有可能的是,你会在角落里有很多空白空间,可以在大多数图像之间共享,这将产生良好的保存效果(我刚刚发现有人已经通过 spritesheets 提到过这一点 - 尽管这应该是一个无损的保存选项记忆)。
  • 您提到已经尝试伪造托盘纹理。您可以拥有一个包含调色板颜色的第二个纹理,而不是 IF 语句,并使用从第一个纹理获得的值作为纹理坐标,通过像素着色器查找第二个纹理(第二个纹理只是一个一维纹理) 32 位颜色值的纹理)。
  • 考虑到现代处理器的强大功能以及您当时所做的其他事情,您可能有足够的备用资源来将两个角色的动态帧解压缩为准备渲染的纹理(尤其是多核)。不过,您至少需要对纹理进行双缓冲,以阻止 CPU 阻塞,等待 GPU 完成使用前一帧中的纹理。

您还可以结合其中一些选项来节省更多。