当我通过触摸图标几秒钟进入主屏幕自定义模式时,我有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?
我是否更愿意更改图层或视图的变换?哪个更快?
答案 0 :(得分:2)
鲨鱼。你必须知道继续进展的速度有多慢。
尝试将更新间隔从0.02秒增加到0.1秒;是可以接受的吗?
如果所有图片一起旋转,请在超级层上使用sublayerTransform
,而不是逐个转换
尝试关闭动画,只是为了确认你的回调是否按预期工作(setDisableActions:on CATransaction)。当你把它们关掉时,你是否看到同样的事情在鲨鱼身上变慢?
如果您在滚动视图中执行此操作,则可能还有其他问题。你需要处理开/关屏幕等事情。
3D变换与核心动画AFAIK中的仿射速度相同。基本的sin / cos内容并没有减慢应用程序的速度
有关您尝试实现的实际效果的更多信息确实有助于提高效果。
图像在屏幕上有多大?
答案 1 :(得分:1)
虽然核心动画比“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)
这听起来像是在不断地重新绘制你的观点。我确信有一种方法可以禁用它,只在动画结束时重绘。