伊酷科技技術(shù)合伙人朱稼萌,前段時(shí)間分享了他們?cè)赨nreal Engine VR移動(dòng)端進(jìn)行優(yōu)化的經(jīng)驗(yàn),從多個(gè)角度剖析影響VR游戲畫面優(yōu)化的原因。
以下為演講實(shí)錄:
大家下午好,我是來自伊酷科技的主講朱稼萌。
今天主要是給大家講一下關(guān)于Unreal移動(dòng)端優(yōu)化。因?yàn)槲覀児局白龅挠螒蚧旧隙际荘C VR游戲,所以在把這些游戲移植到移動(dòng)端的時(shí)候碰到很多問題。今天主要是針對(duì)這些問題,把我們的解決方案跟大家分享一下。
為了讓邏輯更清楚一點(diǎn),我們先把可以優(yōu)化的部分解剖一下。在VR游戲中影響優(yōu)化的畫面因素主要有三個(gè)方面:
第一個(gè)是元素相關(guān):相當(dāng)于模型的材質(zhì)本身
第二個(gè)是渲染相關(guān):主要是指除了元素模型之外的其他模型,包括燈光、特效、陰影、后期、體積物和反射
第三個(gè)幀率相關(guān):需要將幀率穩(wěn)定在一個(gè)比較高的階段
下面講一講VR游戲在PC端與移動(dòng)端有何不同?
首先因?yàn)樵谝苿?dòng)端中如果需要打光的話,需要禁用HDR、體積物,使用OpenGL ES3.1,所以大部分后期的項(xiàng)處于不可用的狀態(tài):燈光只能使用靜態(tài)燈光,特效的使用也需要非??酥?。所以今天的內(nèi)容主要針對(duì)如何使用簡(jiǎn)單的操作把上述失去的東西彌補(bǔ)回來。
這個(gè)場(chǎng)景是我們目前正在做的一個(gè)體育類拳擊VR游戲場(chǎng)景為例。
這是一張?jiān)赑C中的效果展示圖:
然后下面(右邊)這張是去掉HDR效果,使用ES3.1渲染通道的效果圖:
通過畫面的對(duì)比可以看出進(jìn)入移動(dòng)端之后:
既然這些效果在進(jìn)入移動(dòng)端之后消失,那么我們需要想辦法通過別的途徑把它加回去。有兩種辦法,一種做法,是修改圖層的渲染通道,這種方法相對(duì)麻煩,我們通常使用另一種相對(duì)簡(jiǎn)單的做法。
視覺效果優(yōu)化-場(chǎng)景
首先講一下Unreal的渲染途徑。
Unreal的靜態(tài)燈光渲染之后會(huì)把場(chǎng)景模型的陰影存放在WholeScene的LightMap,其中有HQ和LQ兩種,LQ里面就是我們移動(dòng)端會(huì)用到的LightMap和AO,我們可以將它解析出來,或者通過第三方的三維軟件像MAX、Maya之類的拿出來,然后將這些效果加強(qiáng)到材質(zhì)中的漫反射和自發(fā)光里,下圖有具體的效果圖:
還可以導(dǎo)入一個(gè)LightColor參數(shù),方便后期整體調(diào)節(jié)色彩范圍,這是為了彌補(bǔ)失去后期之后沒有辦法整體調(diào)整場(chǎng)景顏色。
下圖為視圖演示:
然后是角色的皮膚,如何在移動(dòng)端讓角色皮膚顯得更真實(shí)一點(diǎn)。
視覺效果優(yōu)化-角色
下圖為正常情況下,光線照射到物體上的反射路徑:
正常情況下,部分光線會(huì)直接反射掉,光線是在物體上有一部分是直接反射掉,那還有另一部分光線會(huì)進(jìn)入到物體內(nèi)部進(jìn)行一些計(jì)算,然后最后反射到空氣中。一般,我們把這種反射稱為次表面反射。
我們來看一下在移動(dòng)端使用不開光的一個(gè)效果。
可以看到在移動(dòng)端即使在使用動(dòng)態(tài)燈光下:
這種方法使用比較廣泛,但在VR游戲中用處更大,它不僅可以讓皮膚的過渡更合理更飽滿,而且可以模擬動(dòng)態(tài)燈光實(shí)時(shí)的照射,而不需要真正使用動(dòng)態(tài)燈光。
正常情況的燈光模擬是通過芯片進(jìn)行模擬,這里只是通過統(tǒng)計(jì)簡(jiǎn)單的預(yù)積分的原理,簡(jiǎn)單地把光線在正常情況下的顏色、亮度體現(xiàn)在這張圖上。這里相關(guān)的信息是光線的入射角度、模型曲率,所以我們只要控制這兩個(gè)變量,就能得到那個(gè)點(diǎn)實(shí)際的顏色。
這里通過導(dǎo)入一個(gè)材質(zhì)參數(shù),從外部傳入一個(gè)我們自己做的模擬燈光的組件,然后再增加一個(gè)曲率的參數(shù),然后找到這張圖上的點(diǎn)。相當(dāng)于是自己做的一個(gè)模擬燈光的組件,轉(zhuǎn)到剛才那個(gè)參數(shù)。
下圖是在一個(gè)球體上實(shí)際的效果,暫時(shí)沒有將曲率的效果體現(xiàn)在上面,只是一個(gè)簡(jiǎn)單光照控制的效果。
下面這張是增加了曲率統(tǒng)計(jì)之后的效果,雖然沒有動(dòng)態(tài)燈光照射,但通過預(yù)積分的處理方式,讓人皮膚應(yīng)該有的光澤過渡和透澈的效果都有體現(xiàn)。用這個(gè)方式可以達(dá)到一定預(yù)期效果,又避免動(dòng)態(tài)燈光損耗掉一些性能。
視覺效果優(yōu)化-陰影
Unreal中動(dòng)態(tài)物體的陰影效果一般使用調(diào)制陰影,級(jí)聯(lián)陰影和膠囊體陰影三種,其中調(diào)制陰影,級(jí)聯(lián)陰影必須使用動(dòng)態(tài)燈光才能調(diào)制,膠囊體陰影雖然能夠使用靜態(tài)燈光,但對(duì)ES3.1效果不是太好,因此準(zhǔn)備自行做一個(gè)簡(jiǎn)單陰影系統(tǒng),通過材質(zhì)實(shí)行。最后實(shí)現(xiàn)的效果如下圖:
通過球形遮罩,暴露一個(gè)擬角色位置的參數(shù),通過球形遮罩實(shí)時(shí)計(jì)算它應(yīng)該出現(xiàn)的位置和大小,相當(dāng)于做一個(gè)組件,或在需要投影的角色身上做一個(gè)參數(shù),然后在擴(kuò)充函數(shù)過程中把位置參數(shù)傳給剛才的函數(shù),最后就能得到這樣的效果。
視覺效果優(yōu)化-反射
進(jìn)入ES3.1之后,反射效果不是很理想,因此想通過簡(jiǎn)單的方法實(shí)現(xiàn)反射,但目前暫時(shí)沒有找到特別合適的方法。
目前采用的方法就是不使用反射,但如果必須使用反射的話,在角色下面放一個(gè)重復(fù)的角色,然后在你需要反射的地板上增加一個(gè)繪制功能,直接去繪制他的透明度。
雖然正常的反射,通過打開動(dòng)態(tài)燈光可以得到一定的增強(qiáng),但我們這邊沒有選擇打開動(dòng)態(tài)燈光,主要是因?yàn)殚_了動(dòng)態(tài)燈光之后,會(huì)讓場(chǎng)景處于一個(gè)非常不穩(wěn)定的狀態(tài),損失很多性能。我們測(cè)試之后發(fā)現(xiàn),可能這種光對(duì)性能的損失更小一點(diǎn),因?yàn)槲覀儼l(fā)現(xiàn)移動(dòng)端對(duì)模型面數(shù)的承受力比想象中要稍高一點(diǎn),而且下面的模型可以將LOD盡量降低一點(diǎn)。
這個(gè)方式我們一般推薦在場(chǎng)景比較大的時(shí)候使用,比如一整個(gè)房間地板做反射。在模型制作的時(shí)候把房間做鏡像,在美術(shù)方面把下面部分做簡(jiǎn)化,美術(shù)在哪邊就在哪邊進(jìn)行涂抹。
方法雖然取巧,但實(shí)踐效果還不錯(cuò)。
視覺效果優(yōu)化-動(dòng)態(tài)燈光
盡量不要使用動(dòng)態(tài)燈光,雖然動(dòng)態(tài)燈光可以直觀提升陰影和反射,但存在很大的不穩(wěn)定性,因?yàn)橛肋h(yuǎn)不知道玩家什么時(shí)候會(huì)進(jìn)行操作,生成一些粒子,或者動(dòng)態(tài)燈光與其他燈光產(chǎn)生影響。但如果是比如單一的游戲,或者能確定玩家去做什么操作時(shí),可以嘗試使用。
視覺效果優(yōu)化-粒子特效
在制作的過程當(dāng)中,發(fā)現(xiàn)特效粒子占用了很多游戲硬件的性能,該注意的地方為以下幾點(diǎn):
媒體
如果是短暫重復(fù)利用的視覺效果可以優(yōu)先使用粒子,但如果是常期一直占用畫面,只是起到一個(gè)場(chǎng)景氣氛作用的話,可以試著使用一些視頻特效,只需要把特效分為黑、白蒙版跟正常特效,在材質(zhì)中做一個(gè)切割,把它變成一個(gè)透明的材質(zhì)??傮w來說,它對(duì)場(chǎng)景的性能消耗會(huì)小一點(diǎn),此外,它受取消HDR和ES3.1用戶端渲染的影響很小。
霧效
除非情況特殊,否則盡量不要使用粒子去模仿霧效,如果需要,可以先建一個(gè)藍(lán)圖類,然后在藍(lán)圖類中去做兩個(gè)錯(cuò)位之間的移動(dòng),去檢測(cè)本身和角色之間的距離,去調(diào)整它的透明度,或者控制他的生命周期。
景深
在VR游戲中用的比較少,一般在遠(yuǎn)景的時(shí)候,如果需要用到景深,把遠(yuǎn)景變成貼圖,在不同距離間做一定的模糊處理即可
幀數(shù)優(yōu)化-分析
幀數(shù)的優(yōu)化,主要在以下四點(diǎn)。Stat unit,F(xiàn)rame 每幀所花費(fèi)的時(shí)間;Game CPU游戲邏輯線程,這個(gè)主要和程序相關(guān);Draw CPU渲染線程,是CPU去采取產(chǎn)品中需要渲染的東西他所花的時(shí)間;GPU CPU渲染線程,代表實(shí)際渲染所花的時(shí)長(zhǎng),可以通過在游戲中打出指令,看到底是哪塊需要做調(diào)整。
幀數(shù)優(yōu)化-DrawCall
幀數(shù)優(yōu)化-DrawCall的影響因素主要在四個(gè)方面:首先是模型數(shù)量,模型數(shù)量太多,會(huì)導(dǎo)致性能下降,如果是在較大的場(chǎng)景中,合并需要考慮到物品剔除是否方便;第二個(gè)是材質(zhì)數(shù)量,需要確定一個(gè)模型中的不同材質(zhì)會(huì)出現(xiàn)多種狀況;第三是Actor中的Component數(shù)量,我們測(cè)出來對(duì)Drawcall第二部分有一定影響;第四個(gè)是SceneCaptureActor的調(diào)用,場(chǎng)景采集一般用于做鏡子之類的東西,最好不要調(diào)動(dòng),萬一需要調(diào)用,要注意控制生命周期,降低它接觸的大小。
幀數(shù)優(yōu)化-Game
在幀數(shù)優(yōu)化-Game的優(yōu)化上,要盡量少調(diào)用敏感程序,比如:Forloop, GetallActorsOfClass, SpawnActor, Tick,會(huì)對(duì)Game的速度產(chǎn)生影響;在使用資源讀表調(diào)用的時(shí)候沒有設(shè)置為軟引用。
幀數(shù)優(yōu)化-GPU
最后一點(diǎn)是關(guān)于幀數(shù)優(yōu)化-GPU ,要考慮著色器的復(fù)雜程度。著色器和使用材質(zhì)有關(guān)系,建議使用不透明的材質(zhì),優(yōu)先級(jí)高于帶蒙版的材質(zhì)高于使用透明度的材質(zhì);還要考慮模型的面數(shù),以及燈光的調(diào)用,盡量使用動(dòng)態(tài)燈光,不要使用靜態(tài)燈光。
基本上就是以上內(nèi)容,謝謝。
投稿/爆料:tougao@youxituoluo.com
稿件/商務(wù)合作: 六六(微信 13138755620)
加入行業(yè)交流群:六六(微信 13138755620)
元宇宙數(shù)字產(chǎn)業(yè)服務(wù)平臺(tái)
下載「陀螺科技」APP,獲取前沿深度元宇宙訊息