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 回答