Tuanjie 1.6.0版本針對小游戲平臺引入了一項令人心動的新能力--GPUResident Drawer,它可以幫助降低復雜場景的繪制功耗,提升復雜場景的渲染性能。通過優化CPU側的負載,它使得開發者能在保證性能的前提下,制作出場景更加復雜且效果出眾的小游戲。這一能力也同時會讓iOS、Android等平臺有一定的受益。
GPU Resident Drawer 是如何工作的?
利用BatchRendererGroup進行快速合批(渲染場景常駐GPU,減少渲染參數提交)
更好的利用GPU Instancing,減少draw call調用
從而降低 CPU 負載并提升幀率。
關鍵特性
使用傳統GameObject + Renderer組織的場景,可自動獲取BatchRendererGroup的高效合批,無需對現有場景進行特殊改造
Draw call數量越高、場景越復雜、場景中可GPU實例化的Renderer越多,收益越大
Renderer更新頻率越低(如位置、材質變化等),需要更新GPU數據的頻率越低,收益越大
優化對象是MeshRenderer。不包括SkinnedMeshRenderer、VFX、粒子等
支持小游戲平臺
在 Unity 6的版本里,GPU Resident Drawer 不支持GLES平臺。為了優化小游戲CPU側繪制功耗,我們借鑒了Unity 6的思路,定制了針對小游戲平臺的GPU Resident Drawer。
針對小游戲不支持SSBO和Compute Shader的限制,使用Texture存儲Renderer數據。
針對小游戲平臺暫不支持Burst和多線程、C#中的計算開銷高于C++的問題,全新實現了一份純C++版本,以保證性能表現。
在后續的版本中,我們將針對iOS、Android以及PC平臺做更好的適配及優化。
GRD 帶來的性能收益
GPU Resident Drawer適用于有大量Renderer共享相同的Mesh和 Material的場景,比如建筑、巖石、草地等。
如視頻所示,URP Sample Scene中的Garden場景開啟GPU Resident Drawer后:Batches由3000以上降低至1000以下、FPS由120以下提升到140以上。
從Profiler/Timeline中也可以看到明顯的耗時下降。
安卓平臺,Garden場景,關閉GRD
安卓平臺,Garden場景,開啟GRD
小游戲平臺,某MMO游戲,關閉GRD
小游戲平臺,某MMO游戲,開啟GRD
開發者能觀察到的性能提升,取決于場景的規模和渲染時GPU實例化的程度,GPU實例化對象越多,獲得的收益就越大。
開啟GPU Resident Drawer的收益同樣體現在功耗指標的降低,在多個平臺和設備上,我們可以看到功耗數據的喜人變化。
小游戲平臺,以某款重度MMO小游戲為例:
處理器
功耗(mW)
SRP Batcher
GPU Resident Drawer
收益
驍龍8Gen2
驍龍7+Gen3
Apple A15
55.3
Apple A13
安卓和iOS平臺,以Garden場景為例:
處理器
功耗(mW)
SRP Batcher
GPU Resident Drawer
收益
驍龍8Gen2
驍龍7+Gen3
50.2
Apple A15
66.0
Apple A13
30.9
*需要注意的是,在少數舊型號設備上(例如驍龍870),開啟GPU Resident Drawer后也可能出現一定的功耗負收益(約100mW),可能和硬件、驅動的支持不完善有關,建議開發者根據實際測試數據權衡選用。
快速上手
GPU Resident Drawer 功能適用于URP 3D項目,您可以通過以下幾個步驟快速啟用:
1.打開菜單 Edit > Project Settings > Quality, 雙擊 Render Pipeline Asset,在inspector中配置渲染管線。
2.在渲染管線配置界面,Rending 一欄中,將 GPU Resident Drawer 設置為 Instanced Drawing
3.在渲染管線配置界面,啟用 SRP Batcher
4.在渲染管線配置界面,雙擊Renderer List,配置Renderer,如下:Rendering Path設置為Forward+ 或 Forward(Forward 僅支持單個平行光源)
5.打開菜單 Edit > Project Settings > Graphics, 在Shader Stripping部分,將BatchRendererGroup Variants設置為Keep All,以確保編譯所有必要的著色器變體
Project Settings > Graphics, 在 Shader Stripping 部分,將 BatchRendererGroup Variants 設置為 Keep All,以確保編譯所有必要的著色器變體"},"attribs":{"0":"*0+17*0*1+g*0+6*0*1+r*0+5*0*1+8*0+g"}},"apool":{"numToAttrib":{"0":["author","7475251529973383169"],"1":["bold","true"]},"nextNum":2}},"type":"ordered","referenceRecordMap":{},"extra":{"channel":"saas","isEqualBlockSelection":true,"pasteRandomId":"1b7962ab-c0c2-4848-a621-156f0640017f","mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"isFromCode":false,"selection":[{"id":105,"type":"text","selection":{"start":0,"end":121},"recordId":"UKN0dI1OKoAAAjxrjJScOkyxnDh"}],"payloadMap":{},"isCut":false}" data-lark-record-format="docx/text">
您還可以繼續優化設置、局部禁用 GRD 功能、查看優化效果、排查問題等,更多操作請參閱官方指南:
https://docs.unity.cn/cn/tuanjiemanual/Manual/GPUResidentDrawer.html
Known issues
目前僅支持 URP 管線,未來將增加對 HDRP 管線的支持。
如果在 RenderFeature 里有增加 Material Override Mode 的材質,且材質本身不支持 GPU Resident Drawer(使用自定義shader且實現不滿足要求,例如未聲明dots_instancing keyword等),這種情況下 Override 的材質可能無法正確的顯示。
在 Editor 打包成功后可能會出現場景不渲染,并在控制臺輸出錯誤日志的情況,這個時候 reload 場景或者 reload project 即可以恢復正常,Player 模式不受影響。
引擎會根據 GPU Resident Drawer 開關對 Shader 變體進行裁剪,以減少其數量。因此,在 Player 中動態開關 GPU Resident Drawer 時,可能會因找不到變體而導致渲染錯誤。可以修改 Package 源碼,手動移除 Shader 變體裁剪的邏輯代碼。
Forward 路徑下燈光目前只支持單一主方向光。
SpeedTree 的物體暫時不支持Wind的效果,開啟 Wind 后物體會回退到 GRD Disable 的渲染狀態
在 Android 手機上使用 Vulkan,打 development 包調試時,會報 Platform does not support uploading texture2d subrect data 這個錯誤,但 release包不受影響。
原理簡介
性能優化
在 URP 管線中,采用 SRP Batcher 可以減少渲染狀態的切換,提高渲染效率:
分析 SRP Batcher 的過程,我們發現有兩個環節可以優化:
RenderNodes 每幀都會重新創建,但對于靜態場景而言,大部分對象幾乎不會變化,也就沒有必要頻繁重新創建 RenderNodes。
繪制每個 Batch 時,對 Batch 內的 RenderNode 逐個繪制,并未分析他們是否可以通過 GPU Instancing 的方式合并繪制。
GRD針對這兩個環節都進行了優化:
Renderer 信息常駐 GPU Buffer:收集當前場景中所有符合條件的MeshRenderer,將繪制相關數據保存至 GPU Buffer 中,收集到的這些MeshRenderer 不再每幀生成 RenderNode。
GPU Instancing:組織 Batch 時,將相同材質的 Renderer 組織到同一個 Batch,對于Mesh也相同的Renderer,通過 GPU Instancing 繪制從而減少 Draw Call 調用。
Unity 官方微信
第一時間了解Unity引擎動向,學習進階開發技能
每一個“點贊”、“在看”,都是我們前進的動力
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.