4

ゲームを作成していますが、パフォーマンスを向上させるために、ゲーム ロジック コードとレンダリング コードを別のスレッドで実行したいと考えています。しかし、私の人生ではCADisplayLink、生成されたスレッドで a を実行する方法がわかりません。現在NSThread、マルチスレッドに使用しています。について読んだことNSOperationQueがありますが、よくわかりません。誰かが私を正しい方向に向けることができますか? これは私が現在使用しているコードで、-logicLoop両方-animationLoopとも別のスレッドで実行されているため、別の実行ループが発生し、CADisplayLinks が別のスレッドにあると考えました。

-(void)logicLoop {
    NSLog(@"adding");
    logicTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateModel)];
    logicTimer.frameInterval = kFrameInterval;
    [logicTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

-(void)animationLoop {
    NSLog(@"animation");
    animationTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(renderScene)];
    animationTimer.frameInterval = kFrameInterval;
    [animationTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

何か案は?

これには を使用する必要がありNSOperationQueますか? もしそうなら、どうすればいいですか?私が本当に必要としているのは、ゲーム ループとアニメーション ループを別々のスレッドで実行する効率的な方法です。これにより、互いに速度が低下せず、ゲーム プレイがよりスムーズに表示されます。

ありがとうございました!

4

1 に答える 1

7

表示リンクを実行するには、実行する実行ループが必要です。スレッドNSThreadを生成し、セレクターを呼び出し、セレクターが完了したら終了するだけです。このセレクターが次に行うべきことは次のとおりです。

- (void)threadSelector
{
    // initialize CADisplayLink
    logicTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateModel)];
    logicTimer.frameInterval = kFrameInterval;
    [logicTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    // run the loop - this never returns
    [[NSRunLoop currentRunLoop] run];
}
于 2012-08-18T05:54:41.270 に答える