Unity Shader入門精要學習筆記 - 第16章 Unity中的渲染優化技術
轉自馮樂樂的 《Unity Shader 入門精要》
移動平臺的特點
為了盡可能一處那些隱藏的表面,減少overdraw(即一個像素被繪制多次),PowerVR芯片(通常用於ios設備和某些Android設備)使用了基於瓦片的延遲渲染(TBDR)架構,把所有的渲染圖像裝入一個個瓦片中,再由硬件找到可見的片元,而只有這些可見片元才會執行片元著色器。另一些基於瓦片的GPU架構,如Adreno(高通的芯片)和Mali(ARM的芯片)則會適應early-Z 或相似的技術進行一個低精度的深度檢測,來剔除那些不需要渲染的片元。還有一些GPU,如Tegra(英偉達的芯片),則使用了傳統的架構設計,因此在這些設備上,overdraw更可能造成性能的瓶頸。
影響性能的因素
我們可以把造成遊戲性能瓶頸的主要原因分成以下幾個方面
1)CPU
過多的draw call
復雜的腳本或者物理模擬
2)GPU
頂點處理(過多的頂點、過多的逐頂點計算)
片元處理(過多的片元、過多的逐片元計算)
3)帶寬
使用了尺寸很大且未壓縮的紋理
分辨率過高的幀緩存
對於CPU來說,限制它的主要是每一幀的draw call 的數目。draw call ,簡單來說,就是CPU在每次通知GPU進行渲染之前,都需要提前準備好頂點數據,然後調用一系列API把它們放到GPU可以訪問到的指定位置,最後,調用一個繪制命令。而調用繪制命令時,就會產生一個draw call 。過多的draw call 會造成CPU的性能瓶頸,這是因為每次調用draw call 時,CPU往往都是需要改變很多渲染狀態的設置,而這些操作是非常耗時的。當然,其他原因也可能造成CPU瓶頸,例如物理、不了模擬、蒙皮、粒子模擬等,這些都是計算了很大的操作。
對於GPU來說,它負責整個渲染流水線。它從處理CPU傳遞過來的模型數據開始,進行頂點著色器、片元著色器等一系列工作,最後輸出屏幕上的每個像素。因此,GPU的性能瓶頸和需要處理的頂點數目、屏幕分辨率、顯存等因素有關。
我們後面涉及的優化技術有
1)CPU優化
使用批處理技術減少draw call 數目。
2)GPU優化
減少需要處理的頂點數目(優化幾何體、使用模型的LOD技術、使用模型的LOD技術、使用遮擋剔除技術)
減少需要處理的片元數目(控制繪制順序、警惕透明物體、減少實時光照)
減少計算復雜度(使用Shader的LOD技術、代碼方面優化)
3)節省內存帶寬
減少紋理大小
利用分辨率縮放
使用模型的LOD技術 Unity中的渲染分析工具- SubShader{
- Tags{"RenderType"="Opaque"}
- LOD 200
- }
Unity 內置的Shader 使用了不同的LOD值,例如,Diffuse 的LOD為 200,而Bumped Specular 的LOD 為400 代碼優化方面:首先盡可能使用低精度的浮點值進行運算。還需要註意的是,我們應當盡量避免在不同精度之間的轉換。 還有就是盡可能不要使用全屏的屏幕後處理效果。 盡可能不要使用分支語句和循環語句。 盡可能避免使用類似sin、tan、pow、log等較為復雜的數學運算。使用查找表來替代它。 盡可能不使用discard
Unity Shader入門精要學習筆記 - 第16章 Unity中的渲染優化技術