NSThreading的速度

时间:2010-09-06 15:06:27

标签: iphone objective-c cocoa nsthread

我正在开发游戏模拟游戏,并想加快匹配模拟位。在给定日期,可能有50多个需要模拟的匹配。目前我遍历每个并告诉他们模拟自己,但这可能需要永远。我希望

1)覆盖“忙碌”屏幕

2)为每个

启动一个帖子

3)当最后一个线程退出时,删除叠加层。

现在我可以做1& 2,但我无法弄清楚如何判断最后一个线程何时完成,因为我分离的最后一个线程可能不是最后一个线程完成的。最好的方法是什么?

此外,通常使用线程,以便在用户执行其他操作时可以在后台完成工作,我使用它略有不同。我的应用程序是一个核心数据应用程序,我想避免用户在我模拟匹配时以其他方式触摸商店。所以我大部分时间都想要单线程,但是因为sim引擎需要多长时间才能进行多线程处理。如果有人对这种方法有其他想法,我就会开放。

罗布

5 个答案:

答案 0 :(得分:2)

可能你想使用NSOperation而不是50个线程 - 在iPhone上50个线程并不健康,而且NSOperations更容易启动。可能是你试图一次运行50来杀死性能(这是我的猜测)。 NSOperation专门针对这个问题而设计。加上它易于编码。

我对NSOperation的唯一问题是他们没有一种标准的方法来告诉来电者他们已经完成了。

您可以定期轮询NSOperationQueue - 当其计数为0时,没有剩余。您还可以使每个操作递增一些计数器 - 当计数为50时,您就完成了。或者每个操作都可以在主线程上使用performSelectorOnMainThread发布通知。

即使是单个核心,您也应该看到性能提升 - 很多时候主线程被阻止等待用户输入/图形绘制等。多核电话和iPad可能会在一年内出现(总猜测 - 但它们即将到来)。

另外,请务必使用Instruments查看操作。可能是您可以将计算速度提高2倍甚至10倍!

答案 1 :(得分:1)

你是一个核心,因此线程可能无济于事,而开销可能会减慢速度。

要做的第一件事是使用Instruments来分析您的代码并查看可以加速的内容。完成后,您可以查看瓶颈的一些特定优化。

一个简单的方法(如果你可以使用GCD)是dispatch_apply(),它可以让你循环你的匹配,自动以最佳方式为你的硬件线程化它们,并且在完成之前不会返回。

答案 2 :(得分:0)

最直接的解决方案是让所有线程'performSelectorOnMainThread'到一个特定的方法,在计数器退出之前递减计数器。并且当该计数器递减到零时,让该方法移除覆盖屏幕。

同时模拟所有匹配可能不一定能提高性能。

答案 3 :(得分:0)

您可以从@drowntoge获取特定问题的解决方案,但一般来说,我想为您提供有关多线程的建议:

1 /格雷厄姆说,这并不总能加速你的计划。你的iPhone只有单核心。

2 /如果您的程序有一些需要时间的大型IO,数据库或网络进程,那么您可能会考虑多线程,因为现在数据处理不会花费所有时间,它需要等待加载数据。在这种情况下,多线程将显着提高您的性能。但是你仍然需要小心,因为线程切换有开销。

也许你只需要1个线程进行IO处理,然后有一个缓存层来共享图像/数据。然后,您只需要主线程循环并进行模拟

3 /如果您希望50个模拟似乎同时发生以供用户观看,则还需要多线程:)

答案 4 :(得分:0)

如果使用线程,您将无法知道CPU执行任务的顺序,并且您可能会消耗大量线程调度资源。最好使用NSOperationQueue并使用performSelectorOnMainThread指示每个任务的完成。已经提到了递减计数器,这对于显示进度条可能是有用的。但是你也可以维护一个包含50个忙标志的数组并在完成时清除它们,如果用时间戳标记完成,这可能有助于调试任何特定任务是否缓慢或卡住。