Unity - Performance - Render - Overdraw

Quick Chat

Overdraw 就是 「同一個像素點被繪製多次」,當 Unity 把一個畫面繪製出來時,所有 Sprite 都是 從後到前(Back to Front) 疊加上去。如果某個像素被重複繪製了很多次,GPU 的工作量就會變大,導致 效能下降

Cases

大量重疊的透明 Sprite

  • 2D 遊戲裡很多元素是有 透明區域(Alpha 通道) 的,例如 UI、特效、光影效果。
  • GPU 必須計算這些透明度,並且疊加不同圖層的顏色,這個過程很吃資源。

過多的粒子 & 特效

  • 如果妳的遊戲有超多粒子特效,特別是 煙霧、火焰、閃光 這種會有大量透明像素的元素。

大範圍透明圖

  • 例如 UI 設計時,一個按鈕可能只是中間一小塊有圖案,但它的整張貼圖是 512 x 512 的 PNG,外圍全是透明的區域,這樣就會讓 GPU 花額外的時間去計算透明像素,而不是有效渲染有內容的部分。

畫面排序導致重複繪製

  • Unity 會根據 Sorting LayerOrder in Layer 來決定渲染順序。
  • 如果物件排序不合理,可能會讓後面的 Sprite 被前面的遮住,但 GPU 還是得先畫出來,結果白白浪費效能。

Debug

Unity 內建了檢測工具

  1. 打開 Scene 視圖
  2. 點擊 Shading Mode
  3. 選擇 Overdraw Mode

Overdraw 視覺化顯示方式

  • 藍色 / 黑色 → 幾乎沒問題
  • 綠色 / 黃色 → 有點 Overdraw,但還能接受
  • 紅色 / 白色 → 🚨 過度繪製嚴重,GPU 負擔大,要優化了!

Optimization

減少透明區域

  • 盡量 縮小 Sprite 的實際範圍,不要讓透明區域過大。
  • 例如 UI 按鈕的 Sprite,最好裁剪成 剛好包住可見部分,而不是整張 512x512 貼圖全都透明。

善用 Sprite Packing(圖集)

  • 把小圖合併成 Sprite Atlas,讓 GPU 少做一些不必要的切換,提高效率。

減少畫面重疊的透明圖層

  • UI 設計時,盡量讓按鈕、圖示等 不要有過多重疊
  • 如果 UI 有半透明背景,可以嘗試改用 單一大圖片代替多個小圖片疊加

控制粒子數量

  • 降低粒子數量
  • 縮小粒子範圍
  • 減少透明度計算(調整 Shader)

改善 Sorting Order

  • 避免不必要的遮擋運算,如果一個物件永遠會被其他東西蓋住,考慮 改變它的 Sorting Layer,甚至在不必要時直接不渲染它(SetActive(false))。

使用 Shader 優化透明渲染

  • 如果 Sprite 不需要半透明效果,可以換成 Opaque Shader(不透明著色器),這樣 GPU 就不會計算透明度疊加。

改用 Tilemap

  • 如果遊戲是 2D 地圖類型(像素風格、平面地圖等),可以用 Unity Tilemap 來減少 Overdraw,因為 Tilemap 會幫妳合併小區塊來優化繪製。