1

OpenGL ES 1.1 と CADisplayLink を使用して 3D シーンをアニメーション化しています。iOS デバイスがごく最近再起動された場合、アニメーションは滑らかで、2 つの 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 のタイムスタンプを使用して、フレーム間の時間を計算しています。タイムスタンプは double ですが、(誤って) float に割り当てました。これにより、精度が失われ、フレーム時間の計算が不正確になりました。タイムスタンプは、ユーザーがデバイスを再起動したときから増加し、最終的には非常に大きくなり、フレーム間の時間を正確に計算するために使用するために 2 倍にする必要があります。

于 2012-09-15T03:35:28.147 に答える