利用reflect probe代替反射、折射,盡量不用RTT、GrabPass、RenderWithShader、CommandBuffer.Blit (BuiltinRenderTextureType.CurrentActive...)
建立統(tǒng)一后處理框架(bloom、hdr、DOF等)代替多后處理,可以共用模糊函數(shù),減少多次blit;另外要注意RTT的尺寸。
空氣折射、熱浪扭曲等使用GrabPass不是所有硬件都支持,改為RTT或者后處理來優(yōu)化。
建立統(tǒng)一shader材質(zhì)代替單一shader,充分利用shader_feature、multi_compile,并將宏開關顯示于界面。
圖像混合代替多通道紋理,陰影投射、陰影接收、MetaPass、forwardadd 等pass不需要時要剔除。
少用alpha test、discard、clip、Alpha Converage等,因為會影響Early-Z Culling、HSR的優(yōu)化。
避免Alpha Blend穿透問題(權(quán)重混合、深度剝離等透明排序方法代價太大了)。
光照貼圖代替動態(tài)陰影、盡量不用實時光;陰影貼圖、環(huán)境貼圖用16位代替32位;利用projector+rtt或者光圈代替實時陰影。
將環(huán)境參數(shù)(風、雨、太陽)等shader全局參數(shù)統(tǒng)一管理。
非主角可以用matcap代替pbr、無金屬不一定要用pbr,仔細選擇物理渲染所用的FDG(F:schlick、cook-torrance、lerp、要求不高用4次方,D:blinn-phong、beckmann、GGX、GGX Anisotropic,G:neumann、cook-torrance、Kelemen、SmithGGX;standard shader要注意選擇BRDF1-BRDF3),渲染要求不高時不用GGX;可以用LH來優(yōu)化GGX。
用fixed、half代替float,建立shader統(tǒng)一類型(fixed效率是float的4倍,half是float的2倍),小心選擇shader變量的修飾(uniform、static、全局),選擇Mobile或Unlit目錄下shader
使用高低配渲染,內(nèi)存足夠時可以考慮開啟mipmap
使用surface shader注意關掉不用的功能,比如:noshadow、noambient、novertexlights、nolightmap、nodynlightmap、nodirlightmap、nofog、nometa、noforwardadd等
standard shader的變體太多(3萬多),導致編譯時間較長,內(nèi)存占用也很驚人(接近1G),如果使用要關掉沒用的shader_feature,比如:_PARALLAXMAP、SHADOWS_SOFT、DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE、_DETAIL_MULX2、_ALPHAPREMULTIPLY_ON;另外要去掉多余的pass
shaderforge、Amplify Shader Editor生成的shader有多余代碼要程序?qū)iT優(yōu)化,Amplify Shader Editor功能更強大一些,而且開源,建議學習。
不要用unity自帶terrian,因為即使只用3張splat圖,shader也是對應4個的,建議T4M或者轉(zhuǎn)為mesh。
模型和材質(zhì)相同且數(shù)量巨大時用Instance來優(yōu)化,比如草。
利用查找紋理(LUT)來優(yōu)化復雜的光照渲染,比如:皮膚、頭發(fā)、噴漆等。
盡量不要使用Procedural Sky,計算瑞麗散射和米氏散射效率比較低。
盡量不要使用speedtree,改為模型加簡單樹葉動畫,不過SpeedTreeWind.cginc里面的動畫函數(shù)很豐富,TerrianEngine中的SmoothTriangleWave很好用。
多用調(diào)試工具檢查shader性能,常用工具有:FrameDebug、Nsight、RenderDoc 、AMD GPU ShaderAnalyzer / PVRShaderEditor、Adreno Profiler 、騰訊Cube、UWA等;另外可以內(nèi)置GM界面,比如開關陰影,批量替換shader等方便真機調(diào)試。