Ускорьте передачу сообщений NSThread - PullRequest
0 голосов
/ 07 февраля 2011

Я запускаю 2d анимацию со скоростью 12 кадров в секунду в отдельных потоках (от 2 до 5).
Каждый поток отображает изображение в указанное время в указанном месте с помощью "executeSelector: withObject: afterDelay"
Работает нормально для 1анимации, но если у меня есть два или более потоков для одновременного запуска 2+ анимаций, анимация заметно замедляется.

Оказывается, что NSThread занимает намного больше времени, чем указано (в afterDelay)

performSelector:withObject:afterDelay

когда 2+ потока вызывают 'executeSelector' одновременно примерно 12 раз в секунду на поток.

Интересно, смогу ли я настроить NSThread для более быстрого получения сообщений, поставленных в очередь с помощью executeSelector.
Мне также интересно, что замедляет процесс приема сообщений.может быть, переключение потоков происходит медленно?

Спасибо

Ниже приведен код основного потока, который я использую.

- (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");
}

1 Ответ

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

Ну, мужик, ответ прост.Вы не получаете многоядерную функциональность через многопоточность.Это означает, что только один процессор работает со всеми вашими потоками.Таким образом, когда вы загружаете 1 анимацию и есть только 1 поток, переключатели потоков отсутствуют.Когда есть 2 или более анимаций, процессор переключается между ними.Что приводит к гораздо большему времени выполнения.У меня такая же ситуация с моими графиками с анимацией.Представляя, что у вас обычно есть 1 анимация, которая должна запускаться за 1 секунду, а другая анимация должна обычно выполняться за 2 секунды, тогда, когда вы загружаете их одновременно, время результата для обоих будет около 3 секунд.

...