我有一个钻石爆炸成碎片的 32 帧灰度动画(即 32 个 PNG 图像 @ 1024x1024)
我的游戏由 12 种不同的颜色组成,所以我需要以任何想要的颜色来执行动画
我认为这排除了任何 Apple 框架,也排除了 iOS 中用于逐帧动画的大量公共(public)代码。
我的潜在解决方案路径是什么?
这些是我找到的最好的 SO 链接:
- > Faster iPhone PNG Animations
- > frame by frame animation
- > Is it possible using video as texture for GL in iOS?
最后一个只是表明可以在每一帧将图像加载到 GL 纹理中(他是通过相机进行的,所以如果我将所有内容都存储在内存中,那应该会更快)
我可以看到这些选项(最懒惰的排在最前面,最优化的排在最后)
选项A 每一帧(由 CADisplayLink 提供),将相关图像从文件加载到纹理中,并显示该纹理
我很确定这是愚蠢的,所以选择 B
选项B 将所有图像预加载到内存中 然后按照上面的方法,我们只从内存而不是从文件加载
我认为这将是理想的解决方案,有人可以赞成或反对吗?
选项C 将我所有的 PNG 预加载到一个最大尺寸的 GL 纹理中,创建一个纹理图集。每一帧,将纹理坐标设置为该帧的 Atlas 中的矩形。
虽然这可能是编码效率和性能效率之间的完美平衡,但这里的主要问题是分辨率下降;在较旧的 iOS 设备上,最大纹理大小为 1024x1024。如果我们将 32 帧填入其中(实际上这与填入 64 帧是一样的),那么每帧将是 128x128。如果生成的动画在 iPad 上接近全屏,这不会破解它
选项 D 加载到一堆纹理中,而不是加载到单个 GL 纹理中 此外,我们可以使用所有四个 channel 将 4 个图像压缩到一个纹理中
我对这里所需的大量繁琐编码感到犹豫。一想到这种方法,我的 RSI 就开始发麻
我想我已经在这里回答了我自己的问题,但是如果有人实际这样做过或者可以看透,请回答!
最佳答案
如果需要比 (B) 更高的性能,看起来关键是 glTexSubImage2D http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml
我们可以在内存中连续安排 16 个 512x512x8 位灰度帧,而不是一次从内存中拉出一帧,将其作为单个 1024x1024x32 位 RGBA 纹理发送到 GL,然后使用上面的方法在 GL 中拆分它功能。
这意味着我们每 16 帧而不是每帧执行一次 [RAM->VRAM] 传输。
当然,对于更现代的设备,我们可以获得 64 个而不是 16 个,因为更新的 iOS 设备可以处理 2048x2048 纹理。
我将首先尝试技术 (B),如果它有效(我不想过度编码),我会先尝试技术(B),然后在需要时查看它。
我仍然找不到任何方法来查询图形芯片上可以容纳多少个 GL 纹理。有人告诉我,当您尝试为纹理分配内存时,GL 在内存不足时只返回 0。然而,为了正确地实现这一点,我想确保我没有顺风航行 re: resources...我不希望我的动画耗尽太多 VRAM,以至于我的其余渲染失败...
关于iOS:以自定义颜色播放逐帧灰度动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6327477/