首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Unity C# 多執行緒開發實戰:Thread、ThreadPool 與 Loom 插件完整指南

     編輯:關於C語言

前言:協程 ≠ 多執行緒

Unity 開發者常混淆「協程」與「多執行緒」。協程(IEnumerator + StartCoroutine)本質是單執行緒上的狀態機,透過 yield return 讓出控制權,無法利用多核心 CPU。真正的多執行緒(System.Threading.Thread)能將大量運算(路徑尋找、物理模擬、資料序列化)分派至背景執行緒,釋放主執行緒渲染畫面,顯著提升效能。

核心命名空間與四種 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 靜態/實例方法

  • Thread.Sleep(ms):讓出時間片,0 僅讓同優先級執行緒搶佔。
  • Thread.Abort():已過時,強制終止易造成資源洩漏,改用 CancellationToken 協作式取消。
  • thread.Join():阻塞呼叫端直到目標執行緒結束。
  • Thread.Priority:Lowest ~ Highest,Unity 主執行緒為 Normal,背景運算建議 BelowNormal。

ThreadPool:輕量級工作佇列

ThreadPool.QueueUserWorkItem(_ =>
{
    // 自動排程至執行緒池,無需手動管理 Thread 生命週期
    HeavyCalculation();
});

優點:重複利用執行緒、降低建構銷毀開銷。缺點:無法精確控制優先級、難以取消、不支援 Join 等待。

⚠️ Unity 多執行緒鐵律(必讀)

  1. Unity API 絕不可在背景執行緒呼叫:GameObject、Transform、Texture2D、MonoBehaviour 等皆為非執行緒安全。
  2. 純數值型別可跨執行緒:Vector3、Quaternion、Matrix4x4、Color 等 struct 可在背景運算,運算完再回主執行緒套用。
  3. 共享資料需同步:使用 lock、Interlocked、ConcurrentQueue 等避免競態條件。
  4. 例外處理:背景執行緒未捕獲的例外會直接終止進程,務必在進入點包裝 try-catch 並透過 UnityMainThreadDispatcher 回主執行緒記錄日誌。

進階方案:Loom Multi-Threading Framework

Loom 是 Unity 社群成熟的多執行緒封裝庫,核心 API:

// 在背景執行緒批次執行工作,完成後自動回主執行緒回呼
Loom.RunAsync(() =>
{
    var result = HeavyCalculation();
    return result;
})
.OnComplete(result =>
{
    // 這裡已在主執行緒,可安全呼叫 Unity API
    UpdateUI(result);
});

內部實現:ThreadPool + 主執行緒佇列輪詢,支援 maxThreads 限制併發數、safeMode 自動捕獲例外。

效能優化建議

  • 將「純計算、無 Unity 依賴」的邏輯剝離為 static 方法或 IJob (Job System)。
  • 大量資料處理優先考慮 Burst Compiler + Job System + ECS,效能遠超傳統 Thread。
  • 舊專案快速引入多執行緒可用 Loom;新專案建議直接採用 DOTS 技術棧。

結語

Unity 支援多執行緒,但受限於引擎架構,只能用於「純運算」場景。掌握 Thread、ThreadPool、CancellationToken 與 Loom 等工具,並嚴守「Unity API 只在主執行緒」鐵律,即能安全釋放多核效能,打造流暢遊戲體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved