0

当通过触摸图标几秒钟进入主屏幕自定义模式时,我有 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 吗?

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

4

4 回答 4

2
  1. 鲨鱼吧。你必须知道到底什么是缓慢的继续。

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

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

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

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

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

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

屏幕上的图像有多大?

于 2009-05-28T00:51:02.507 回答
1

我的建议是使用 OpenGL ES。


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

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

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

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

于 2009-05-25T12:55:39.797 回答
1

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

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

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

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

CAAnimationGroup为每个图层包含几个CAPropertyAnimation并设置,例如,一次一秒钟的动画怎么样?

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

于 2009-06-07T10:49:05.107 回答
0

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

于 2009-05-25T13:02:01.717 回答