克服VR眩暈之幀數:提高UE4內容實時渲染效率

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  VR已經成爲了當今最火熱的一個話題,帶上頭盔以後,今後進入一個奇妙的世界,在這裏你再也不是觀衆,你參與這個世界發生的每一件事件。整個世界今後不同凡響。在賽道上飛馳,在戰場上縱橫。

  可是生理機制讓咱們的大腦在身體並無移動,而視覺在不斷告訴我正在飛速前行的迷惑中產生了暈眩。如何解決由於VR而產生的眩暈,就成爲每一位設計師須要面對的問題。

  引發VR眩暈有不少緣由,好比設計上的,技術上的。渲染的幀數高低一定是其中一個最主要的緣由之一。關於UE4裏對VR內容的優化方法和思路大部分是和傳統的3D遊戲優化是一致的,有部分是VR尤爲相關的。接下來就以Oculus爲平臺和你們一塊兒分享一下在UE4裏常見內容的一些設置和優化的思路和方法。
 dom

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  首先咱們來看一個優化過程的實例,先有個大概的瞭解。打開一個UE4下載的項目,particle cave,VR preview,帶上眼鏡就能體驗了,對,就這麼簡單,雖說這個並非一個針對VR的項目。

  這裏作了一些簡單的設置:

  1. 發現攝像機是以預設軌道在飛,並且明顯感受幀率不高,哦,好暈。爲了比較方便衡量接下來優化,我作了一些攝像機的設置,讓攝像機開始遊戲後固定在一個我認爲幀數最低的畫面。

  2. 確保幀數沒有被限制住,關閉垂直同步,把最高幀數限制上限提升好了,再run一下,固定住了,轉轉頭能夠,真的挺卡的。
 ide

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  再接個命令證明一下,最直接和GPU渲染效率有關的就是分辨率。

  HMD SP 100   54FPS
幀數立馬提升很多,果真是GPU渲染瓶頸!
 工具

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  下降渲染品質
Adjust scalability to medium  72FPS
成功了? 尚未哦,這個太暴力了,這個確定不是最優的優化結果了。由於確定有些能夠進一步作大量的優化,有些和視覺相關比較大的調整能夠提升質量。而非粗暴的都調低了,那接下來就得找緣由了。
 測試

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  打開GPUprofiling: (Ctrl+Shift+,)
看下最大的GPU開銷在哪裏:

  Base pass:              Deferred Decals
  Lighting:                ReflectionEnvironment:
  Translucency:        Postprocessing:

  從最大開銷的幾個點入手:BASEPASS: 敲入幾個渲染選項命令行:r.Earlyzpass 1:增長draw calls和一部分GPU的消耗,但大大下降base pass的消耗;關閉了一些不須要的PP效果;一套最優POP設置組合:
 優化

  Postprocessing setting:動畫

  Scene color;ui

  Fringe intensity                  0命令行

  Grain intensity                   0scala

  Color grading intensity     0ssr

  Bloom setting

  LPV                                     0

  Ambient occlusion            0

  DOF Method Gaussian, 其餘參數 所有 0

  Motion blur all                  0

  AA FXAA

  SSR 0 MAX roughness      0.01

  Ambient cubemap            0

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  再VR preview,嗯,仍是75,固然了,DK2上頂格是75,再優化看不出效果13.39ms        75FPS
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  把品質調高成high   Scalability high,仍是75,哈哈,沒問題!如今算優化完了吧? 其實還能夠再優化,這時候的優化就是以儘可能提高畫質但不下降幀數爲目標。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  看看哪些還能夠優化的?固然有!以前的Translucency花費好高。Viewmode: shade complexity 好紅, 一堆overdraw;Decal的花費也很高, Stat scenerendering, decals in view環境反射的花費很高: 選中sphere reflection capture, 看一下總共有幾個,觀察他們影響範圍是否重疊嚴重。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  Vertex intensity: 好密啊。高密度的三角面幾乎看上去就像一個實體了, 一個三角面的大小在屏幕上的面積小於2*2個像素就會極大的增長開銷。

  還有Particle 。如今基本上已經定位到可執行層面的緣由了,一些緣由也已經經過可接受的渲染參數調整解決了;另一些就必需要artist來優化Assets自己了。哪些工做最快,質量損失最小,可以換其餘更能提高品質的選項。

  啓示他們並不須要這麼多面,assets的優化須要更多的時間。把scaleability有些選項提高到EPIC,固然他們並非所有。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  一些引發DRAW CALL數量多的緣由:

  同屏看到的Actor太多,若是材質複雜這個因素還會加成。 合併Actor,尤爲是中遠處;

  材質ID太多(or Section; Mesh elements)。重用材質貼圖,儘可能把同一材質物體合成爲一個物體;

  每一個actor上的feature太多。主要是增長投影的屬性,增長custom depth的屬性;

  太多燈光投影(這裏投影的消費來自於須要計算哪些物體須要被投影);
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  MESH DRAW CALL每每是個大頭,MESH ID 的數量能夠在STATISTICS統計能夠很方便的查看,從經驗判斷哪些資源製做不合理。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  關於ACTOR設置feature會增長DRAW CALL數的是投影和custom depth,能夠經過一些工具來檢查這些設置。使用property matrix來過濾,檢查,並修改。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  另一個常用的查找緣由的方法排除法:
經過隱藏各類元素,尋找哪一個是致使DRAW CALL數量的大頭
記得隱藏HUD,有的時候HUD也是個大頭之一。

  Showflag.slate  一、若是是GPU瓶頸,最快速的驗證方式就是改變分辨率,下降分辨率能夠極大提升幀數。爲了抵消畸變糾正而產生的圖像模糊,或者分辨率的丟失,在渲染的的buff裏每每是實際屏幕尺寸的120-130%,這樣增長了圖像的銳利度,但下降了渲染的速度。

  HMD SP全稱是HMD 的screen percentage, 這個參數就是來修改渲染buff的尺寸的,HMD SP 120是默認值,改爲100看看。

  若是像剛纔例子看到的,幀數有大幅度的提升,那就是GPU負擔太大的問題了,若是分辨率的改變對於幀數影響不大,頗有多是由於面太多了。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  對這些內容重點作檢查,看看有沒有超標的現象出現:
 

  • 分辨率
  • HMD SP
  • 投影貼圖
  • 面數/點數(燈光的多少,陰影的設置,多少物體)
  • LOD,關閉shadow,燈光屏幕面積
  • 面數密度過高,高到一個三角面小於2*2的像素,這個每每發生在遠處物體
  • 點處理,點太多
  • 點動畫的shader太複雜
  • tessellation太複雜
  • 太多UV,太多SG
  • 查看staticmesh editor裏點和麪數的差異是否大
  • 點沒有合併等
  • view cost(HZB occlusion culling)
  • Precumputed visibility volume
  • Scene cost GPU particle simulation
  • 材質複雜度
  • quality switch,sin, pow, cos, divide, Noise很費
  • 因爲Texture 太多,太大 Texture caching反覆的page in and out of 顯存
  • 遮擋的culling計算
  • Precumputed visibility volume
  • 延遲燈光


  當使用lighting function,IES,接受投影,區域光,複雜shading modes的時候會變得更貴。反射ssr有問題,關掉。 後期, AO,很費。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  知道哪裏有問題了,接下來就能夠着手行動了,但以前作個目標規劃仍是能夠事半功倍的。最小化圖像質量妥協,是一種有的放矢的妥協策略。好比高質量的陰影對於高品質的抗鋸齒而言對於最終項目實際的表達效果次要。減少陰影品質來換取高品質AA就是一種有的放矢的妥協策略。所以儘可能大的減少不是很是關心的渲染品質部分,增長更可見的渲染品質部分。

  從容易作起,從開關一些渲染選項,品質參數調整,到直接刪東西,優化一個用到幾百次的物件,這些都是立竿見影的方式,這樣能夠作容許的時間計劃內完成目標,若是有更多時間和預算能夠對相對低性價比的。目標75幀是必須的,不要說68,70,都不行,必須75,作實際體驗中有很大區別。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  最多見的問題所在:
 

  • 測試環境不合適,燈光沒有build
  • Actor或者材質ID太多
  • 面太多,沒有任何的LOD設置
  • 燈光使用沒有節制: 各類動態投影,燈光類型隨意
  • 沒有合理的設置CULL的條件
  • 透明太多
  • Postprocess過高級了


  這些緣由又互相影響,一方面的增長也會增長另外方面的開銷:
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  其餘一些VR的特有行爲:
 

  • VR 須要畸變色差糾正
  • VR須要雙屏
  • VR須要更大的渲染分辨率
  • VR須要傳遞傳感器信息


  好比對於Oculus部分是在驅動層級作掉了,好比如何糾正畸變,如何雙屏,如何傳遞傳感器信息。對於傳感器信息和視頻匹配的準確性,以及渲染的屏幕覆蓋率,在UE4裏是能夠根據須要來修改的,除了這些,其餘就和以往的優化思路一致了。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  建立測試環境,找緣由:
 

  • Testing in a stable enviroment
  • run Standalone game
  • use pause or slomo 0.001 to prevent random numbers
  • Measuring few times
  • 確保幀數不封頂
  • s.Vsync 0
  • s.MaxFPS
  • 瞭解瓶頸
  • GPU瓶頸
  • profileGPU(ctol+shift+,)
  • 分辨率
  • HMD SP
  • 投影貼圖
  • 面數/點數(燈光的多少,陰影的設置,多少物體)
  • LOD,關閉shadow,燈光屏幕面積
  • 面數密度過高,高到一個三角面小於2*2的像素,這個每每發生在遠處物體
  • 點處理,點太多
  • 點動畫的shader太複雜
  • tessellation太複雜
  • 太多UV,太多SG
  • 查看staticmesh editor裏點和麪數的差異是否大
  • 點沒有合併等
  • view cost(HZB occlusion culling)
  • Precumputed visibility volume
  • Scene cost GPU particle simulation
  • 材質複雜度
  • quality switch,sin, pow, cos, divide, Noise很費
  • 遮擋的culling計算
  • Precumputed visibility volume
  • 延遲燈光
  • 當使用lighting function,IES,接受投影,區域光,複雜shading modes的時候會變得更貴
  • 反射ssr有問題,關掉,後期AO,很費
  • cup瓶頸,CUP GAME瓶頸
  • stat game
  • AI複雜度
  • BP
  • raycast
  • 物理
  • 內存分配
  • CUP RENDER瓶頸
  • stat scenerendering
  • 材質ID太多
  • 重用材質貼圖,儘可能把同一材質物體合成爲一個物體
  • actor太多,若是材質複雜這個因素還會加成
  • 合物體,尤爲是中遠處
  • 每一個actor上的feature太多,好比增長投影的屬性,增長custom depth的屬性
  • 太多燈光投影(這裏投影的消費來自於須要計算哪些物體須要被投影)
  • 找到瓶頸的方法:
  • stat unit
  • disable一些stuff,而後看效率上的區別
  • 一些可調的show flag
  • 開關屏幕反射
  • 開關AO
  • 開關AA
  • 開關bloom
  • 開關延遲燈光
  • 開關燈光類型
  • 開關動態陰影
  • 開關GI
  • 開關後期
  • 開關環境反射
  • 開關折射
  • 開關貼畫
  • 開關半透明
  • 開關tessellation
  • viemode
  • ProfileGPU
  • ProfileCPU
  • stat game
  • stat scenerendering
  • Profiler

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  後期優化首選項:
 

  • Scene color fringe;
  • ambient cubemap,
  • image based lens flares;
  • LPV off;
  • Grain intensity,
  • DOF off,
  • ssr off,
  • or roughness 0.01;
  • Motion blur off

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  最後選擇的參數須要應用到DEVICE PROFILES裏或者BP裏:
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  減少 shader的 instruction的數量;減小Texture sample的數量;把常用到同一個物體上的Pattern合在一張貼圖上;去掉對質量影響很小的貼圖,好比Specular,AO在實際狀況中平衡來使用quality switch,sin, pow, cos, divide, Noise,多向量的計算老是大於單向量的計算。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  UE4裏因爲使用了延遲燈光,因此燈光的優化比前向渲染方便的多。最快速最有效的方法:使用靜態光源。若是使用的是動態光減少 Lighting cull,半徑,衰減,Z INTERSSECTION, cone大小角度。總之儘可能減小重疊。
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 


  投影的開銷最大每每不是來自於pixel shader,而是來自於被投影的mesh面數太多,還會被燈光數量,投影物體數量放大。關閉投影的燈光;減少範圍或張角;減面,加LOD r.Shadow.MaxResolution
 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 

 

  • 創造性做假;
  • 三角面;
  • 遠處mattinpaiting;
  • 投影面片,畫在貼圖上。

 

大神分享乾貨:克服VR眩暈之幀數:提高UE4內容實時渲染 ...

 

  一個做品的優化不是一朝一夕的事情,須要肯定目標配置:肯定最低配置,配置範圍小,這樣的優化才更有針對性,而且學會在開闊的視野在設計時須要巧妙的避免沒必要要的內容,學會如何制定Budget:質量優先驅動;快速原型製做;分析制定。   對內容製做者前期的培訓花費是值得的,完成這些工做以後,一個高品質的VR做品就會誕生。

相關文章
相關標籤/搜索