我使用CADisplayLink
在游戏中使用EAGLView
方法以每秒60次的速度绘制帧。
当我呼叫UIView
animateWithDuration:
时,帧速率下降到正好一半,在动画持续时间内从60到30 fps。一旦动画结束,fps立即上升到60。
我也尝试使用NSTimer
动画方法代替CADisplayLink
,但仍然得到相同的结果。
当扬声器图标淡出时按音量按钮时会发生相同的行为,因此它可能正在使用animateWithDuration
。因为我希望能够在我的应用程序中顺畅地处理扬声器图标,这意味着我不能只重写我的动画代码以使用除animateWithDuration
之外的其他方法,但需要找到一个可以使用的解决方案它
我知道有一个选项可以减慢模拟器上调试的动画速度,但是,我在设备上遇到这种情况,并且没有启用这样的选项。我还尝试使用animateWithDuration
的各种选项,例如线性和用户交互,但没有一个有改进。
我也知道我可以设计一个仍然能够以不同的帧速率工作的引擎。然而,这不是解决这个问题的理想方法,因为高fps对于游戏来说是理想的。
有人看过这个问题还是之前解决过了?
答案 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动画结合时会发生的事情。