Таймер ведет себя по-разному на симуляторе и устройстве - PullRequest
2 голосов
/ 01 сентября 2010

Моя проблема, как показано ниже:

timer1 = [NSTimer scheduledTimerWithTimeInterval:1.0/5 target:self
         selector:@selector(Loop1) userInfo:nil repeats:YES];

timer2 = [NSTimer scheduledTimerWithTimeInterval:1.0/5 target:self 
         selector:@selector(Loop2) userInfo:nil repeats:YES];

timer3 = [NSTimer scheduledTimerWithTimeInterval:1.0/20 target:self 
         selector:@selector(Loop3) userInfo:nil repeats:YES];

timer4 = [NSTimer scheduledTimerWithTimeInterval:1.0/10 target:self 
         selector:@selector(Loop4) userInfo:nil repeats:YES];

timer5 = [NSTimer scheduledTimerWithTimeInterval:1.0/5 target:self 
         selector:@selector(Loop5) userInfo:nil repeats:YES];

Я использовал эти 5 таймеров для перемещения кадров на iPhone. Но timer3 и timer4 ведут себя по-разному на iPod и симуляторе. timer3 и timer4 медленнее на iPod, чем то, что я хочу реализовать, и отлично работает на симуляторе.

Подскажите, пожалуйста, в чем проблема?

Ответы [ 4 ]

1 голос
/ 01 сентября 2010

NSTimers не может запланировать запуск двух или более методов одновременно (особенно на устройстве iOS только с 1 процессорным ядром). Если первое задание таймера будет медленным, второе будет запоздалым.

В симуляторе первая задача может выполняться в 10 и более раз быстрее (из-за высокой производительности ЦП и памяти), делая вторую задачу гораздо менее запоздалой, и вы не замечаете, что она запоздала.

Либо выполняйте каждую задачу быстрее, либо наклоните таймеры, чтобы задачи не перекрывались. Или объедините то, что сделано внутри каждой задачи таймера, если эта задача происходит в некотором наименьшем общем множестве временных интервалов.

0 голосов
/ 01 сентября 2010

Вы не можете положиться на таймер, если вам требуется высокая точность. Это будет зависеть от загрузки устройства. Симулятор работает на Mac, поэтому вы получите более высокую точность. Но устройство менее менее мощное, чем Mac. Так что будет очевидная задержка.

Зачем вам нужны таймеры таким образом? Вы пытаетесь оживить что-то? В этом случае есть лучшие варианты. Специально посмотрите на анимацию UIView вместо таймера.

0 голосов
/ 01 сентября 2010

Согласно документам: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html

the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds

Ваши два проблемных таймера имеют длительность 1/10 и 1/20 секунды, а это точно 100 и 50миллисекунды.Вы флиртуете с лучшим временем, которое может выдержать NSTimer, и вам следует ожидать ненадежности.

0 голосов
/ 01 сентября 2010

Возможно, ваша проблема связана с производительностью.Проверьте с помощью Activity Monitor Tool и приложения, работающего на устройстве, не исчерпаны ли ресурсы устройства.

Я предполагаю, что вы просите устройство повторять три операции каждую 10-ю секундыи это может быть вне его возможностей в зависимости от операции.

Может быть, вы могли бы отбросить строки кода Loop3 и Loop4?

...