施主分享隨緣,評論隨心,@author:白袍小道
小道暗語:
1、因為小道這里博客目錄沒自己整,暫時就用隨筆目錄結構,所以二級目錄那啥就忽略了。標題格式大致都是(原or轉) 二級目錄 (標題)
2、因為所看和以前記錄太過雜亂,所以只能手動一點點搬移(回憶,整理)。歡迎討論,知識和能力總是被問出來了不是(嘿嘿,這樣才能成長), 若有不對別噴就好哈哈。
引言:
文章四方面包括了從游戲線程、渲染線程、GPU、內存等的優化,提升游戲技術底子。
原作者:王禰,Epic Games 資深開發者技術支持,管理虛幻引擎技術支持的程序員團隊,擁有近15年虛幻引擎使用經驗。
正文:
優化肯定是有個前提和需求背景的,本文的前提:在移動設備上做大地型的多人游戲。
需求背景:
1、開放地圖:視野寬,視距遠,地圖大
2、場景:風格變化多
3、同屏人不少
4、交互也不少
(看到這里對吧,UE +上述 就直接說堡壘之夜就好了唄)
(由於篇幅較長,小道就直接拆開了,各位看官)
GPU
1 |
分辨率和顏色格式 |
渲染分辨率,我們可以逐設備的通過MobileContentScaleFactor設置BackBuffer的分辨率。我們也可以通過r.ScreenPercentage把單獨的3D的分辨率改小。改分辨率是顯而易見提升GPU的手段,因為大部分時候我們都是pixel shader bound。
當然,帶寬也是很大的因素,引擎還可以靈活的設置SceneColor的格式,默認HDR下我們使用FP16的RGBA,在有些項目里我們可以用r.Mobile.SceneColorFormat來調整成R11G11B10或者RGBE的方式減少帶寬的占用。
當然要注意,移動端有些特性一來DepthBuffer,而支持DepthStencil fetch擴展的設備並不算太多,所以引擎默認會把Depth存到SceneColor的A通道,所以采用R11G11B10這樣的格式,可能就會使得某些依賴讀回深度的feature發生問題
2 |
材質 |
材質節點:Quality Switch
選項:fully rough,non metal
材質,也就是shader復雜度,我們可以設置Quality Switch使用不同復雜度的材質針對設備做優化。也可以直接使用fully rough,non metal之類的材質優化選項。當然濫用的話會使得最終生成的shader permutation的分裂(不要都勾了啊)數量很多,需要注意一下。
3 |
Shadow |
Shadow主要分為兩種。Modulate shadow我們已經不太適用,不過因為是單對象一個shadow volume,所以可以設置的shadow map利用率和精度比較高一些,在某些角色展示場景中可能比較有用。
CSM是全場景的動態shadow,非全動態光照時,移動端默認只對動態對象投射。可以通過Device Profile控制,例如可以在低端設備上沒有shadow,中等的設備上可以不做PCF filtering,好的設備上才開filtering做多次采樣。
4 |
地形 |
5 |
Base Pass pixel shader |
Base Pass pixel shader 效果上我們做了一些改進,sky light和refleciton的計算都做了修正,Specular換成了GGX,以前GGX在半精度的情況下,NoH接近1時會有比較大誤差,我們做了一些改進。
另外,在MobileBasePassPixelShader中的各個模塊,項目組也可以根據需要去除不需要的,例如IBL或者lightmap或者shadowmap的部分。
后處理,可以根據不同的設備做不同功能的開關。
Mask,在移動硬件上比較費的原因是因為如果寫depth時,某個像素發生clip/discard,硬件的earlyz就會失效,導致overdraw。
一個方案是開啟prepass畫mask,basepass做z equel;還有一個是引擎的LOD transition,在發生LOD時,不是直接換模型,會把兩個LOD模型都畫一下,通過一個dither的mask慢慢的漸變過去,這個時候可以采用類似於mask的行為,我們可以把LOD的結果dither的結果畫到Stencil,在BasePass時做stenciltest減少不必要的discard。