【问题标题】:Full HD 2D Texture Memory OpenGL全高清 2D 纹理内存 OpenGL
【发布时间】:2011-09-07 14:37:46
【问题描述】:

我正在为一家艺术家公司编写一个支持全高清的 2D 引擎,希望它是跨平台的,并且是用 OpenGL 和 C++ 编写的。

我遇到的主要问题是如何处理所有这些高清精灵。艺术家以 24fps 的速度绘制图形,并将它们导出为 png 序列。我已将它们转换为 DDS(不理想,因为它需要加载 directx 标头)DXT5,从而大大减少了文件大小。游戏中的某些场景一次可以有 5 或 6 个动画精灵,并且这些可以包含 200 多帧每个。目前我正在将精灵加载到一个指针数组中,但这需要很长时间才能加载,即使使用压缩纹理,并且使用相当多的内存(完整场景大约 500mb)。

所以我的问题是,对于如何处理如此大量的帧,您有什么想法或技巧吗?我有几个想法:

  • 使用 swf 格式存储来自 Flash 的帧
  • 实现 2D 骨骼动画系统,替换 png 序列(我担心关节是否可见)

Castle Crashers 等游戏如何以出色的高清显卡加载速度如此之快?

【问题讨论】:

  • 从磁盘加载的时间过长,或者上传到 GPU 的时间过长?
  • "不理想,因为它需要加载 Directx 标头" 您不需要 Direct3D 标头来加载 DDS。

标签: c++ opengl


【解决方案1】:

首先要记住的是,并非所有平台都支持 DXT5(特别是手机)。

除此之外,您是否考虑过使用 zlib 之类的东西来压缩纹理?纹理可能具有相当程度的自相似性,这意味着它们会压缩很多。在当今这个时代,由于处理器的速度,解压很便宜,而且节省的从磁盘中取出数据的时间可能比解压所损失的时间有用得多。

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

【讨论】:

  • 大多数手机无法处理 500MB 的纹理数据,所以我猜这些对他来说并不重要 ;)
  • @Nicol:你可以使用 zlib 压缩和流媒体。
【解决方案2】:

24 fps 手绘动画?有没有考虑降低帧率?即使是电影质量的 cel 动画也很少以全 24-fps 的速度绘制。即使降至 18 fps 也会丢失 25% 的数据。

在任何情况下,您都没有指定在哪里您的加载时间很长。是从硬盘加载到内存的问题,还是内存到纹理加载的问题?您是经常将纹理数据集交换到 GPU 中,还是只是在加载时用它构建一堆纹理?

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

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

不要这么快就关闭 2D 骨骼动画。像 Odin Sphere 这样的游戏能够通过每个手臂位置的多个版本来实现更好的 2D 骨骼动画。被绘制的那个是最接近它所附着的身体部位的那个。他们还使用巧妙的艺术来隐藏任何缺陷,例如喇叭形衣服等。

【讨论】:

  • hmnn 感谢您的建议,在我的情况下,它似乎是纹理上传带宽。我使用 zlib 来打包纹理,还使用 ​​optipng 来优化 png 纹理。它使它更快一点,但可能不得不诉诸降低帧速率。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2019-04-02
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2011-01-11
相关资源
最近更新 更多