Unity優化篇之DrawCall

當然可以!以下是完整、詳盡、可發布的博客文章,專注講解 Unity 的靜態合批與動態合批機制,并詳細列出它們對 Shader 的要求和所有限制條件。文章結構清晰、技術深度足夠,適合發布在 CSDN、掘金、知乎等技術平臺。


urp默認隱藏動態合批,需要再這邊開啟動態合批的選項
在這里插入圖片描述

🎯 Unity 靜態合批 & 動態合批完全解析:原理、限制與實戰優化

Unity 渲染優化的第一課,必須懂的就是 Draw Call 合批機制。本文聚焦 Unity 中的 靜態合批(Static Batching)動態合批(Dynamic Batching),從底層原理到 Shader 限制、失敗原因、調試方法,帶你一文吃透。


🧱 什么是 Draw Call 與合批?

在 Unity 中,每渲染一個物體,CPU 就會向 GPU 發送一個 Draw Call(繪制調用)。Draw Call 多意味著 CPU 壓力大,可能引起幀率下降,特別是在移動端和 WebGL 平臺。

Unity 為了優化性能,會嘗試自動將多個渲染調用合并為一次 Draw Call,這就是“合批(Batching)”。


🟩 一、靜態合批(Static Batching)

? 原理

靜態合批是 Unity 在構建時將多個靜態物體的網格數據打包成一個或多個大網格,運行時作為一個整體進行渲染,顯著減少 Draw Call。

? 啟用方式

  • 選中 GameObject
  • 在 Inspector 中勾選 Static(或勾選 Static → Batching Static
  • Unity 構建時會對這些對象進行合并

? 條件匯總

條件是否必需說明
勾選 Static 標志?必須設置為 Static
使用相同材質實例?材質必須引用同一個 Material 對象
使用 MeshRenderer?不支持 SkinnedMeshRenderer
Shader 必須兼容?見下文 Shader 限制
不使用 MaterialPropertyBlock?會創建獨立材質實例,破壞合批

?? Shader 限制(靜態合批)

靜態合批的核心規則是:所有被合批的物體不再是“獨立對象”,而是被合并成一個大網格。

所以 Shader 不允許訪問對象獨有的屬性。

? 以下 Shader 寫法會導致合批失敗:
// 錯誤示例:訪問對象唯一矩陣
float3 worldPos = mul(_Object2World, v.vertex).xyz;
? 推薦用法:
// 推薦寫法:使用 Unity 內置宏
float4 clipPos = UnityObjectToClipPos(v.vertex);
? 禁用功能列表(會導致分批):
Shader 特性說明
_Object2World, _World2Object對象被合并后,不存在單獨變換矩陣
GrabPass / 多 Pass Shader每個 Pass 是獨立 Draw Call
Shader Keyword 不一致_EMISSION, _NORMALMAP 等開關變化會拆分 Shader 變體
使用 MaterialPropertyBlock 修改參數會使每個物體擁有獨立材質實例,合批失敗

💡 適用場景

  • 城市建筑、地形、房屋、墻體等不會移動/旋轉/縮放的對象
  • 靜態 UI 元素(如背景裝飾)配合 SpriteAtlas 合批

🟨 二、動態合批(Dynamic Batching)

? 原理

動態合批是在運行時由 Unity 動態將多個小型對象的頂點數據合并成一個臨時網格,從而減少 Draw Call。

Unity 每幀會重新組合這些物體的網格,雖然提升了繪制效率,但也會帶來一定的 CPU 合批開銷。

? 啟用方式

  1. Project Settings > Player > Other Settings
  2. ? 勾選 Dynamic Batching(?? 在 URP 中需在 URP Asset 勾選)

? 條件匯總

條件是否必需說明
使用相同材質實例?必須是同一個 Material 對象
每個 Mesh 頂點數 ≤ 300?官方限制,超過即失敗
使用 MeshRenderer?不支持 SkinnedMeshRenderer
未啟用 GPU Instancing?Instancing 和動態合批互斥
Shader 結構必須簡單?頂點函數不能太復雜,不能用動畫偏移
縮放需一致或接近??非 uniform scale 可能破壞合批(如 X:2 Y:1 Z:1)

?? Shader 限制(動態合批)

與靜態合批相比,動態合批對 Shader 要求更苛刻,因為它需要 CPU 快速合并多個對象的數據。

? 以下 Shader 特性將阻止動態合批:
特性說明
頂點函數復雜含有頂點動畫、扭曲、動態偏移等邏輯
非常量矩陣頂點變換使用不確定變量會中斷合批
使用不同 Shader Keyword會產生不同 Shader 變體
材質不同即使 Shader 相同,材質參數不同也會失敗
GrabPass、多 Pass Shader強制產生多個 Draw Call,無法合批

🧪 示例場景

  • 掉落的金幣、彈藥、碎片等小物體
  • 小型動態粒子替代物(如火花、樹葉)

? 合批失敗的常見原因匯總

原因靜態合批動態合批說明
材質不同??不同材質一定不能合批
Shader Keyword 不一致??比如一個開啟 _EMISSION,另一個關閉
使用 MaterialPropertyBlock 設置屬性??會實例化材質,打斷合批
Shader 使用對象獨立數據(如 _Object2World)??靜態合批合并后沒有對象矩陣
使用復雜頂點動畫??動態合批的頂點函數必須簡單
Mesh 頂點數 > 300??動態合批失敗,靜態合批不限
使用 SkinnedMeshRenderer??這類 Renderer 本身無法合批
非等比縮放(如 X=1.5 Y=1 Z=0.8)???有概率影響動態合批穩定性

🛠? 如何驗證合批是否成功?

🔧 使用 Frame Debugger(首選)

  1. 打開路徑:Window > Analysis > Frame Debugger

  2. 點擊左上角 Enable

  3. 在 Draw Call 列表中查找是否有:

    • Batched: Static
    • Batched: Dynamic
  4. 點擊每個 Batch 可查看合批的對象和材質

🔧 使用 Profiler

  • 打開:Window > Analysis > Profiler

  • 查看 Rendering 模塊中的:

    • Draw Calls(總繪制次數)
    • Batches(實際提交的批次數)

? 實戰優化建議

優化點原因
大量靜止物體 → 使用靜態合批提升性能、減少運行時消耗
小物體頂點數 ≤ 300 → 可用動態合批控制模型復雜度
統一使用共享材質避免因材質不同導致分批
避免頻繁使用 MaterialPropertyBlock會實例化材質、拆批
使用 UnityObjectToClipPos 替代 _Object2World保證靜態合批兼容
用 Frame Debugger 驗證結果直觀查看合批是否成功

📌 總結對比表:靜態合批 vs 動態合批

項目靜態合批動態合批
觸發方式構建時運行時
是否勾選 Static? 必須? 不需要
Mesh 頂點限制? 無限制? ≤ 300
運行時性能開銷極低較高(每幀打包)
適用對象靜止對象小動態物體
材質要求同材質實例同材質實例
Shader 要求不能訪問對象唯一數據必須簡單、輕量

📣 結語

Unity 提供的靜態合批和動態合批,是開發者提升渲染性能最基本、也最有效的優化手段之一。理解它們的原理、限制與觸發機制,可以幫助你從源頭降低 Draw Call 數量,讓你的游戲在中低端設備上依舊運行流暢。

開發不是一味堆特效,而是用合適的方式,做足夠的表現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83923.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Electron桌面應用下,在拍照、展示pdf等模塊時,容易導致應用白屏

Electron 應用白屏問題分析與解決方案 Electron 應用中拍照、PDF展示等模塊導致白屏的常見原因通常與內存泄漏、渲染進程崩潰或資源加載超時有關。以下是具體排查與解決方法: 檢查內存泄漏 項目中,分析代碼,高頻操作或未釋放的資源可能導致…

比對++Hex or Bin文件

用NotePad 安裝 ?? Hex-Editor 插件 1.1參考方法路徑https://cloud.tencent.com/developer/article/2311013 1.2 下載 Hex-Editor.dll文件路勁 https://sourceforge.net/projects/npp-plugins/ 比對 2.1, 顯示Bin 插件/Hex Editor/View in Hex 2.2 插件/Compare(運行很不流…

以STM32H7微控制器為例,簡要說明stm32h7xx_it.c的作用

在STM32開發中,stm32h7xx_it.c文件是中斷服務例程(ISR, Interrupt Service Routine)的核心實現文件,其作用與產生的邏輯如下: 一、文件的核心作用 中斷處理入口 該文件定義了STM32H7微控制器所有硬件中斷和異常的處理函…

若依框架頁面緩存查詢條件后,切換頁面想重新請求一下數據

因為框架使用了Keep-Alive緩存組件,所以使用onActivated鉤子 import { onActivated } from vue;// 當組件從緩存中重新激活時 onActivated(() > {getList(); });

智能心理醫療助手開發實踐:從技術架構到人文關懷——CangjieMagic情感醫療應用技術實踐

作為一名長期耕耘在醫療健康領域的技術開發者,我至今仍清晰地記得三年前那個深夜——當我調試的心理健康AI第一次對用戶的情緒崩潰做出恰當回應時,整個團隊爆發的歡呼聲。那一刻,我深刻意識到技術不只是冰冷的邏輯,更可以成為溫暖…

漢諾塔問題深度解析

漢諾塔問題深度解析 一、漢諾塔問題的起源與背景1.1 問題起源1.2 歷史發展 二、漢諾塔問題的描述與規則2.1 問題描述2.2 示例說明 三、漢諾塔問題的遞歸求解原理3.1 遞歸思想概述3.2 漢諾塔問題的遞歸分解3.3 遞歸調用棧分析 四、漢諾塔問題的多語言實現4.1 Python實現4.2 C實現…

【Node.js 深度解析】npm install 遭遇:npm ERR! code CERT_HAS_EXPIRED 錯誤的終極解決方案

目錄 📚 目錄:洞悉癥結,精準施治 🔍 一、精準剖析:CERT_HAS_EXPIRED 的本質 🕵? 二、深度溯源:證書失效的 N 重誘因 💡 三、高效解決策略:六脈神劍,招招…

【SpringBoot自動化部署】

SpringBoot自動化部署方法 使用Jenkins進行持續集成與部署 Jenkins是最常用的自動化部署工具之一,能夠實現代碼拉取、構建、測試和部署的全流程自動化。 配置Jenkins任務時,需要添加Git倉庫地址和憑證,設置構建觸發器(如GitHub…

動態規劃-1035.不相交的線-力扣(LeetCode)

一、題目解析 光看題目要求和例圖,感覺這題好麻煩,直線不能相交啊,每個數字只屬于一條連線啊等等,但我們結合題目所給的信息和例圖的內容,這不就是最長公共子序列嗎?,我們把最長公共子序列連線起…

Double/Debiased Machine Learning

獨立同步分布的觀測數據 { W i ( Y i , D i , X i ) ∣ i ∈ { 1 , . . . , n } } \{W_i(Y_i,D_i,X_i)| i\in \{1,...,n\}\} {Wi?(Yi?,Di?,Xi?)∣i∈{1,...,n}},其中 Y i Y_i Yi?表示結果變量, D i D_i Di?表示因變量, X i X_i Xi?表…

Tailwind CSS 實戰:基于 Kooboo 構建 AI 對話框頁面(八):異步處理邏輯詳解

在現代 Web 應用中,異步處理是實現流暢交互的核心技術。本文基于前幾章實現的內容Tailwind CSS 實戰:基于 Kooboo 構建 AI 對話框頁面(七):消息框交互功能添加-CSDN博客,深入解析 AI 對話框頁面中異步邏輯的…

Asp.net Core 通過依賴注入的方式獲取用戶

思路:Web項目中,需要根據當前登陸的用戶,查詢當前用戶所屬的數據、添加并標識對象等。根據請求頭Authorization 中token,獲取Redis中存儲的用戶對象。 本做法需要完成 基于StackExchange.Redis 配置,參考:…

Vue3 + UniApp 藍牙連接與數據發送(穩定版)

本教程適用于使用 uni-app Vue3 (script setup) 開發的跨平臺 App(支持微信小程序、H5、Android/iOS 等) 🎯 功能目標 ? 獲取藍牙權限? 掃描周圍藍牙設備? 連接指定藍牙設備? 獲取服務和特征值? 向設備發送數據包(ArrayBu…

Docker + Nginx + Logrotate 日志管理與輪換實踐

概述與背景 Docker 容器化環境中 Nginx 日志管理的挑戰Logrotate 的作用與必要性結合場景的實際需求(如日志切割、壓縮、歸檔) Docker 環境下的 Nginx 日志配置 Nginx 日志路徑與 Docker 數據卷映射 volumes:- ./nginx/logs:/var/log/nginxLogrotate …

涂膠協作機器人解決方案 | Kinova Link 6 Cobot在涂膠工業的方案應用與價值

涂膠工業現狀背景: 涂膠工藝在汽車制造、電子組裝、航空航天等工業領域極為關鍵,關乎產品密封、防水、絕緣性能及外觀質量。 然而,傳統涂膠作業問題頻發。人工操作重復性強易疲勞,涂膠質量波動大;大型涂膠器使用增加工…

釋放模型潛力:淺談目標檢測微調技術(Fine-tuning)

引言 在計算機視覺領域,目標檢測是一項至關重要的任務,它不僅要識別出圖像中存在哪些物體,還要精確地定位它們的位置。從自動駕駛汽車識別行人與車輛,到醫療影像輔助診斷病灶,再到智能安防監控異常事件,目標…

Unreal從入門到精通之 UE4 vs UE5 VR性能優化實戰

文章目錄 前言:準備工作UE4 vs UE5 性能對比引擎核心技術方案對比UE5 優化總結項目設置可伸縮性組設置VolumetricCloud最后前言: 最近在使用UE5制作VR項目 制作完后發現,我們的場景一直很卡頓,場景優化也做到了極致,但是幀率最高也才30+ 但是我們看到一個競品,他的幀率竟…

爆炸仿真的學習日志

今天學習了一下【Workbench LS-DYNA中炸藥在空氣中爆炸的案例-嗶哩嗶哩】 https://b23.tv/kmXlN29 一開始 如果你的 ANSYS Workbench 工具箱(Toolbox)里 只有 SPEOS,即使嘗試了 右鍵刷新、重置視圖、顯示全部 等方法仍然沒有其他分析系統&a…

Redis部署架構詳解:原理、場景與最佳實踐

文章目錄 Redis部署架構詳解:原理、場景與最佳實踐單點部署架構原理適用場景優勢劣勢最佳實踐 主從復制架構原理消息同步機制1. 全量同步(Full Resynchronization)2. 部分重同步(Partial Resynchronization)3. 心跳檢測…

AI預測3D新模型百十個定位預測+膽碼預測+去和尾2025年6月6日第100彈

從今天開始,咱們還是暫時基于舊的模型進行預測,好了,廢話不多說,按照老辦法,重點8-9碼定位,配合三膽下1或下2,殺1-2個和尾,再殺4-5個和值,可以做到100-300注左右。 (1)定…