核心动画与contentsRect jerkiness

时间:2009-05-28 01:12:35

标签: iphone core-animation

在我的(拼图)游戏中,每件作品都使用CALayer在屏幕上绘制。有48件(8x6网格),每件48x48像素。我不确定这是不是太多层,但如果这不是最好的解决方案我不知道是什么,因为每帧使用Quartz2D重绘整个显示器似乎不会更快。

无论如何,这些作品的图像来自一个大的PNG文件,该文件具有24帧动画,适用于10种不同的状态(因此测量为1152 x 480像素),动画通过设置每个contentsRect属性来完成。我移动时CALayer

这实际上看起来效果很好,跟踪窗口中的触摸点多达7件,但奇怪的是,当我最初开始移动碎片时,前一秒0.5左右,它非常生涩CPU正在做其他事情,但之后它将以40+ FPS跟踪和更新屏幕(根据Instruments)。

那么有没有人有任何想法可以解释那个最初的抽搐?

我能想到的唯一理论是它将PNG文件的位解压缩到一个临时位置,然后在动画停止后丢弃它们,在这种情况下有没有办法阻止Core Animation这样做?

我显然可以将PNG文件分成10个部分,但我不相信这会有所帮助,因为他们所有(可能)仍然需要立即在内存中。

编辑:好的,如第一个答案的评论中所描述的那样,我将图像分成了10个片段,现在是576 x 96,以便符合约束条件硬件。尽管如此,它仍然没有那么顺利,所以我已经给了它一个赏金。

EDIT2:我已将以下某个图片链接起来。基本上跟踪用户的触摸,计算从跟踪开始的偏移(它们可以一个水平或垂直移动,一次只移动一个位置)。然后选择其中一个图像作为图层的内容(取决于它的片段类型以及它是水平还是垂直移动)。然后contentsRect属性设置为从较大的图像中选择一个48x48帧,如下所示: -

layer.position = newPos;
layer.contents = (id)BallImg[imgNum];
layer.contentsRect = CGRectMake((1.0/12.0)*(float)(frame % 12), 
                                0.5 * (float)(frame / 12), 
                                1.0/12.0, 0.5); 

顺便说一句。我关于它每次解压缩源图像的理论是不对的。我写了一些代码,当应用程序加载时,将解码后的PNG文件中的原始像素复制到一个新的CGImage,并且它没有任何区别。

接下来我要尝试将每个帧复制到一个单独的CGImage中,这将至少摆脱丑陋的contentsRect计算。

Sample image

EDIT3:进一步的回归基础调查指出这是触摸跟踪的问题,而根本不是Core Animation的问题。我找到了一个跟踪触摸的基本示例应用程序,并注释掉了实际导致屏幕重绘的代码,NSLog()显示了我遇到的完全相同的问题:{{1}之间的长时间延迟}和第一个touchesBegin事件。

touchesMoved

2009-06-05 01:22:37.209 TouchDemo[234:207] Begin Touch ID 0 Tracking with image 2 2009-06-05 01:22:37.432 TouchDemo[234:207] Touch ID 0 Tracking with image 2 2009-06-05 01:22:37.448 TouchDemo[234:207] Touch ID 0 Tracking with image 2 2009-06-05 01:22:37.464 TouchDemo[234:207] Touch ID 0 Tracking with image 2 2009-06-05 01:22:37.480 TouchDemo[234:207] Touch ID 0 Tracking with image 2 事件之间的典型差距是20ms。 touchesMoved和第一touchesBegin之间的差距是其中的十倍。而且根本没有计算或屏幕更新,只有touchesMoved调用。叹。我想我会打开一个单独的问题。

3 个答案:

答案 0 :(得分:3)

我不认为这是一个记忆问题;我认为它与核心动画方面的大量图像效率低有关。

Core Animation无法原生使用它,因为它超过了GPU(1024x1024)上的最大纹理大小。 我会分手一些;单个图像可能会为您提供最佳性能,但您必须进行测试才能找到答案。

IIRC,UIImageView通过设置连续的单个图像来进行动画制作,所以如果它对Apple来说足够好......

答案 1 :(得分:1)

当谈到表演时,我绝对建议使用Shark(也可以使用乐器)。在“时间档案”中,您可以看到应用程序中的瓶颈,即使它是Apple代码中的内容。在开发使用OpenGL和Core Animation的iPhone应用程序时,我经常使用它。

答案 2 :(得分:0)

您是否尝试过使用CATiledLayer?

它针对此类工作进行了优化。