动画转换大型UIImageView时性能不佳

时间:2014-06-02 15:49:55

标签: ios objective-c performance animation uiimageview

我为我们的游戏构建了一个标题序列,其中每个标题都是一个大约半屏大小的视网膜图像,我使用UIImageView进行显示。

标题序列具有简单的3个阶段,因为它逐渐增长并淡入/淡出:

// 1. Fade in and grow
[UIView animateWithDuration:1.0f animations:^{
    titleImageView.alpha = 1.0f;
    titleImageView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} completion:^(BOOL finished) {

    // 2. Stay opaque, grow a little more
    [UIView animateWithDuration:2.0f animations:^{
        titleImageView.transform = CGAffineTransformMakeScale(1.1f, 1.1f);
    } completion:^(BOOL finished) {

        // 3. Fade out, grow even further
        [UIView animateWithDuration:2.0f animations:^{
            titleImageView.alpha = 0.0f;
            titleImageView.transform = CGAffineTransformMakeScale(1.3f, 1.3f);
        } completion:nil];

    }];

}];

在每个动画阶段开始时,当一帧或两帧掉落时会出现口吃。它在iPhone 4和iPad 3等旧硬件上特别引人注目,但它在iPad Air上甚至引人注目,这是令人惊讶的。

一些扣除:

  • 它与加载UIImage本身无关,因为我已尝试预加载数据并确保PNG已解压缩。此外,在动画的每个阶段都会发生口吃,即使它已经在屏幕上播放了一段时间。
  • 我使用了Time Profiler工具,并注意到CA似乎在每次结巴时都在后台复制PNG数据,尽管我不确定为什么/为什么。当transform每次更改时,CALayers当然不需要在CPU上重新创建任何图像数据吗?
  • 编辑:另请注意,我在没有动画的情况下尝试了它(只是设置了这些转换属性,也没有更改alpha),并得到了相同的结果。

另请注意,我在后台进行了一些OpenGL ES图形处理(它是前景中带有UIKit控件的游戏),但过去没有引起任何问题......

1 个答案:

答案 0 :(得分:2)

所以,它有点难看,但我同时用两种方法解决了它:

  1. 我将级联的UIView动画转换为单个CALayer keyframed animation,以便它们连续而不是在每个阶段停止,调用完成处理程序,并开始一个新的动画。也许这会阻止他们解决问题。正如Brian Nickel指出的那样,以新的规模重新渲染。
  2. 但这并没有阻止第一次口吃,因为它显示了每个新的UIImage。为了解决这个问题,我在前面创建了所有UIImageViews(总共6个),将它们添加到superview中,并将它们的alpha设置为零。图像不是很大,而且图像太多了,所以这看起来还不错。