【问题标题】:Bad performance with core animation and view rotations: How to improve?核心动画和视图旋转性能不佳:如何改进?
【发布时间】:2009-05-25 12:41:06
【问题描述】:

我有 12 个视图,当通过触摸图标几秒钟进入主屏幕自定义模式时,我旋转的视图几乎与主屏幕中的图标相似。

我使用 3D 转换代码进行旋转。它们每个的持续时间仅为 0.02 秒,并且旋转角度和方向会根据加速度测量值永久改变。

其中 5 个视图很好,但 12 个视图的性能很差。这是轮换代码:

CATransform3D rotatedTransform = CATransform3DRotate(CATransform3DIdentity, degrees * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;

周围有一些核心动画。但是我在这里看到了 CPU 的浪费,因为我不做任何 3D 的东西。我真的只旋转二维而不是别的。它们是简单的 UIImageViews,但是是一个自定义类,可以自己执行此旋转动画。

我听说有“仿射”变换应该适用于 2D 空间。在这种情况下,您会建议将其更改为 2D 吗?

我必须更喜欢更改图层或视图的变换吗?哪个更快?

【问题讨论】:

    标签: iphone cocoa-touch uikit core-animation transform


    【解决方案1】:
    1. Shark it.你必须知道到底什么是缓慢的继续。

    2. 尝试将更新间隔从 0.02 秒增加到 0.1 秒;这可以接受吗?

    3. 如果所有图像一起旋转,请在超级层上使用sublayerTransform,而不是单独转换每个图像

    4. 在不关闭动画的情况下尝试,只是为了确认您的回调按预期工作(setDisableActions:在 CATransaction 上)。当你关闭 Shark 时,你是否看到与在 Shark 中变慢相同的情况?

    5. 如果您在滚动视图中执行此操作,您可能会遇到其他问题。您需要处理屏幕上/屏幕外发生的事情等。

    6. 3d 变换的速度与核心动画 AFAIK 中的仿射变换速度相同。基本的 sin/cos 东西并没有减慢应用的速度

    更多关于您尝试实现的实际效果的信息将真正有助于提高性能。

    图片在屏幕上有多大?

    【讨论】:

      【解决方案2】:

      CALayer 旋转是硬件加速的,2D 和 3D 转换非常相似,不会发生重绘,无需转到 opengl,无需缓存。

      Shark 会有所帮助,但您需要知道自己在寻找什么,并且您寻找的不是提高当前代码的性能,而是完全删除您的代码。

      听起来您过于频繁地查看自己的代码,目的是为了改变每一层的角度。当您让 CA 完成工作时,您就赢了。

      所以这里的策略是想办法让 CA 完成这项工作,并且每秒回电不到 50 次。

      CAAnimationGroup 包含几个 CAPropertyAnimation 用于您的每个层并设置,例如,一次动画一秒?

      一旦你把它交给 CA,CA 就会在自己的线程中播放它。

      【讨论】:

        【解决方案3】:

        我的建议是使用 OpenGL ES。


        尽管 Core Animation 比“UITransformations”快一点,但您面临的问题是一个经典问题:您正在尝试创建基于帧到帧的动作,其中有很多“虚拟”精灵漂浮在周围。这不是 UIKit 的用途。尤其是你想要做的动画。旋转需要三角函数来计算像素插值。这是一个相当昂贵的过程。

        除非对动画的强度,同时动画对象的数量,以及重新计算新变换的频率有明确的限制,此时我给你的唯一建议是OpenGL ES.

        到目前为止,我对 iPhone 的体验非常相似。每次我们为应用程序榨汁时,当前的平台都无法处理它。我们最终使用了 OpenGL ES,值得学习。 表现令人难以置信

        对于“坏消息”我深表歉意,但我强烈建议不要将 UIKit 和 Core Animation 用于基于帧到帧的应用程序

        【讨论】:

        • 基本上:我可以在 UIScrollView 中放置“OpenGL ES 视图”吗?那会很酷。
        • 恐怕不行。不管是不是一直都是OpenGL。我知道这听起来有点令人沮丧或失望。但请放心,经过 20 天的学习,您将创建一个性能高于预期的 OpenGL ES 应用程序。
        • 我不认为 OpenGL 很适合这里。使用 CALayers 可以获得良好的性能;例如,您只需要谨慎对待您提交的交易数量。
        • 用户“Thanks”说:“其中 5 个视图很好,但 12 个的性能很差。”。交易数量似乎是瓶颈。
        【解决方案4】:

        听起来你在不断地重绘你的观点。我确信有一种方法可以禁用它,并且只在动画结束时重绘。

        【讨论】:

        • 我同意。这或多或少是我的观点。如果用户“谢谢”不需要基于帧到帧的重新计算转换,他应该是金子。恐怕我认为他超越了这种简单性,并试图创建一个更活跃的应用程序。
        • 好吧,当视图旋转(动画)时,用户必须看到变化,否则它不会是“真正的”动画;)......事情只会从状态 A 变为 B ,但不是“顺利”。但是,对于测试:如何关闭发生帧到帧重新计算的情况?
        • 关闭动画:[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];或 animation.duration=0.f;
        • 没有办法缓存视图并旋转/缩放缓存的图像吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        相关资源
        最近更新 更多