背景信息:
– 还在争论是否使用C#(XNA)或C.我们不想承诺,直到我们探讨了如何在两种语言中解决这个问题.
– 如果可能,使用最大256MB RAM将是很好的.
– 一次会出现两个角色,这些角色只能在战斗之间改变.有时间在战斗之间加载/释放内存,但游戏需要在战斗中以每秒60帧的速度运行.每帧为16.67ms
– 每个字符的总数量在几百个.每个图像大约是200×400像素.任何时候只会显示每个角色的一个图像.
未压缩,每个图像从我的计算中大约需要300kb;高达100MB的整个字符.这是推动太接近256MB的限制,因为还需要一些其他资源的内存.
因为每个图像可以共16种颜色.理论上我应该能够使用1/8的空间,如果我可以利用这一点.我已经环顾四周了,但没有发现任何关于本色支持的图片. (使用较少的位存储每个像素,每个映射到32位RGBa颜色)
我们尝试使用DXT压缩,但是,压缩工件非常明显.
我正在考虑用自己的文件格式,每像素4位(和一些额外的调色板信息),将这种新格式的所有图像加载到RAM中,然后在绘制任何特定图像时,只将该图像解压缩为原始图像所以它可以正常渲染.我不知道执行这么多赋值操作(每个字符的每个字符大小为200×400,每个160k)是否现实.对我来说听起来很骇人听闻
有没有人建议我的解决方案是否合理,如果可能有更好的一个可用?
非常感谢!
(我也尝试使用只有1个通道的图像,然后使用着色器来执行一系列if语句来将各种值转换为其他颜色,不幸的是,着色器的代码行太多,也是相当黑客并且不能很好地扩展.)
解决方法
至于内存限制问题,建议取消它:
>使用1555纹理格式将大小减半
(虽然你只有1位
α)
>做不同的图像有什么共同的部分?您能使用多个较小的图块而不是一个较大的图形(即2×4或更多的网格)渲染角色.很可能你会在大部分图像之间共享许多空格,这样可以节省很多的空间(我刚刚发现有人已经通过精简版提到了这个 – 尽管这应该是一个无损的选项来保存记忆).
>你提到已经试图伪造码垛纹理了.而不是IF语句,您可以拥有包含调色板颜色的第二个纹理,并使用从第一个纹理获得的值作为纹理坐标,通过像素着色器查找第二个纹理(第二个纹理只是一个1D纹理32位色值).
鉴于现代处理器的优势,根据您当时的做法,您可能还有足够的空闲资源来将两个字符的帧解压缩到准备渲染的纹理(尤其是多核)中.您将需要至少双缓冲纹理,以阻止cpu阻塞等待GPU从上一帧完成使用它们.
您还可以组合其中一些选项来节省更多.