iOS:以自定义颜色播放逐帧灰度动画

标签 ios animation opengl-es frame

我有一个钻石爆炸成碎片的 32 帧灰度动画(即 32 个 PNG 图像 @ 1024x1024)

我的游戏由 12 种不同的颜色组成,所以我需要以任何想要的颜色来执行动画

我认为这排除了任何 Apple 框架,也排除了 iOS 中用于逐帧动画的大量公共(public)代码。

我的潜在解决方案路径是什么?

这些是我找到的最好的 SO 链接:

最后一个只是表明可以在每一帧将图像加载到 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/

相关文章:

objective-c - 在 objective-c 中反转名字和姓氏?

javascript - 旋转动画不适用于跨度 ID

iphone - 在 OpenGL ES 2.0 中切换着色器是否会影响性能?

android - 在 Vivante GC1000 GPU 上编译/链接着色器 (Galaxy Tab 3)

ios - UITableView 动画无法正常工作

ios - 无法在iOS后台模式下向sqlite DB插入数据

ios - Xamarin iOS : Filtering out the FileType show on Document Picker

ios - 数据集之间的 UICollectionViewFlowLayout 动画

android - 两个 Activity 之间的动画不起作用

c++ - 如何将圆形数组而不是常规数组传递给 OpenGL 函数?