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
@Brad-Larson, пуснах Time Profiler с обърнато дърво на повикванията и не виждам нищо, което да ми прилича на гореща точка.   -  person timthecoder    schedule 03.09.2012


Отговори (1)


Открих проблема! Използвам клеймо за време от CADisplayLink, за да изчисля времето между кадрите. timestamp е двойно, но аз (неправилно) го присвоих на float. Това доведе до загуба на прецизност и до неправилно изчисляване на времето на кадрите. timestamp нараства от момента, в който потребителят е рестартирал устройството, и в крайна сметка става толкова голям, че трябва да бъде двойно, за да се използва за точно изчисляване на времето между кадрите.

person timthecoder    schedule 15.09.2012