1

此时我使用此方案从 PNG 加载 OpenGL 纹理:

  • 通过 UIImage 加载 PNG
  • 通过位图上下文获取像素数据
  • 将像素重新打包为新格式(当前为 RGBA8 -> RGBA4、RGB8 -> RGB565,使用 ARM NEON 指令)
  • 使用数据创建 OpenGL 纹理

(这种方式在 Cocos2d 引擎中常用)

这需要很多时间,而且似乎需要做额外的工作,每次构建可能会完成一次。所以我想将重新打包的像素数据保存回文件中,然后第二次将其直接加载到 OpenGL。

我会知道实际的优势。有人试过吗?通过 zip 压缩数据是否值得(据我所知,当前的 iDevices 在文件访问方面存在瓶颈)?非常感谢真实的经验分享。

4

3 回答 3

1

更好的是,如果这些是预先存在的图像,请使用 PowerVR 纹理压缩 (PVRTC) 对其进行压缩。PVRTC 纹理可以直接加载,并以压缩形式存储在 GPU 上,因此它们可以比各种原始像素格式小得多。

我在这个示例代码中提供了一个如何压缩和使用 PVRTC 纹理的示例(纹理坐标在那里有点乱,因为我还没有更正它们)。在该示例中,我只是重用 Apple 的 PVRTexture 示例类来处理这种类型的纹理。PVRTC 纹理通过属于构建阶段之一的脚本进行压缩,因此可以为您的各种源图像自动执行此操作。

于 2012-04-24T17:46:01.107 回答
0

所以,我做了一些成功的实验:

我按(最大压缩率)压缩纹理数据zlib并将其保存到文件(通过NSData方法)。在某些情况下,文件的大小比 PNG 小得多。

至于加载时间,我不能说确切的时间戳,因为在我的项目中有 2 个并行线程 - 一个在背景上加载纹理,而另一个仍在渲染场景。它大约快两倍- 恕我直言,主要原因是我们直接将图像数据复制到 OpengGL 而不重新打包,并且输入数据量更小)。

PS:构建优化级别对加载时间的影响非常大:调试配置大约 4 秒,发布大约 1 秒。

于 2012-05-03T09:49:52.160 回答
-1

忽略任何关于 PVRTC 的建议,这些东西只对颜色使用有限的 3D 纹理有用。最好只使用来自真实图像的 24 或 32 BPP 纹理。如果您想查看您描述的过程的真实工作示例,请查看load-opengl-textures-with-alpha-channel-on-ios. 该示例展示了在附加到应用程序资源时如何使用 7zip(比 zip 好得多)压缩纹理数据,然后将结果解压缩并以最佳格式保存到磁盘,无需进一步像素即可直接发送到视频卡组件重新排列。这个例子使用了 POT 纹理,但适应非 POT 并使用 Apple 优化不会太难,因此不需要将纹理数据显式复制到显卡中。这些优化在将视频数据发送到 CoreGraphics 时已经实现。

于 2013-06-21T03:23:57.633 回答