瞭解 Worker 與並行

適用於桌面平台的 Flash Player 11.4 以及更新的版本,Adobe AIR 13.4 以及更新的版本

當應用程式未使用 Worker 時,應用程式的程式碼會在單一線性區塊中執行,該區塊執行的步驟稱為「執行緒」。執行緒會執行開發人員所撰寫的程式碼,也會執行屬於執行階段一部分、大多數的程式碼,特別是會在顯示物件的屬性變更時更新畫面的程式碼。雖然程式碼是在區塊中撰寫為方法和類別,但是在執行階段,程式碼會一次執行一行,就好像它是經過一連串冗長的步驟撰寫而成的。請將這個假設性範例視為應用程式會執行的步驟:

  1. 進入影格:執行階段會呼叫任何 enterFrame 事件處理常式並逐一執行它們的程式碼

  2. 滑鼠事件:使用者移動滑鼠,並且執行階段會在出現各種變換影像和滑出事件時呼叫任何滑鼠事件處理常式

  3. 載入完成事件:從 URL 載入 XML 檔案的要求會隨著載入的檔案資料一起傳回。事件處理常式已呼叫,並且會執行其步驟,讀取 XML 內容並從 XML 資料建立一組物件。

  4. 滑鼠事件:滑鼠再次移動,因此,執行階段會呼叫相關的滑鼠事件處理常式

  5. 顯示:已沒有事件正在等候,因此,執行階段會根據對顯示物件所做的任何變更來更新畫面

  6. 進入影格:再次開始循環

如範例所述,假設性步驟 1-5 會在一個稱為影格的時間區塊內依序執行。由於這些步驟是在單一執行緒中依序執行,因此,執行階段無法中斷程序的一個步驟來執行另一個步驟。以每秒 30 格的影格速率來說,執行階段只有不到 1/30 秒的時間來執行所有這些作業。在許多情況中,那已讓程式碼有足夠的時間來執行,而執行階段在剩餘時間裡也只是等待而已。不過,請假設步驟 3 中載入的 XML 資料是非常大、深度巢狀的 XML 結構。隨著程式碼循環查看 XML 並建立物件,可能會花費 1/30 秒以上的時間來執行該工作。在此情況下,後面的步驟 (回應滑鼠並重繪畫面) 無法如預期般儘快進行。這會導致畫面出現凍結及斷續的情形,因為畫面的重繪速度不夠快,無法回應使用者移動滑鼠的動作。

如果所有程式碼都在相同的執行緒中執行,只有一個方法可以避免偶爾出現斷續及凍結的情形,那就是不要執行需長時間執行的作業,例如循環查看大量資料。ActionScript Worker 提供其他解決方案。使用 Worker,您就可以在個別 Worker 中執行需長時間執行的程式碼。每個 Worker 會以個別執行緒執行,因此,背景 Worker 會在專屬的執行緒中執行需長時間執行的作業。如此,就會釋放主要 Worker 的執行緒,以重繪每個影格的畫面,而不會遭到其他工作封鎖。

這種同時執行多個程式碼作業的能力,又稱為「並行」。當背景 Worker 完成工作或達到「進度」時,您就可以傳送主要 Worker 通知和資料。透過這種方式,您可以撰寫用來執行複雜或費時作業的程式碼,而又能避免讓使用者遇到畫面凍結的情形。

Worker 很實用,因為它降低了影格速率因主要顯示執行緒遭到其他程式碼封鎖而丟棄的可能性。不過,Worker 需要額外的系統記憶體和 CPU 使用量,這會讓整體應用程式效能付出不少代價。由於每個 Worker 都會使用專屬的執行階段虛擬機器實體,因此,即使是簡單的 Worker,工作負荷也會很大。在使用 Worker 時,請在所有目標平台間測試您的程式碼,以確保系統上的需求不會太大。Adobe 建議在一般情況下,不要使用超過一個或兩個背景 Worker。