代码之家  ›  专栏  ›  技术社区  ›  U62

有内容的核心动画

  •  2
  • U62  · 技术社区  · 17 年前

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

    不管怎样,这些片段的图像来自一个大的PNG文件,该文件具有10种不同状态的24帧动画(因此测量为1152 x 480像素),动画是通过设置 contentsRect 每个的属性 卡莱尔 当我移动它。

    实际上,在窗口中跟踪一个接触点的多达7个部件的情况下,这似乎非常有效,但奇怪的是,当我开始移动这些部件时,在前0.5秒左右的时间里,它就像CPU在做其他事情一样非常不稳定,但之后,它将以40+fps的速度跟踪和更新屏幕(根据仪器)。

    那么,有人知道什么可以解释最初的冲动吗?

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

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

    编辑: 好的,正如第一个答案的注释中所描述的,我已经将图像分成十部分,现在是576 x 96,以适应硬件的限制。它仍然没有它应该是那么顺利,所以我对这个赏金。

    编辑2: 我链接了下面的一个图片。从本质上来说,用户的触摸是被跟踪的,从跟踪开始的偏移是被计算出来的(他们可以水平或垂直移动,一次只能移动一个位置)。然后选择其中一个图像作为层的内容(取决于它是哪种类型的工件以及它是水平还是垂直移动)。然后 内容简介 属性设置为从较大的图像中选择一个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 当应用程序加载时,没有任何区别。

    接下来我将尝试将每个帧复制到一个单独的 CGIGION 它将摆脱丑陋 内容简介 至少要计算。

    Sample image

    EdTe3: 进一步回到基本的调查点,这是一个触摸跟踪的问题,而不是一个核心动画的问题。我发现了一个基本的示例应用程序,它跟踪触摸并注释掉了导致屏幕重新绘制和 NSLog() 显示了我遇到的完全相同的问题:在 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
    

    之间的典型间隙 触动 事件是20毫秒。 触摸开始 第一 触动 是那个的十倍。这根本没有计算和屏幕更新,只是 NSLog 打电话。叹息。我想我会另问一个问题。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Andrew Pouliot    17 年前

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

    核心动画不能在本地使用,因为它超过了GPU上的最大纹理大小(1024x1024)。 我会把它弄碎一些 ;单个图像可能会给您带来最佳性能,但您必须进行测试才能找到答案。

    iirc,uiImageView通过设置连续的单个图像来制作动画,所以如果它对苹果足够好的话。

        2
  •  1
  •   Nikolai Ruhe    17 年前

    当涉及到性能时,我明确建议使用Shark(也优于仪器)。在“时间配置文件”中,你可以看到你的应用程序中的瓶颈是什么,即使是苹果代码中的瓶颈。在开发使用OpenGL和核心动画的iPhone应用程序时,我经常使用它。

        3
  •  0
  •   Corey Floyd    17 年前

    你试过使用CatiledLayer吗?

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