2010-09-06 33 views
0

我正在開發一款遊戲模擬器,並希望加快模擬比賽的速度。在給定的日期可能有50多場比賽需要模擬。目前我通過每個循環,並告訴他們模擬自己,但這可能需要永遠。我希望NSThreading的速度

1)疊加一個「忙」屏幕

2)啓動一個線程每個

3)當最後一個線程退出,取下覆蓋。

現在我可以做1 & 2,但我不知道如何判斷最後一個線程何時完成,因爲我分離的最後一個線程可能不是最後一個線程完成。什麼是最好的方式來做到這一點?

此外,通常使用線程,以便在用戶做其他事情時可以在後臺完成工作,我使用它稍有不同。我的應用程序是一款核心數據應用程序,我希望避免用戶在模擬比賽時以其他方式觸摸商店。所以我大部分時間都想單線程,但是由於sim引擎需要多長時間,因此需要多線程來處理這種情況。如果有人對這種方法有其他想法,我是開放的。

羅布

回答

2

可能你想使用NSOperation而不是50個線程 - 50個線程在iPhone上不健康,NSOperations更容易啓動。這可能是因爲您試圖一次運行50次而導致性能下降(這是我的猜測)。 NSOperation正是爲這個問題而設計的。加上其易於編碼。

我唯一的問題NSOperation是他們沒有一個標準的方式告訴調用者他們完成。

你可以定期輪詢NSOperationQueue - 當它的計數爲0時,沒有剩餘的。你也可以讓每個操作增加一些計數器 - 當計數爲50時,你就完成了。或者每個操作都可以在完成它的主線程上使用performSelectorOnMainThread發佈通知。

即使只有一個內核,您也應該看到性能的提升 - 主線程被阻塞等待用戶輸入/圖形繪製/等等的時間很多。 Plus多核手機和iPad可能會在一年之內(總猜測 - 但他們即將到來)。

另外請確保您使用儀器查看操作。這可能是你可以加快計算速度的2倍甚至10倍!

+1

您可以使用KVO來觀察操作隊列的'operationCount';不需要輪詢。請注意,該操作不會在主線程中出現,因此您可能需要從觀察者方法執行主線程執行,然後執行您的實際提取 - 新操作 - 從更改 - 字典和檢查它的方法。 – 2010-09-06 18:56:29

+0

您也可以觀察每個NSOperation的isFinished屬性 – sbooth 2010-09-07 04:57:55

+0

或者您可以使用通知讓主線程知道完成情況。 – 2012-04-13 20:32:06

1

你在一個單一的核心,所以線程可能不會有太大的幫助,並且開銷甚至可能放慢改革的步伐。

要做的第一件事就是使用Instruments來分析代碼並查看可以加快的步驟。一旦你完成了,你可以看一些瓶頸的特定優化。

一個簡單的方法(如果你可以使用GCD)是dispatch_apply(),它可以讓你遍歷你的匹配,自動以最好的方式對你的硬件進行線程化,並在所有完成之前不會返回。

+0

謝謝,好點,讓我試試。 – rob5408 2010-09-06 15:33:55

+0

如果處理與IO相關,線程可以提供幫助 – vodkhang 2010-09-06 15:58:08

0

最簡單的解決方案是將所有線程的「performSelectorOnMainThread」放到一個計數器遞減的特定方法中,然後退出。當方法遞減到零時,讓方法刪除覆蓋屏幕。

雖然同時模擬所有匹配可能不一定會提高性能。

+0

謝謝,讓我試試看。 – rob5408 2010-09-06 15:33:15

0

你可能會從@drowntoge您的具體問題的解決方案,但一般來說,我想給關於多線程的,你的建議是:

1 /它並不總是加快你的程序像格雷厄姆說。你的iPhone只有單核心。

2 /如果你的程序有一些大的IO,數據庫或網絡過程需要時間,那麼你可以考慮多線程,因爲現在數據處理並不需要所有的時間,它需要等待加載數據。在這種情況下,多線程將顯着提升您的性能。但是你仍然需要小心,因爲線程切換有開銷。

也許你只需要1個線程進行IO處理,然後有一個緩存層來共享圖像/數據。然後,你只需要在主線程循環,如果你想50模擬似乎在同一時間發生的用戶觀看進行模擬

3 /多線程還需要:)

0

如果您使用線程,您將不知道CPU執行任務的順序,並且您可能會消耗大量線程調度資源。最好使用NSOperationQueue並使用performSelectorOnMainThread發信號完成每個任務。遞減計數器已被提及,這對於顯示進度條可能是有用的。但是,您也可以維護一個包含50個忙標誌的數組,並在完成時清除它們,這可能有助於調試是否有任何特定任務緩慢或卡住,如果使用時間戳標記完成。