全高清2D纹理内存OpenGL

6
我正在为一家艺术公司编写一个全高清2D引擎,希望它是跨平台的,并使用OpenGL和C++编写。我遇到的主要问题是如何处理所有这些高清精灵。艺术家们以24fps的速度绘制了图形,并将其导出为png序列。我已将它们转换为DDS DXT5格式(不理想,因为需要DirectX头文件才能加载),可以大大减小文件大小。游戏中的某些场景可能会同时有5或6个动画精灵,每个精灵可能由200多个帧组成。目前,我正在将精灵加载到指针数组中,但即使使用压缩纹理,这也需要太长时间来加载,并且使用了相当多的内存(完整场景约占用500MB)。
所以我的问题是,您是否有任何关于如何处理如此高数量级帧的想法或技巧?我想到了一些想法:
- 使用swf格式存储Flash中的帧 - 实现2D骨骼动画系统,替换png序列(我担心关节可见)
像Castle Crashers这样的游戏如何快速加载具有出色的高清图形呢?

1
从磁盘加载时间太长,还是上传到GPU的时间太长? - genpfault
“不是很理想,因为它需要DirectX头文件来加载。” 你不需要Direct3D头文件来加载DDS文件。 - Nicol Bolas
2个回答

4

首先要记住的是,并非所有平台都支持DXT5(尤其是移动设备)。

除此之外,您是否考虑使用zlib等工具来压缩纹理?这些纹理很可能存在相当程度的自相似性,这意味着它们可以大幅压缩。在当今时代,由于处理器速度的提高,解压缩变得更加廉价,从磁盘中获取数据所节省的时间远远比解压缩所花费的时间更有用。

如果我是您,我会从那里开始。


大多数手机无法处理500MB的纹理数据,所以我猜这些对他来说并不重要 ;) - Nicol Bolas
1
@Nicol:您可以尝试使用zlib压缩和流式传输。 - Goz

2

24帧手绘动画?你考虑过降低帧率吗?即使是电影级别的纸片动画也很少以全24帧绘制。将帧率降至18帧,可以减少25%的数据。

无论如何,您没有具体说明加载时间长的地方在哪里。是硬盘到内存的加载有问题,还是内存到纹理加载有问题?您是否经常将一组纹理数据交换到GPU中,还是仅在加载时构建一堆纹理?

如果是磁盘加载问题,那么您唯一的选择就是对磁盘上的纹理数据进行压缩,并将其解压缩到内存中。S3TC风格的压缩并不是非常压缩;它被设计为用于纹理硬件的可用压缩技术。您通常可以通过在其上使用标准压缩库(例如zlib、bzip2或7z)来使其更小。当然,这意味着必须对其进行解压缩,但是CPU的速度比硬盘快,因此总体上通常是胜利的。

如果问题在于纹理上传带宽,则没有太多解决方案。好吧,这取决于您感兴趣的硬件。如果您感兴趣的硬件支持OpenCL,则始终可以将压缩数据传输到GPU,然后使用OpenCL程序直接在GPU内存中实时解压缩它。但是需要OpenCL支持会影响您可以支持的最低硬件级别。

不要轻易忽视2D骨骼动画。像《奥丁领域》这样的游戏通过拥有每个手臂位置的几个版本来实现更好的2D骨骼动画。被绘制的是与其附着部位最接近的那个版本。他们还使用巧妙的艺术手法来隐藏任何缺陷,例如膨胀的衣服等。


谢谢你的建议,看起来在我的情况下是纹理上传带宽的问题。我使用zlib打包纹理,并使用optipng优化png纹理。这使速度稍微快了一点,但可能不得不降低帧率。再次感谢! - GracelessROB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接