一、前言
在經歷了前幾天的架構重構與除蟲特輯後,我們的 2D 敘事遊戲已經具備了成就系統、對話管理與存檔持久化等完整功能。然而,隨著遊戲中的對話頻繁切換、UI 彈窗不斷開啟與關閉,隱藏在底層的效能殺手——記憶體垃圾回收(Garbage Collection, GC)與頻繁的資源實例化(Instantiate),可能會悄悄導致畫面出現微幅的卡頓(Stuttering)。今天這篇文章,我們就要來深入探討 Unity 2D 開發中的效能優化與記憶體管理策略。
二、核心痛點剖析:記憶體碎片與 GC 滯後
在 C# 的運作機制中,所有參考型別(Reference Types)如 string、class、陣列或是頻繁宣告的物件,都會在 Managed Heap(受管理的堆積記憶體) 中配置空間。
三、核心程式實作:減少 GC 與字串配置優化
為了避免頻繁觸發記憶體垃圾回收,我們在處理對話框與 UI 更新時,必須避免在熱路徑(Hot Path,頻繁執行的程式碼)中產生不必要的臨時物件。以下是優化前後的程式碼對比:
//【不良示範】在頻繁執行的更新或對話推進進行字串相加,會產生大量臨時字串垃圾
public void UpdateDialogueBad(String speaker, string content) {
dialogueText.text = speaker + ":" + content; //每次執行都會產生新的GC記憶體配置
//【優化寫法】使用C# 的快取或 StringBuilder,或是透過快取變數減少 Heap 配置
private StringBuilder sb = new System.Text.StringBuilder();
public void UpadteDialogueOptimized(string speaker , string content) [
sb.Clear();
sb.Append(speaker);
sb.Append(":");
sb.Append(content);
dialogueText.SetText(sb); //配合 TextMashPro的高效字串設定方法。大幅降低GC
此外,針對對話框中頻繁開關的 UI 或者是特效物件,應避免使用 Destroy 與 Instantiate,改為使用物件池(Object Pooling)的概念,將物件隱藏(SetActive(false))並重複利用,從根本上避開記憶體頻繁配置的開銷。
四、Unity Editor 與除錯工具應用步驟
1. 善用 Profiler 工具定位 GC Alloc:

2. 善用 Frame Debugger 檢查渲染開銷:

五、開發實戰經驗:踩坑與架構反思
六、今日成果與小結
DAY 27 的內容主要在探討 Unity 2D 遊戲開發中的效能優化與記憶體管理策略,包含了 GC Alloc 的成因、透過 StringBuilder 改善字串串接、避免頻繁 Instantiate/Destroy,以及利用 Unity Profiler 與 Frame Debugger 進行效能檢測。因為這屬於專案整體的效能優化與架構微調(Performance Optimization & Refactoring),會與前幾天的防呆重構類似所以適合放在 main 主分支:
1.檢查修改狀態
git status
2.加入暫存區並提交 Commit
git add .
git commit -m "refactor: 優化字串串接與記憶體配置,導入 StringBuilder 並透過 Profiler 檢測減少 GC Alloc"
3.推送到遠端開發分支
git push origin main