首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程中的CADisplayLink

线程中的CADisplayLink
EN

Stack Overflow用户
提问于 2012-08-18 12:26:15
回答 1查看 3.5K关注 0票数 4

我正在做一个游戏,我想在不同的线程上运行游戏逻辑代码和渲染代码,希望能提高性能。但就我而言,我不知道如何在派生的线程中运行CADisplayLink。现在,我正在使用NSThread进行多线程。我读过关于NSOperationQue的文章,但我对它并不是很了解。有人能给我指个方向吗?这是我现在使用的代码,-logicLoop-animationLoop都是在不同的线程上运行的,所以我认为它们会得到不同的run循环,并且CADisplayLinks会在不同的线程上。

代码语言:javascript
复制
-(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吗?如果是这样,我该怎么做呢?我真正需要的是一种高效的方式,在不同的线程上运行游戏循环和动画循环,这样它们就不会彼此减慢,游戏看起来会流畅得多。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-18 13:54:41

要运行显示链接,您需要运行一个run循环。NSThread所做的就是生成一个线程,调用选择器,并在选择器完成后退出。下面是这个选择器应该做的事情:

代码语言:javascript
复制
- (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];
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12015833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档