UIView animateWithDuration:降低动画帧速率



我在游戏中使用CADisplayLink以每秒60次的速度使用EAGLView方法绘制帧。

当我调用UIView animateWithDuration:时,帧速率正好下降到一半,在动画的持续时间内从60帧/秒下降到30帧/秒。动画结束后,fps会立即回升到60。

我还尝试使用NSTimer动画方法代替CADisplayLink,但仍然得到了相同的结果。

当我在扬声器图标逐渐消失的情况下按下音量按钮时,也会发生同样的行为,所以它可能正在使用animateWithDuration。由于我希望能够在我的应用程序中顺利处理扬声器图标,这意味着我不能只是重写动画代码来使用animateWithDuration以外的其他方法,而是需要找到一个与之配合的解决方案。

我知道有一个选项可以减慢模拟器上调试的动画速度,但我在设备上遇到了这种情况,并且没有启用这样的选项。我还尝试为animateWithDuration使用各种选项,如线性选项和用户交互,但都没有改进。

我也知道我可以设计一个引擎,它仍然可以在变化很大的帧速率下工作。然而,这并不是这个问题的理想解决方案,因为游戏需要高fps。

以前有人见过或解决过这个问题吗?

解决方案是在CADisplayLink回调期间制作自己的动画和blit。

1) 对于音量问题,在角落里放一个小音量图标,或者如果用户采取了一些预定义的触摸操作,就显示它,并给他们触摸控制。通过该输入,您可以使用AVAudioPlayer来改变音量,并完全避免系统控制。你甚至可以确定用户按下了音量按钮,并弹出一些提示,说按你的方式操作。这将使您远离系统中发生的任何动画。

2) 当你有一个想要做的动画时,好吧,在代码中创建一系列图像(然后或之前),displayLink中每隔这么多回调就会将图像闪电式地显示到屏幕上。

这里有一个旧线程描述了类似的帧速率下降。在这种情况下,问题的原因是添加了两个或多个半透明精灵,但我想,任何时候你试图将几个层合成在一起,你都可能做了足够的工作来降低帧速率,而animateWithDuration很可能正是这样做的。

使用OpenGL或CoreAnimation。它们不兼容。

要测试这一点,请删除任何UIView动画,帧速率将是您所期望的。添加回UIView动画,它将降至每秒30帧。

你说:

当我调用UIView animateWithDuration时:帧速率正好下降到一半,在动画的持续时间内从60帧/秒下降到30帧/秒。动画结束后,fps立即回升至60

我不知道你为什么不接受我的答案,这正是当你将UIView动画与不使用UIView的CA动画相结合时会发生的事情。

最新更新