(iPhone,OpenGL)直接纹理数据存储在文件中

时间:2012-04-24 10:28:47

标签: ios performance opengl-es textures

此时我使用此场景从PNG加载OpenGL纹理:

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

(这种方法常用于Cocos2d引擎)

这需要很长时间,而且似乎每次构建都可以完成额外的工作。所以我想将重新包装的像素数据保存回文件中并在第二次将其直接加载到OpenGL中。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

PS:构建优化级别在加载时间中扮演着非常重要的角色:调试配置大约4秒,发布时大约1秒。

答案 2 :(得分:-1)

忽略有关PVRTC的任何建议,这些内容仅对颜色使用有限的3D纹理有用。最好只使用真实图像中的24或32个BPP纹理。如果您希望看到您描述的流程的真实工作示例,请查看load-opengl-textures-with-alpha-channel-on-ios。该示例显示了在附加到app资源时如何使用7zip(比zip更好)压缩纹理数据,但随后将结果解压缩并以最佳格式保存到磁盘,可以直接发送到视频卡而无需其他像素组件重新排列。此示例使用POT纹理,但要适应非POT并使用Apple优化并不太难以将纹理数据显式复制到图形卡中。在向CoreGraphics发送视频数据时已经实现了这些优化。