unity渲染性能優化


cpu bound還是gpu bound

cpu bound:渲染task可能分布在多個線程,叫做多線程渲染。主線程、渲染線程、worker線程。主線程包含一些渲染的任務。渲染線程發送命令給gpu。worker線程執行一些單獨的任務,裁剪、mesh skin等。但不同目標也可能不同。

哪個task是瓶頸就優化那個task在的線程。某些平台不支持多線程渲染。

graphics job: player setting里的graphics job決定unity用worker線程展開渲染任務。

(1)發送命令到gpu:一般是在渲染線程執行的,有可能是worker線程執行在某些平台上(如ps4).SetPass call導致發送指令到gpu。目標平台能支持多少setpasscall跟設備有關。減少batch數、更多物體共享渲染狀態。較少setpass call數。

較少渲染物體數目(減少數目、剔除、距離、層級剔除、遮擋剔除),較少每個物體唄渲染次數(動態光照、動態陰影、反射probe),必須被渲染在多個批次的物體合成一個(靜態合批、動態合批、ui合批、gpu instance、貼圖圖集、合批會減少很多消耗

因為shadow、light、cull都是逐物體操作的)。

剔除、排序、合批:剔除、收集要渲染物體的信息、排序這些數據到batch、生成gpu指令都可能導致cpu bound。這些任務根據平台不同,可能在主線程、也可能在單獨的工作線程。

剔除本身不太可能會造成很高的成本,但是減少不必要的剔除可能會提高性能。所有active場景物體都有逐物體逐相機的開銷,即使在不被渲染的layer。我們應該disable掉相機或者不用的renderer。

batch能減小dc開銷。但它會增大開銷,如果batch導致cpu bound,我們要限制batch操作。

skinMesh:骨骼動畫,動畫角色。可能會導致cpu bound。能用meshRender就不用SkinnedMeshRenderer。 如果只動一段時間,看來替換mesh或吧skinnedMesh換為meshRenderer. mesh skin開銷是逐頂點的。

用更少頂點減少負擔。某些平台可用gpu控制skin。

減少主線程上,非渲染任務的消耗。比如腳本。

如果gpu bound:

Fill rate:減小分辨率、后處理。overdraw、屏幕效果、片元着色器、內置shader復雜度、standard shader復雜度。

內存帶寬:貼圖壓縮、miapmap

頂點處理:頂點數、用法線貼圖增加細節代替頂點、如果不需要normalmalp,不導入法線、lod、頂點shader、shader復雜度

 

參考這篇:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b596


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM