Shader相關(guān)優(yōu)化
眾所周知,我們在unity里編寫Shader使用的HLSL/CG都是高級語言,這是為了可以書寫一套Shader兼容多個平臺,在unity打包的時候,它會編譯成對應(yīng)平臺可以運行的指令,而變體則是,根據(jù)宏生成的,而打包運行時,GPU會根據(jù)你設(shè)置的宏切換這些打包出來的代碼,而不是我們書寫那種只生成的一個Shader,這也是為了提高運行速度。
如果你要查看實際運行的代碼,可以使用RenderDoc等工具截幀查看實際運行的代碼。
可以在Shader上面查看當(dāng)前生成的變體數(shù)量。
優(yōu)化Shader最主要的是優(yōu)化Shader的算法,整理代碼結(jié)構(gòu),減少冗余。使用最精簡,運行效率最高的代碼來實現(xiàn)我們的功能。
函數(shù)性能優(yōu)化
我們可以在微軟的網(wǎng)站查看,根據(jù)指令槽進行排序,查看性能消耗順序。里面展示了在片元里面的占用:
- 紋理采樣盡量減少采樣次數(shù),消耗排序:texCubelod > texCube > tex2Dlod > tex2D
- 減少復(fù)雜的數(shù)學(xué)函數(shù)調(diào)用,它們無法直接編譯簡單指令:pow,exp,sign,cos,sin,tan
- 能復(fù)用的,盡量減少重復(fù)計算:normalize,dot
- saturate,abs,max,min 推薦使用,效率高
注意事項
- 避免使用除法,使用rcp代替,a/b 可以改成 a*rcp(b)這種提高性能
- 避免使用if,loop這種邏輯和循環(huán)
- 計算精度問題:世界空間位置以及精度要求高的紋理坐標用float,其它都用half就行(紋理坐標,向量,顏色(HDR)等)
- 減少寄存器的數(shù)量
一般是在Varyings減少,Attributes是從Mesh上面獲取,如果Shader上沒有使用到也可以去掉。 - 能在頂點計算的,盡量在頂點著色器計算,一些線性的數(shù)據(jù),比如Fog SH
- 慎重使用AlphaTest,會導(dǎo)致Early-z的失效,最好使用腳本,設(shè)置宏,開啟時自動修改隊列到2450
- Color Mask問題,一些平臺上移動端可能會占用資源。
渲染優(yōu)化
函數(shù)優(yōu)化的再多也節(jié)省不了多少,都不如少渲染幾次節(jié)省的多,所以,我們要從減少渲染量上面入手。
- 減少Overdraw 盡量避免AlphaTest和AlphaBlend物體,尤其是AlphaTest要放到2450,不要和不透明物體混合。減少整個屏幕的特效。
- 減少后處理,每一次全屏后處理增加計算量太大了,計算時最好能降低分辨率計算,比如bloom計算時都采用了一種降采樣的做法。
- 抗鋸齒,移動端盡量不要開,性能推薦:MSAA < TAA < FXAA&SMAA
inline內(nèi)聯(lián)函數(shù)
我們在Unity的內(nèi)置CGInclude文件中可以發(fā)現(xiàn)不少函數(shù)都有inline關(guān)鍵字,有inline修飾的函數(shù)為內(nèi)聯(lián)函數(shù),可以解決一些頻繁調(diào)用的小函數(shù)大量消耗??臻g(棧內(nèi)存)的問題,但inline 的使用是有所限制的,inline 只適合函數(shù)體內(nèi)代碼簡單的函數(shù)且會被頻繁調(diào)用時使用,不能包含復(fù)雜的結(jié)構(gòu)控制語句例如 while、switch,并且內(nèi)聯(lián)函數(shù)本身不能是直接遞歸函數(shù)(即,自己內(nèi)部還調(diào)用自己的函數(shù))。
美術(shù)資源的優(yōu)化
美術(shù)資源主要是包含:紋理,網(wǎng)格以及Shader的變體,其中最主要的是紋理。
紋理
紋理大小會影響資源加載時間,gpu渲染時間,內(nèi)存的使用,包體大小以及畫面質(zhì)量。
有些同學(xué)一直認為要極致壓縮在unity里面的大小,這種方式是不對的,那只是導(dǎo)入到unity中的圖片存儲格式,不代表在打包后的占用,unity在打包時,會將格式轉(zhuǎn)換成其它格式進行存儲。
上圖展示了圖片打包后的占用,前面則表面了當(dāng)前的圖片使用了何種壓縮。
所以,不要在乎圖片導(dǎo)入時的大小和尺寸,要在圖片上進行設(shè)置,比如設(shè)置其最大1024。
壓縮格式
首先,科普一下bpp,比如4 bpp,意思為每個像素占用4bit 應(yīng)為 4bit per pixel。
- 移動端常用格式 有損壓縮
PVRTC: RGBA 4 bpp 尺寸要求正方向
ETC2:RGBA 8 bpp 尺寸要求為4的倍數(shù)
ASTC 4x4 :RGBA 8 bpp 尺寸要求4的倍數(shù)(還有6x6 8x8 要求符合相應(yīng)的倍數(shù)),它支持HDR
默認則為RGBA 32bit 占用比其它大至少四倍 - PC常用格式
DXT:RGB 4 bpp 尺寸要求為2的冪次方 不透明紋理常用
BC7:RGBA 8bpp 尺寸要求為2的冪次方 支持透明通道
BC6H:RGBA(HDR)8 bpp 支持HDR
unity官方紋理壓縮文檔
3. 開啟minmap可以有效降低帶寬,但是會增加內(nèi)存 33%
4. 各向異性過濾,建議不開啟或者只單獨處理
它是默認開啟的,一般設(shè)置Per Texture,然后需要在圖片上開啟。
開啟以后會增加采樣,會降低紋理mipmap過渡時的鋸齒。
5. 如果ui圖片的尺寸不符合標準,會采用無損壓縮,會造成浪費。
Mesh
- 注意寫入的開啟,開啟狀態(tài)內(nèi)存占用會翻倍
- 骨骼模型要著重注意面數(shù),比較影響性能,因為它的動畫需要每幀計算頂點位置
資源相關(guān)檢查工具
-
紋理和Mesh的檢查工具,可以一鍵查看相關(guān)占用
可以一鍵檢查出對應(yīng)的大文件。
Mesh統(tǒng)計了使用次數(shù)的總占用,可以清晰的查看當(dāng)前Mesh在場景的總占用。紅色為未合并網(wǎng)格。 -
貼圖相關(guān)檢測
可以檢測貼圖的尺寸是否規(guī)范
可以檢測貼圖尺寸是否過大
會將非4的倍數(shù)的圖片導(dǎo)出到相應(yīng)文件夾,然后美術(shù)同學(xué)可以修改完成圖片后,對資源進行替換。 -
shader相關(guān)檢查
可以查看所有shader變體數(shù)量
可以打印出項目中shader的所有變體數(shù)量。
變體減少的辦法就是減少宏的使用,如果沒辦法,就少用multi_compile,使用shader_feature
變體的相關(guān)使用 點擊此處看官網(wǎng) -
資源引用查找
可以查看資源之間的互相引用,Uses可查看使用的資源,Used By可以查看被引用,Unused Assets查看沒有被使用的資源
可以選中物體進行查看相關(guān)引用,或者向上查找 -
Prebe資源分析
查找一個Prefab的資源引用分析,以及占用。
蒙皮動畫
蒙皮動畫也在游戲運行時占用比較大的性能,一般都會有一些方式解決,這里我推薦之前項目中使用的,使用GPU Skining + LOD,近處的模型使用默認蒙皮動畫,保證效果,遠處的角色模型,則使用低模+頂點動畫烘焙動畫貼圖,根據(jù)顏色像素轉(zhuǎn)換反向和距離,重新生成頂點位置繪制,這種方式還支持合批甚至GPU Instancing提高性能。
資源的加載
資源加載有時也會出現(xiàn)卡頓的情況 查看官方文檔,這個一般需要程序同學(xué)協(xié)助完成。
Shader的加載
默認情況下,Shader會在首次渲染幾何體是進行加載,這也是我們減少變體的原因之一。如果使用了相同的變體和Shader,渲染新的幾何體時,將不會在重新加載Shader。
有時會運行卡頓,我們可以使用預(yù)加載的形式進行Shader加載。文章來源:http://www.zghlxwxcb.cn/news/detail-432172.html
UI的優(yōu)化
優(yōu)化unity UI,這是先備份一下,需要時再看。文章來源地址http://www.zghlxwxcb.cn/news/detail-432172.html
到了這里,關(guān)于unity 性能優(yōu)化之GPU和資源優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!