13

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

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

我也尝试使用NSTimer动画方法而不是CADisplayLink并且仍然得到相同的结果。

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

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

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

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

4

3 回答 3

1

对此的解决方案是在 CADisplayLink 回调期间执行您自己的动画和 blit。

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

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

于 2012-08-08T17:59:38.900 回答
0

这是一个旧线程,描述了类似的帧速率下降。在这种情况下,问题的原因是添加了两个或更多半透明精灵,但我猜任何时候你尝试将多个图层合成在一起,你可能会做足够的工作来降低帧速率,而且animateWithDuration很可能确实如此正是那种东西。

于 2012-08-08T15:59:50.930 回答
-1

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

为了测试这个删除任何 UIView 动画,帧速率将是你所期望的。添加回 UIView 动画,它会下降到 30fps。

你说:

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

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

于 2012-08-09T03:49:55.123 回答