核心动画和视图旋转表现不佳:如何改进?

时间:2009-05-25 12:41:06

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

当我通过触摸图标几秒钟进入主屏幕自定义模式时,我有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东西。我真的只旋转2D而没有别的。它们是简单的UIImageViews,但它是一个自定义类,可以自己完成这个旋转动画。

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

我是否更愿意更改图层或视图的变换?哪个更快?

4 个答案:

答案 0 :(得分:2)

  1. 鲨鱼。你必须知道继续进展的速度有多慢。

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

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

  4. 尝试关闭动画,只是为了确认你的回调是否按预期工作(setDisableActions:on CATransaction)。当你把它们关掉时,你是否看到同样的事情在鲨鱼身上变慢?

  5. 如果您在滚动视图中执行此操作,则可能还有其他问题。你需要处理开/关屏幕等事情。

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

  7. 有关您尝试实现的实际效果的更多信息确实有助于提高效果。

    图像在屏幕上有多大?

答案 1 :(得分:1)

我的建议是去OpenGL ES。


虽然核心动画比“UIT变换”更快,但你面临的问题是经典问题:你试图创建基于帧的动作,其中有许多“虚拟”精灵浮动。这不是UIKit用于的意思。特别是你想要做的动画。旋转需要三角法才能计算像素插值。这是一个非常昂贵的程序。

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

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

我很抱歉“坏消息”,但我强烈建议不要将UIKit和Core Animation用于基于帧的应用

答案 2 :(得分:1)

CALayer旋转是硬件加速的,2D和3D变换非常相似,不会重绘,不需要去opengl,也不需要缓存。

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

听起来你经常会经历自己的代码,以改变每一层的角度。当你让CA完成工作时,你就赢了。

因此,这里的策略是找到让CA完成工作的方法,并且每秒回拨的次数少于50次。

每个图层包含少量CAAnimationGroup的{​​{1}}如何设置,例如,一次设置一秒动画?

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

答案 3 :(得分:0)

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