1. 程式人生 > >使用UE4開發VR專案_效能優化(三)_思路和方法

使用UE4開發VR專案_效能優化(三)_思路和方法

  本文是《使用UE4開發VR專案-效能優化》的第三篇。希望能和您分享一下在UE4 VR專案優化的基本思路方法和技巧。   前篇請參考這裡: (四)GPU渲染執行緒分析   如果遇到GPU瓶頸最快的驗證方法是改變解析度 降低解析度可以極大提高幀數   如果幀數有大幅度提高 即是GPU瓶頸。如果影響不大,可能是面數太多。   一般GPU渲染執行緒問題大多數可能性是畫素著色器(Pixel Shader)   ProfileGPU 命令可快速確定多個通道的 GPU 消耗   快捷鍵:Ctrl+Shift+, r.ProfileGPU.ShowUI 對 UI 進行抑制    建議不要在編輯器裡執行,開關編輯器也是有渲染開銷的。渲染資料會產生誤差。最好建立單獨遊戲(Standalone)執行環境
幾個值得注意的資料項: Base Pass Deferred Decals Lighting SSR(環境反射) Translucency(半透明) Postprocessing(後期處理效果) Particle(粒子)   **當Base Pass很高,可以使用命令列開啟Early Z Pass 可以降低 Base Pass 但同時會少量增加DRAW CALL**   檢查影響GPU效率的內容檢視有無超標現象   比如解析度、HMD SP、投影貼圖大小 ViewMode檢查   當三角面密度太高(高到三角面小於2*2畫素 往往發生在遠處物體上) 很容易出現問題。   分別檢視三角面、頂點、燈光數量、陰影設定、Actor數量
  LOD 關閉Shadew 、燈光螢幕面積   頂點太多   點動畫的Shader處理過於複雜   Tessellation 過於複雜   多重UV、過多的SG   檢視Staticmesh Editor裡點和麵數的差別是否大   點沒有合併、場景GPU粒子模擬數量過多 材質複雜度   Quality、Switch、Sin、 Pow、 Cos、Divide、Noise 這些節點很耗費資源   減少材質Shader的指令的數量。減少Texture Sample的數量:把經常使用到同一個物體上的圖案合在一張貼圖上;去掉對質量影響很小的貼圖,比如Specular、AO等。儘量使用QualitySwitch,Sin, Pow, Cos, Divide, Noise節點。多向量的計算量總是大於單向量的計算量。
   遮擋的culling計算   使用預算可見性剔除遮擋的物件。 延遲燈光   當使用lightingfunction、IE、接受投影、區域光、複雜shadingmodes的時候會變得更昂貴。反射SSR如果有問題,請關掉它。另外後期AO也很耗費資源。 (五)CPU邏輯執行緒分析   引起Draw Call 數量增多的原因 1、同屏Actor過多、材質複雜性過於複雜。 (合併Actor、降低材質複雜度) 2、材質ID太多、重用材質貼圖(把同一材質合併成一個物體) 3、每個Actor上的Feature 太多(主要增加投影屬性 增加Custom depth屬性) 4、過多燈光投影(檢查投影計算來自哪些物體被投影) Mesh Draw call 可以檢查靜態模型統計器來解決問題   Actor 設定 Feature 會增加DrawCall數量的是 custom depth   通過檢查工具來設定Showflag 使用Property matrix 來過濾   使用排除法,隱藏各種元素 查詢Draw Call 數量過多的因素   隱藏HUD (HUD佔用很多效能,Showflag.slate 1)   還可以使用移動裝置上的CMS增強陰影(4.12)   Rerdring>Mobile>Combined>StaticandCSM shadrring   接收物體選項:ReceicvCombined Static CSM shadows from stationary lights   UE4裡由於使用了延遲燈光,所以燈光的優化比前向渲染方便的多。最快速最有效的方法:使用靜態光源。如果使用的是動態光源,要減小Lighting Cull、半徑、衰減、 Cone大小角度等等。總之儘量減少重疊。   投影的開銷最大不是來自於PixelShader,而是來自於被投影的Mesh面數太多,還會被燈光數量,投影物體數量放大。關閉投影的燈光;減小範圍或張角;減面,加LOD   可以使用r.Shadow.MaxResolution 命令用來檢視陰影解析度資料。 Stat Game Stat Scenerendering   命令可以顯示   DrawCall數量 (計算公式:Mesh數量 * Mesh ID * 投影燈光數量)   Particle粒子   複雜的UI    Decal 貼花   靜態Mesh   動態Mesh    檢視影響最大的部分 ,再次使用Show Flag 開關渲染特性來檢視這些特性對DRAW CALL和幀數的影響 DrawCall優化:   開啟Statistics統計面板,按使用次數排序Actor。查詢使用次數最多的MESH 的ID ,如果ID是負數,那麼就可以做優化。   例:如果有60個MESH 資源 其中有一半使用同一資源,那麼就需要考慮需要用Merge Actors(融合Actor)來降低ID數量。優先減少使用頻率最高的Mesh ID。這個操作可以減少這60個MESH中50%以上的DrawCall.(優化模這步驟建議放在最後才去考慮)   Staionary燈光和動態燈光要儘量的少,並且能不投影的儘量不要投影。並且減少光源間Overlaid(覆蓋)   控制檯:r.VisualizeOccludedPrimitives 1   命令主要用來判斷場景中哪些遮擋掉的物體是被渲染的。   綠色的框就是沒有繪製的物件.,如果有Actor在遮擋後面但是並沒有被綠色的框畫出來,這時候引擎認為這個Actor是可見的,造成消耗。這種情況一般是邊界(Bounds)設定太大,一些非Root Motion的動畫要注意。當Actor從A點移動到B點,邊界會自動變大。就可能出現Actor 在遮擋物體後,但引擎仍然認為Actor是可見的並將它繪製出來。 粒子優化: StatParticle   把佔螢幕面積較大的,靠視點較近的,半透明較多的,材質複雜的,邊界盒較大的,粒子數量多的進行集中優化。離視點較遠的,可以使用LOD減少粒子繪製。當GPU進行立體渲染(Stereo Rendering)的時候,當視點越近,視差看到位移的位置就越遠。離視點近的粒子很容易出錯。引擎裡的粒子大多數都是面向攝像機的一個片。當引擎進行立體渲染的時候,粒子片總是朝向左邊攝像機。這時候右眼攝像機就出現了視差錯誤。離視點越近的粒子,立體化渲染時錯誤越明顯。為了避免這種錯誤,可以把粒子做成實體模型。 後期優化: 下面是一組後期優化組合:   Post processingsetting   Scene color   Fringe intensity 0   Grain intensity 0   Color gradingintersity 0   Bloom setting   LPV 0   Ambient occlusion 0   DOF Method Gaussian0   Motion blur all 0   AA FXAA   SSR 0 Max roughness0.01   Ambient cubemap 0 Profiler   最後可以使用Profiler將資料捕獲到磁碟上進行分析。 (六)可能遇到的問題和優化方法 最常見問題的原因包括:   測試環境不合適,比如燈光沒構建。   雙目渲染Actor太多,多材質ID   模型面數太多並且沒有使用LOD,沒有合理使用剔除   燈光型別使用沒有規劃,大面積動態投射陰影   大面積使用透明   HMD(頭顯)重新整理頻率 使用的燈光型別   構建 VR 專案時使用靜態光照 和 光照圖。如需使用動態光照,應儘量減少動態燈光的數量。如場景為室外,須將定向光照設為動態而非靜態,然後開啟級聯陰影貼圖(CSM)並儘量進行簡單設定,即可生成陰影。 VR & VFX   在 VR 專案中多數情況下,需要使用靜態網格體替代 2D 粒子模擬 VFX(如爆炸或煙霧拖尾)。近場特效或離攝像機非常近的特效在 VR 專案中效果上佳,但特效須由靜態網格體粒子組成。 VR 和透明度   在 3D 圖形渲染中,透明度的開銷非常之大,因為每幀都需對其進行整體再次求值,以確保未發生變化。正因為再次求值的存在,VR 專案中透明度的渲染開銷極大,大於其帶來的效果增益。然而,使用 DitherTemporalAA 材質函式可解決解決這一難點。此材質函式將使材質擁有外觀上的透明度,並避免常見透明度問題(如自我排序)。 多邊形減面   在 VR 遊戲中,玩家觀察的自由度更高,執行減面操作可能導致玩家看到不應該看到的物體,因此不能進行此操作。 陰影投影   去掉大部分動態著色器(DynamicShader),   用BP控制角色腳步離地面遠近來縮放腳下陰影片面大小。   Reflection Capture  減少 儘量不要重疊   關掉場景SSR  用材質模擬SSR效果   開啟SM聯級動態陰影 創造性作假:   三角面:   遠處mattinpaiting   投影面片,渲染在貼圖上 使用PrecomputedVisibilityVolume(預遮擋計算)   遮擋較多的地方可以大幅度提高渲染效率 使用CullDistanceVolume(裁剪體積)   根據Mesh在螢幕上所佔畫素尺寸裁剪模型 記憶體分配   CUP RENDER瓶頸   stat scenerendering   材質ID太多   重用材質貼圖,儘量把同一材質物體合成為一個物體   actor太多,如果材質複雜這個因素還會加成   合物體,尤其是中遠處   每個actor上的feature太多,比如增加投影的屬性,增加custom depth的屬性   太多燈光投影(這裡投影的消費來自於需要計算哪些物體需要被投影)   除了以上的優化手段,有更多規範需要在製做之前進行測試並制定規範。

  比如目標硬體是什麼?美術在製做原型的時候就去設定一些美術標準,根據標準來做,後期再做比較統一的優化,這樣效率可能會比較高一點。在做了基本的效能優化和分析後,接下來更進一步的就要進行美術迭代資源了做LOD,做剔除,調整渲染引數,優化材質指令。等等VR既需要表現好的的效果,又要更高的流暢度,同時VR本身的開銷又很高,所以對優化的要求就更大。本文粗略的整理了開VR專案中對於VR效能優化的一些思路流程和技巧。希望本文的分享能對您VR專案的優化有一點點的幫助。(後一篇文章將把文中流程整理成簡表供大家參考)