【问题标题】:Poor performance when animating transform of large-ish UIImageView动画转换大型 UIImageView 时性能不佳
【发布时间】:2014-06-02 15:49:54
【问题描述】:

我正在为我们的游戏构建一个标题序列,其中每个标题都是大约一半屏幕大小的视网膜图像,我使用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 控件的游戏),但过去并没有造成问题...

【问题讨论】:

  • UIImageView 负责它自己的包含实际图像的子层。也许当您设置变换时,它会尝试重新渲染以在新的比例下看起来最好。
  • 是的,这听起来是一个非常合理的解释。不过不知道该怎么办!
  • 使用此处描述的核心动画工具:developer.apple.com/library/ios/documentation/DeveloperTools/…

标签: ios objective-c performance animation uiimageview


【解决方案1】:

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

  1. 我将级联 UIView 动画转换为单个 CALayer keyframed animation,以便它们是连续的,而不是在每个阶段停止、调用完成处理程序并开始一个新动画。正如 Brian Nickel 指出的那样,也许这会阻止他们“安定下来”并以新的比例重新渲染。
  2. 但这并没有阻止第一次卡顿,因为它显示了每个新的 UIImage。为了解决这个问题,我预先创建了所有 UIImageViews(总共 6 个),将它们添加到 superview,并将它们的 alphas 设置为零。图片不大,也没有太多,所以看起来还可以。

【讨论】:

  • 谢谢约瑟夫。你的第二个技巧,添加它的视图然后改变透明度是一个天才的小技巧来阻止重绘结结!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多