UIView animateWithDuration:减慢动画帧速率

时间:2012-08-02 08:36:57

标签: objective-c ios animation uiview nstimer

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

当我呼叫UIView animateWithDuration:时,帧速率下降到正好一半,在动画持续时间内从60到30 fps。一旦动画结束,fps立即上升到60。

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

当扬声器图标淡出时按音量按钮时会发生相同的行为,因此它可能正在使用animateWithDuration。因为我希望能够在我的应用程序中顺畅地处理扬声器图标,这意味着我不能只重写我的动画代码以使用除animateWithDuration之外的其他方法,但需要找到一个可以使用的解决方案它

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

我也知道我可以设计一个仍然能够以不同的帧速率工作的引擎。然而,这不是解决这个问题的理想方法,因为高fps对于游戏来说是理想的。

有人看过这个问题还是之前解决过了?

3 个答案:

答案 0 :(得分:1)

解决方法是在CADisplayLink回调期间进行自己的动画和blit。

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

2)当你想要做一个动画时,好吧,用代码创建一系列图像(当时或之前),并且displayLink中的每一个回调都会将图像blit到屏幕上。

答案 1 :(得分:0)

这是an old thread that describes similar drops in frame rate。在这种情况下,问题的原因是添加了两个或更多半透明精灵,但我猜你每次尝试将几个图层组合在一起时,你可能会做足够的工作来降低帧率,{{1很可能就是那种事情。

答案 2 :(得分:-1)

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

要测试此删除任何UIView动画,帧速率将是您所期望的。添加回UIView动画,它将降至30fps。

你说:

  

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

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