0

別のスレッド (2 から 5) で 12 fps で 2D アニメーションを実行しています。
「performSelector:withObject:afterDelay」によって指定された時間に指定された場所に各スレッドが画像を表示します。1
つのアニメーションでは問題なく動作しますが、2 つ以上のアニメーションを同時に実行するスレッドが 2 つ以上になると、アニメーションが著しく遅くなります。

NSThread は、(afterDelay で) 指定されたよりもはるかに多くの時間がかかることが判明しました。

performSelector:withObject:afterDelay

2 つ以上のスレッドが同時に「performSelector」を呼び出している場合、スレッドごとに毎秒約 12 回。

performSelector によってキューに入れられたメッセージをより速く取得するように NSThread を構成できるかどうか疑問に思います。
また、何がメッセージの受信を遅らせているのか疑問に思っています。スレッドの切り替えが遅いかも?

ありがとうございました

以下は、私が使用する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");
}
4

1 に答える 1

0

ええと、答えは簡単です。マルチスレッドではマルチコア機能を利用できません。これは、1 つのプロセッサのみがすべてのスレッドで動作することを意味します。したがって、1 つのアニメーションをロードしていてスレッドが 1 つしかない場合、スレッドの切り替えはありません。2 つ以上のアニメーションがある場合、プロセッサはそれらを切り替えています。これにより、実行時間が大幅に長くなります。アニメーション付きのグラフでも同じ状況があります。通常、1 秒で実行される 1 つのアニメーションと、通常 2 秒で実行されるもう 1 つのアニメーションがある場合、両方を同時にロードすると、結果の時間は両方で約 3 秒になります。

于 2011-02-07T08:52:19.683 に答える