核心动画与contentsRect匆匆

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

无论如何,这些作品的图像来自一个PNG文件,该文件有10个不同状态的动画24帧(所以度量值为1152 x 480像素),动画是通过设置每个CALayercontentsRect属性来完成的。

这实际上似乎工作得很好,最多可以跟踪7个窗口中的触点,但奇怪的是,当我最初开始移动棋子时,每秒0.5秒左右,它非常生涩,像CPU一样做其他事情,但在此之后,它将以40+ FPS(根据仪器)跟踪和更新屏幕。

那么,有没有人有任何想法可以解释这种最初的匆忙?

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

我显然可以将PNG文件分成10个部分,但我不认为这会有所帮助,因为他们都可能(一定)仍然需要一次存储在内存中。

编辑:好的,正如第一个答案的评论中所描述的那样,我已经将图像分成10个部分,现在是576 x 96,以适应硬件的限制。 尽管如此,它仍然没有那么光滑,所以我已经为此付出了代价。

编辑2:我已经链接下面的一个图像。 实质上是跟踪用户的触摸,计算跟踪开始时的偏移量(它们可以一个水平或垂直移动,一次只移动一个位置)。 然后选择其中一个图像作为图层的内容(取决于它是哪种类型的图块以及它是水平还是垂直移动)。 然后将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计算。

示例图像

编辑3:进一步回到基本的调查指向这是触摸跟踪的问题,而不是核心动画的问题。 我发现了一个跟踪触摸的基本示例应用程序,并注释了实际导致屏幕重绘的代码, NSLog()显示了我遇到的完全相同的问题: touchesBegin和first 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

touchesMoved事件之间的典型差距是20ms。 touchesBegin和first touchesMoved之间的差距是十倍。 这是没有计算或屏幕更新,只是NSLog调用。 叹。 我想我会打开一个单独的问题。


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

核心动画本身不能使用它,因为它超过了GPU(1024x1024)上的最大纹理尺寸。 我会分解一些 ; 个人形象可能会给你最好的表现,但你必须进行测试才能找到答案。

IIRC,UIImageView通过设置连续的单个图像来完成它的动画,所以如果Apple足够好的话......。


当涉及性能时,我肯定会推荐使用鲨鱼(也在乐器上)。 在'时间档案'中,你可以看到你的应用程序有什么瓶颈,即使它是苹果代码中的东西。 我在开发使用OpenGL和Core Animation的iPhone应用程序时使用了它。


你有没有尝试过使用CATiledLayer?

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

链接地址: http://www.djcxy.com/p/39477.html

上一篇: Core Animation with contentsRect jerkiness

下一篇: UIView Animation Inconsistent Result