好了,所以我一直在做一些研究,現在我對多個基本的瞭解閱讀SpriteKit。我決定在這裏總結一下,以便其他對這個概念瞭解甚少或根本不瞭解的人可以開始。
基本概述。 CPU核心和多線程
多線程是一種讓CPU在多個進程同時工作的方式。每個進程都有自己的線程。現在,這使我們可以執行多任務。比如同時上網和看電影。 如果這些進程將在同一個線程上運行。重新加載網頁時,電影會凍結,直到重新加載完成。
線程和CPU內核是兩個不同的東西。 CPU核心是進行計算的硬件,而線程則更像是一條向CPU提供計算事物的管道。所以從上面的例子中會有2個管道。一個來自Web瀏覽器,另一個來自向CPU提供信息進行計算的電影播放器。然後CPU將在這兩個管道之間交替執行兩者的計算,給予他們同樣的關注。這並不意味着使用兩個線程可以提高CPU的性能。但它允許兩個應用程序共享CPU的資源。
多線程和SpriteKit
如果多線程只能讓我們共享CPU和運行在同一時間多個計算。它如何提高SpriteKit的性能?
好吧。如果你的設備只有1個CPU核心。我們所能做的就是將任務分成不同的優先級,以確保我們的主線程得到最多的關注。而且我們想讓主線程最關注(從CPU)來保持FPS高,因爲這是我們渲染週期使用的線程。所以如果我們有一些不需要馬上完成的計算,我們可以在其他優先級較低的線程上運行它們。
但是!如果您的設備有2個CPU核心,就像大多數IOS設備一樣。你真的可以提高你的遊戲性能。如前所述,我們的渲染週期運行在我們的主線程上。你希望這個線程有足夠的資源在其渲染下一幀的時間之前完成所有的計算。 (或者你會鬆動幀率)。主線程僅連接到ONE核心。所以,當你以幾乎0 FPS的100%CPU使用率達到峯值時。您實際上只使用設備上可用的一半CPU資源。
但是對於多線程,您可以將主線程加載一些,然後將其放在第二個內核上。在一個測試項目中,我設法以60 fps獲得了150%的CPU使用率!奇怪的是有150%的CPU使用率,但它實際上顯示了2核心的組合使用。如果你有3個核心,最大值將是300%。
我知道這聽起來太好了,而且確實是這樣,正如你將在下一節中看到的那樣。
侷限性和多線程
缺點它的偉大能夠利用可從第二核心的資源。但是,有一些計算必須在主線程上運行。 如果我們看一下渲染週期。所有淡藍色區域必須在主線程上運行。評估行爲,模擬物理,約束和渲染。而這些往往是一個項目中最重的計算,並且很快就會成爲性能的瓶頸。儘管如此,根據項目結構的不同,還有很多其他的計算方法,如測量距離,更新位置,人工智能決策等,都可以放在第二個核心上,以承擔主線程的負擔。
如何在我的項目中實現多線程。
在SpriteKit中執行多線程最簡單的方法是使用名爲Grand Central Dispatch(GCD)的東西。這個API是開箱即用的,不需要在項目中包含任何東西。 GCD正在以安全,高效的方式管理你的線程。
GDC入門非常簡單。下面的代碼會在另一個線程上運行myFunction。
run(SKAction.run(myFunction, queue: DispatchQueue.global(qos: .background)))
func myFunction(){
// Do some work here
}
您也可以直接在函數內部定義一個dispatchQueue。或者代碼中的任何地方。您在調度塊內的所有工作將在GDC選擇的適當線程上異步執行。
func myFunction(){
DispatchQueue.global(qos: .background).async {
//Do some work here...
}
}
****待續***
我會建議在問這個https://forums.developer.apple.com/welcome問題,因爲它是一個開放式的問題,而不是真的適合SO。就性能而言,Apple建議您刪除當前屏幕上未使用的所有節點。至於隊列/多線程,請查看https://developer.apple.com/documentation/spritekit/skaction/1417799-run,也許問一個具體如何工作的問題。 – Knight0fDragon
@ Knight0fDragon你能檢查我的答案,以確保我沒有任何明顯的虛假信息。 – Fluidity
有一點要記住,你不應該在後臺線程上更新你的UI。如前所述,多線程對於可以等待的任務非常有用(預加載資源,從互聯網獲取圖像......)我不知道多線程如何幫助解決您的問題,因爲您正在更新每幀的.alpha屬性。聽起來不同的線程在這種情況下是無用的。 – Whirlwind