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

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

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

我认为这排除了任何Apple框架,它也排除了许多用于在iOS中逐帧动画制作的公共代码。

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

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

  • 更快的iPhone PNG动画
  • 逐帧动画
  • 在iOS中使用video作为GL的纹理是否可行?

最后一个只是显示它可能是每帧可以将图像加载到GL纹理(他是从相机做的,所以如果我把所有东西存储在内存中,那应该更快)

我可以看到这些选项(列表最懒,最优化最后)

选项每个框架(由CADisplayLink提供),将相关图像从文件加载到纹理中,并显示该纹理

我很确定这是愚蠢的,所以选择B

选项B将所有图像预加载到内存中,然后按照上面的说明,我们只从内存而不是从文件加载

我认为这将是理想的解决方案,任何人都可以竖起大拇指或竖起大拇指吗?

选项C将我的所有PNG预加载到最大尺寸的单个GL纹理中,从而创建纹理图集。 每个帧,将纹理坐标设置为该帧的Atlas中的矩形。

虽然这可能是编码效率和性能效率之间的完美平衡,但这里的主要问题是失去分辨率; 在较旧的iOS设备上,最大纹理大小为1024×1024。 如果我们将32帧填入其中(实际上这与填充64相同),我们每帧将为128×128。 如果生成的动画在iPad上接近全屏,则不会破解它

选项D而不是加载到单个GL纹理中,加载到一堆纹理中,我们可以使用所有四个通道将4个图像压缩到单个纹理中

我在这里需要大量繁琐的编码。 即使考虑这种方法,我的RSI也开始发抖

我想我已经在这里回答了我自己的问题,但如果有人真的这样做了,或者可以看到通过,请回答!

如果需要比(B)更高的性能,看起来关键是glTexSubImage2D http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml

我们可以在内存中连续排列16个512x512x8位灰度帧,并将其作为单个1024x1024x32bit RGBA纹理发送到GL,然后使用上述function将其拆分为GL,而不是一次从内存中拉出一帧。

这意味着我们每16帧而不是每帧执行一次[RAM-> VRAM]传输。

当然,对于更现代的设备,我们可以获得64而不是16,因为更新的iOS设备可以处理2048×2048纹理。

我将首先尝试技术(B)并保留它,如果它工作(我不想超过代码),并在需要时看看这个。

我仍然找不到任何方法来查询可以在图形芯片上保留多少GL纹理。 有人告诉我,当你尝试为纹理分配内存时,GL只在内存不足时返回0。 然而,为了正确实现这一点,我想确保我不靠近风帆:资源……我不希望我的动画耗尽这么多VRAM,我的渲染的其余部分都失败了……

你可以使用CoreGraphics API让这个工作得很好,没有理由深入研究OpenGL来解决像这样的简单2D问题。 对于从灰度帧创建彩色帧的一般方法,请参阅colorizing-image-ignores-alpha-channel-why-and-how-to-fix 。 基本上,你需要使用CGContextClipToMask(),然后渲染一个特定的颜色,这样剩下的就是用你选择的特定颜色着色的钻石。 您可以在运行时执行此操作,也可以离线执行此操作,并为要支持的每种颜色创建1个video。 如果您执行N次操作并将结果保存到文件中,则在CPU上更容易,但现代iOS硬件比以前快得多。 在编写video处理代码时要注意内存使用问题,请参阅ios上的video和内存使用设备 ,以获取描述问题空间的入门知识。 您可以使用纹理图集和复杂的OpenGL编写所有代码,但是使用video的方法将更容易处理,您不必担心资源使用情况,请参阅我在内存中链接的库如果您有兴趣节省实施时间,请发布更多信息。