Unity 開發者常混淆「協程」與「多執行緒」。協程(IEnumerator + StartCoroutine)本質是單執行緒上的狀態機,透過 yield return 讓出控制權,無法利用多核心 CPU。真正的多執行緒(System.Threading.Thread)能將大量運算(路徑尋找、物理模擬、資料序列化)分派至背景執行緒,釋放主執行緒渲染畫面,顯著提升效能。
using System.Threading;
| 建構子 | 適用場景 | 參數說明 |
|---|---|---|
Thread(ThreadStart) | 無參數方法 | Action 無參委派 |
Thread(ParameterizedThreadStart) | 單一 object 參數 | Action<object> 委派,啟動時 Start(obj) |
Thread(ThreadStart, int maxStackSize) | 限制堆疊大小 | 位元組單位,0 為預設 |
Thread(ParameterizedThreadStart, int maxStackSize) | 帶參數且限制堆疊 | 同上 |
// 1. 無參數執行緒
void StartNoArg()
{
var t = new Thread(HeavyCalculation);
t.Start(); // 立即啟動
}
void HeavyCalculation()
{
// 大量數學運算、檔案 I/O、網路請求等
Debug.Log("背景執行緒完成計算");
}
// 2. 帶參數執行緒
void StartWithArg()
{
var t = new Thread(DataProcessor);
t.Start("PlayerData_2024"); // 只能傳單一 object
}
void DataProcessor(object data)
{
string key = (string)data;
Debug.Log($"處理資料:{key}");
}
Thread.Sleep(ms):讓出時間片,0 僅讓同優先級執行緒搶佔。Thread.Abort():已過時,強制終止易造成資源洩漏,改用 CancellationToken 協作式取消。thread.Join():阻塞呼叫端直到目標執行緒結束。Thread.Priority:Lowest ~ Highest,Unity 主執行緒為 Normal,背景運算建議 BelowNormal。ThreadPool.QueueUserWorkItem(_ =>
{
// 自動排程至執行緒池,無需手動管理 Thread 生命週期
HeavyCalculation();
});
優點:重複利用執行緒、降低建構銷毀開銷。缺點:無法精確控制優先級、難以取消、不支援 Join 等待。
GameObject、Transform、Texture2D、MonoBehaviour 等皆為非執行緒安全。Vector3、Quaternion、Matrix4x4、Color 等 struct 可在背景運算,運算完再回主執行緒套用。lock、Interlocked、ConcurrentQueue 等避免競態條件。try-catch 並透過 UnityMainThreadDispatcher 回主執行緒記錄日誌。Loom 是 Unity 社群成熟的多執行緒封裝庫,核心 API:
// 在背景執行緒批次執行工作,完成後自動回主執行緒回呼
Loom.RunAsync(() =>
{
var result = HeavyCalculation();
return result;
})
.OnComplete(result =>
{
// 這裡已在主執行緒,可安全呼叫 Unity API
UpdateUI(result);
});
內部實現:ThreadPool + 主執行緒佇列輪詢,支援 maxThreads 限制併發數、safeMode 自動捕獲例外。
static 方法或 IJob (Job System)。Unity 支援多執行緒,但受限於引擎架構,只能用於「純運算」場景。掌握 Thread、ThreadPool、CancellationToken 與 Loom 等工具,並嚴守「Unity API 只在主執行緒」鐵律,即能安全釋放多核效能,打造流暢遊戲體驗。