线程中的CADisplayLink

Joh*_*ett 3 iphone multithreading objective-c

我正在制作游戏,我想在不同的线程上运行游戏逻辑代码和渲染代码,以期提高性能.但是对于我的生活,我无法弄清楚如何CADisplayLink在一个衍生的线程中运行.现在我正在使用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];
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

我应该使用NSOperationQue这个吗?如果是这样,我该怎么办呢?我真正需要的是一种有效的方法来在不同的线程上运行游戏循环和动画循环,这样它们就不会相互减慢速度,游戏玩法会显得更加平滑.

谢谢!

Jul*_*ien 6

要运行显示链接,需要运行循环.一切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];
}
Run Code Online (Sandbox Code Playgroud)