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

时间:2011-06-13 07:03:21

标签: ios animation opengl-es frame

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我对这里所需的大量繁琐编码感到厌烦。即使考虑这种方法,我的RSI也开始变得刺痛了

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

我将首先尝试技术(B)并将其留在那里,如果它有效(我不想超过代码),并在需要时查看它。

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

答案 1 :(得分:0)

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