Резкая анимация iOS OpenGL ES 1.1 с использованием CADisplayLink (на некоторое время устраняет перезагрузку)

Я использую 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() почти не выполняются вычисления, связанные с игрой.

Я не понимаю, что происходит и почему новая перезагрузка всегда решает эту проблему на некоторое время.


person timthecoder    schedule 02.09.2012    source источник
comment
Если вы запустите Time Profiler для своего приложения, используя перевернутое дерево вызовов, увидите ли вы какие-либо очевидные горячие точки?   -  person Brad Larson    schedule 03.09.2012
comment
@ Брэд-Ларсон, я запустил Time Profiler с перевернутым деревом вызовов и не вижу ничего похожего на точку доступа.   -  person timthecoder    schedule 03.09.2012


Ответы (1)


Нашел проблему! Я использую метку времени из CADisplayLink для расчета времени между кадрами. временная метка является двойной, но я (неправильно) присвоил ее поплавку. Это привело к потере точности и неправильному расчету времени кадра. timestamp увеличивается с момента, когда пользователь перезагрузил устройство, и в конечном итоге становится настолько большим, что должен быть двойным, чтобы его можно было использовать для точного расчета времени между кадрами.

person timthecoder    schedule 15.09.2012