Unity渲染性能优化总纲
概述
本篇是Unity渲染性能優化官方文檔中的渲染性能優化總綱,主要是讓我們知道從哪些方面著手優化,都有哪些優化手段。
在優化之前要先定位出問題所在
在我們進行優化之前,要先分析出我們的應用的性能問題出在哪里。如果我們沒有找出真正問題所在之前,就直接進行優化,很可能這部分優化工作是無效的,并且甚至可能會讓問題更糟。而且,渲染性能問題可能是由CPU或者GPU引起的,對于不同原因引起的性能問題,處理方式也是不一樣的,所以在我們進行優化之前一定要找出性能問題的真正原因。
減少CPU在渲染方面的消耗
一般情況下,對CPU渲染性能消耗影響最大的部分是發送渲染命令到GPU,渲染命令包括DrawCall(繪制幾何圖形的命令),和繪制幾何圖形之前的渲染狀態設置的切換命令。如果是因為這個原因引起的性能問題,可以考慮下面幾個操作:
1.?減少需要繪制的對象數量
? ? ? ? a. 減少場景中的對象總數,比如,用天空盒來實現遠景效果,這樣子就可以減少遠景對象
?? ??? ?b. 執行更嚴苛的剔除,讓Unity繪制更少的對象
?? ??? ??? ?i. 使用遮擋剔除來減少被物體遮擋的對象的繪制
?? ??? ??? ?https://docs.unity3d.com/Manual/OcclusionCulling.html
?? ??? ??? ?ii. 減小相機的遠裁剪平面距離(far clip plane),這樣可以讓更多的遠處的物體在相機的視野之外,從而不用繪制
?? ??? ??? ?iii. 還有一個更細的方法,就是把對象放到一個單獨的層級,然后通過Camera.layerCullDistances設置不同層級的剔除距離
?? ??? ??? ?https://docs.unity3d.com/ScriptReference/Camera-layerCullDistances.html
2. 減少渲染每個對象的次數
? ? ? ? a. 在合適的地方進行光影信息的烘培(預計算),用光照貼圖代替實時光照。這會增加構建的時間、運行內存和存儲內存,但是可以提高運行時的性能
?? ??? ?b. 如果使用的是前向渲染(Forward rendering),要減少能照射到對象的逐像素實時燈光的數量。
?? ??? ?https://docs.unity3d.com/Manual/RenderTech-ForwardRendering.html
?? ??? ?c. 實時陰影性能消耗很大,所以一定要謹慎有效的使用
?? ??? ?https://docs.unity3d.com/Manual/ShadowPerformance.html
?? ??? ?d. 如果使用了反射探針,要優化使用方法
?? ??? ?https://docs.unity3d.com/Manual/RefProbePerformance.html
3. 減少準備和發送渲染命令的大量工作
? ? 通常是通過更高效的批處理的方式發送渲染命令道GPU來進行優化,也就是我們常說的“合批”
?? ?https://docs.unity3d.com/Manual/DrawCallBatching.html
許多上述中的方法也是可以同時減少GPU的工作,比如,減少一幀內Unity渲染的物體總數同時可以減少CPU和GPU的工作量。
減少GPU渲染消耗
主要有三種情形會導致GPU性能消耗過高
1. Overdraw過高
? ? 即填充率過高,GPU需要繪制的像素過多,可以考慮以下方法:
?? ??? ?a. 減少程序中overdraw重復繪制過高的地方
?? ??? ?大部分時候引起Overdraw的主要因素是透明的對象,比如UI,粒子和Sprites。在編輯器模式下,我們可以通過查看OverdrawDrawMode來找出重復繪制過高的地方
?? ??? ?https://docs.unity3d.com/Manual/ViewModes.html
?? ??? ?b. 減少Shader中片元函數的計算消耗
?? ??? ?片元函數(fragment)是逐像素計算的,減少其中的計算(比如可以的話轉移到頂點函數中)可以減少消耗
?? ??? ?https://docs.unity3d.com/Manual/SL-ShaderPerformance.html
?? ??? ?c. 如果我們使用的是Unity的內置shader,盡量的使用Mobile或者Unlit目錄下的Shader使用
?? ??? ?這些Shader也能在非移動平臺使用,但是經過了簡化和更復雜的shader也是比較接近的
?? ??? ?d. 動態渲染分辨率
?? ??? ?Unity支持動態的縮放獨立的渲染目標(Render targets)
?? ??? ?https://docs.unity3d.com/Manual/DynamicResolution.html
2. GPU內存帶寬不足
? ? GPU的讀寫速度有限,需要讀寫的數據過多,一幀里則處理不了那么多的數據。這通常是因為貼圖太多或者太大。這種情形可以考慮以下處理方法:
?? ?https://docs.unity3d.com/Manual/class-TextureImporter.html
?? ??? ?a. 開啟貼圖的Mipmaps
?? ??? ?mipmap可以使一個對象在運行時使用不同大小的貼圖進行顯示(在3D場景中,大部分的貼圖都可以使用)。開啟mipmap會增加一定的內存和存儲空間(需要生成不同大小的貼圖),但可以提高運行時GPU的性能
?? ??? ?b. 使用合適的壓縮格式
?? ??? ?壓縮貼圖來減少貼圖在內存中的大小,可以讓加載更快,內存占用更小,并且提高GPU的渲染性能。相比沒有壓縮的貼圖,壓縮后的貼圖所需的內存帶寬也更小。
3. 需要處理的頂點過多
? ? 一幀內需要處理的頂點太多,也會導致GPU性能不足,可以考慮以下方法處理:
?? ??? ?a. 減少頂點函數的計算處理
?? ??? ?類似片元函數,但是這次沒地方轉移,只能從其它方面入手優化
?? ??? ?https://docs.unity3d.com/Manual/SL-ShaderPerformance.html
?? ??? ?b. 優化模型
?? ??? ?減面,減少不需要的面數,盡可能降低 UV 貼圖接縫和硬邊(雙倍頂點)的數量
?? ??? ?一般來說,移動端不超過10萬個頂點
?? ??? ?https://docs.unity3d.com/Manual/ModelingOptimizedCharacters.html
?? ??? ?c. 使用LOD
?? ??? ?https://docs.unity3d.com/Manual/LevelOfDetail.html
減少渲染的頻率
我們還可以通過降低渲染的頻率的方式來減少消耗,這不會降低一幀的CPU或者GPU的消耗,但減少了渲染的頻率,而且不會影響其它操作的執行(比如腳本,因為只是讓渲染的頻率下降了)。
我們可以在某些時候降低幀率或者整個游戲都降低幀率。降低幀率可以減少不必要的電量消耗,延長電池續航,并且防止設備溫度過高,導致CPU被降頻。
要調整渲染幀率,我們可以使用OnDemandRendering接口,這個接口特別適合配合Adaptive Performance package一起使用。
https://docs.unity3d.com/ScriptReference/Rendering.OnDemandRendering.html
https://docs.unity3d.com/Packages/com.unity.adaptiveperformance@3.0/manual/index.html
在以下情況,我們可以考慮降低幀率:
?? ?1. 菜單
?? ?比如應用程序入口點或者暫停菜單,菜單往往是相對簡單的場景,不需要那么高的幀率
?? ?2. 等待輸入的時候
?? ?比如一些游戲在等待玩家輸入的時候,比如象棋,玩家花時間等待其他用戶操作或者思考自己的操作
?? ?3. 內容大部分時候是靜態的
為了防止輸入延遲,我們可以在輸入持續時間內臨時增加渲染幀率(OnDemandRendering.renderFrameInterval = 1),以便移動、按鈕等仍可迅速響應
注意:VR應用不支持用OnDemandRendering,因為VR應用需要非常低的延遲,如果渲染的畫面跟不上頭的運動,就可能增加暈動癥出現的風險。
本文
https://blog.csdn.net/ithot/article/details/122520580?spm=1001.2014.3001.5501
參考
https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html
另外發現這一篇的中英文差別有點大,Unity的中文文檔有些是翻譯的,有些會拗口,有些像這篇加了很多自己的理解或者說就是作者的總結,和英文文檔偏差較大,也挺令人混亂的
https://docs.unity3d.com/cn/current/Manual/OptimizingGraphicsPerformance.html
擴展閱讀
Unity官方性能優化教程
https://learn.unity.com/tutorial/fixing-performance-problems-2019-3/?tab=overview&uv=2019.4
?
總結
以上是生活随笔為你收集整理的Unity渲染性能优化总纲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星note10 android q,【
- 下一篇: 论文模型构建的步骤_论文实证经验分享|V