(iphone), который является более точным по времени: executeSelector: afterDelay vs NSTimer - PullRequest
1 голос
/ 07 февраля 2011

Я делаю анимацию с executeSelector: withObject: afterDelay со скоростью 24 кадра в секунду.
(причина в том, что UIImageView не поддерживает разные интервалы между изображениями)
Когда я запускаю несколько анимаций одновременно, создается впечатление, что сообщение, помещенное в очередь executeselector, занимает много времени для получения.

Мне интересно, NSTimer или еще один будет лучшим выбором.

Спасибо

  • EDIT

Я ничего не делаю, кроме запуска анимации.
Селектор, который я использую, занимает 0,0003 времени ожидания (почти без времени)
Но когда я измеряю время между вызовом "executeSelector" и временем, когда фактически вызывается селектор, время фактически больше, чем я указал в "afterDelay" или "scheduleTimerWithDuration"

Я уже посмотрел на инструменты, но не мог понять, что является причиной задержки.
Я только что видел активность, связанную с потоками (я думаю, что приостановка / возобновление потоков).
Может быть, мой приведенный ниже код ThreadMain занимает много времени?

- (void) myThreadMain
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // Add your sources or timers to the run loop and do any other setup.                                                                                                                                                                                                     
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

    do
    {
        // Start the run loop but return after each source is handled.                                                                                                                                                                                                        
        SInt32    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);

    }
    while (self.isNeedToExit == false);

    [pool release];

    SYSLOG(LOG_DEBUG, "thread exiting");
}

Ответы [ 2 ]

5 голосов
/ 07 февраля 2011

Apple говорит:

Этот метод [performSelector:withObject:afterDelay:] устанавливает таймер для выполнения сообщения aSelector в цикле выполнения текущего потока.

Так что они обасделать то же самое.Ваш виновник в другом месте.

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

2 голосов
/ 07 февраля 2011

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

...