编辑:
今天我使用了我的代码,并为后台线程任务提供了一些优于主线程任务的优势。本质上,一个线程处理数组中的偶数项,另一个线程处理奇数项。我给后台线程一个偶数的一半,它要么等于奇数的一半,要么比奇数的一半小一。此外,我将while(!collisionDone)
代码移到了后面一点,尽可能地保证它的线程安全。我NSLog
在其中放置了一个以检测条件在达到该点时是否为假,并且它没有触发一次。此外,仪器构建现在运行良好。这意味着问题是用 while 循环停止主线程。所以这意味着我现在的问题是:
我应该如何停止主线程以等待后台线程完成任务?也许演示如何使用NSLock
来实现该功能?
今天我添加了多线程以试图减少我的游戏延迟。我正在使用 NSTimer 来调用我的时间循环函数,如下所示:
[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(time:) userInfo: nil repeats: true];
然后,在那个函数中,我有:
//run collision using multithreading
collisionDone = false;
[self performSelectorInBackground:@selector(collideBackground:) withObject:objectToSend];
[self collideMain:objectToSend];
while (!collisionDone) {
//notdone
}
这个想法是我在一个线程上运行一组碰撞检查,在另一个线程上运行另一组。空的while循环是为了保证后台线程在执行函数之前已经完成。在此位之后,代码继续更新视图。
这一切运行良好,通常情况下,但是当我去 Instruments 检查我的 FPS 时,我发现游戏冻结了,它似乎在时间循环的第一次运行中冻结了某处。该应用程序在多线程之前在 Instruments 中运行良好,基本上工作相同,除了简单地使用[self collideBackground:objectToSend]
而不是将其发送到另一个线程。后台线程似乎没有完成或根本没有运行,所以 collisionDone 将始终为 false,因此应用程序将在无限循环中等待,直到我杀死它。
另外,我尝试用 替换该行[self collideBackground:arrayToSend];
,它又开始工作了。我尝试的另一件事是NSLog(@"called");
在最开始时viewWillAppear:
,它似乎又运行了一帧!?!?!?
我想知道为什么会发生这种情况以及如何解决它。我怀疑它与多线程无关,因为在单个线程上做所有事情都会修复它。