1

我正在使用 OpenGL ES 1.1 和 CADisplayLink 为 3d 场景设置动画。如果 iOS 设备最近重新启动,动画是平滑的,并且两次 displayLink.timestamp 调用之间的时间增量相当均匀。但是在使用 iOS 设备几个小时或几天后,我的应用程序有时会运行几次,动画会变得不稳定,时间增量会上升,然后重置为较低的值,然后再次上升。

像这样:

2012-09-01 23:42:58.770 [2678:707] dt= 0.021139

2012-09-01 23:42:58.787 [2678:707] dt= 0.022183

2012-09-01 23:42:58.804 [2678:707] dt= 0.023223

2012-09-01 23:42:58.820 [2678:707] dt= 0.024270

2012-09-01 23:42:58.837 [2678:707] dt= 0.009679

2012-09-01 23:42:58.853 [2678:707] dt= 0.010750

2012-09-01 23:42:58.870 [2678:707] dt= 0.011766

2012-09-01 23:42:58.887 [2678:707] dt= 0.012806

2012-09-01 23:42:58.903 [2678:707] dt= 0.013847

2012-09-01 23:42:58.920 [2678:707] dt= 0.014890

2012-09-01 23:42:58.937 [2678:707] dt= 0.015933

2012-09-01 23:42:58.953 [2678:707] dt= 0.016976

2012-09-01 23:42:58.970 [2678:707] dt= 0.018011

2012-09-01 23:42:58.987 [2678:707] dt= 0.019055

2012-09-01 23:42:59.003 [2678:707] dt= 0.020097

2012-09-01 23:42:59.020 [2678:707] dt= 0.021143

2012-09-01 23:42:59.037 [2678:707] dt= 0.022181

2012-09-01 23:42:59.054 [2678:707] dt= 0.023222

2012-09-01 23:42:59.071 [2678:707] dt= 0.024288

2012-09-01 23:42:59.087 [2678:707] dt= 0.009624

2012-09-01 23:42:59.103 [2678:707] dt= 0.010728

2012-09-01 23:42:59.121 [2678:707] dt= 0.011763

2012-09-01 23:42:59.137 [2678:707] dt= 0.012808

2012-09-01 23:42:59.153 [2678:707] dt= 0.013847

2012-09-01 23:42:59.170 [2678:707] dt= 0.014891

2012-09-01 23:42:59.187 [2678:707] dt= 0.016002

2012-09-01 23:42:59.203 [2678:707] dt= 0.016979

2012-09-01 23:42:59.220 [2678:707] dt= 0.018016

2012-09-01 23:42:59.237 [2678:707] dt= 0.019042

2012-09-01 23:42:59.253 [2678:707] dt= 0.020099

2012-09-01 23:42:59.270 [2678:707] dt= 0.021138

2012-09-01 23:42:59.287 [2678:707] dt= 0.022185

2012-09-01 23:42:59.304 [2678:707] dt= 0.023222

2012-09-01 23:42:59.320 [2678:707] dt= 0.024265

2012-09-01 23:42:59.337 [2678:707] dt= 0.009681

2012-09-01 23:42:59.354 [2678:707] dt= 0.010736

然后,如果重新启动 iOS 设备,动画又会变得流畅。

当 UpdateAnimation() 函数中几乎没有与游戏相关的计算时,这个问题甚至出现在我的菜单屏幕上。

我不明白发生了什么以及为什么重新启动总能在一段时间内解决这个问题。

4

1 回答 1

4

发现问题了!我正在使用 CADisplayLink 中的时间戳来计算帧之间的时间。时间戳是双精度的,但我(错误地)将它分配给浮点数。这导致精度损失,并导致不正确的帧时间计算。时间戳从用户重新启动设备时开始增长,最终变得如此之大,它需要是双精度才能用于准确计算帧之间的时间。

于 2012-09-15T03:35:28.147 回答