如果你正在進(jìn)行移動(dòng)端Unity開(kāi)發(fā),那么這篇博客你絕對(duì)不能錯(cuò)過(guò)!最近,我們?yōu)閺V大用戶提供了面向虛幻4游戲引擎的PowerVR性能建議,如果你更多時(shí)候使用的是Unity游戲引擎,那么我們現(xiàn)在就將與你分享PowerVR性能建議文檔中關(guān)于提升Unity性能的一些方法。
大部分優(yōu)化操作都適用于移動(dòng)平臺(tái),但是也有一些是專門(mén)面向PowerVR平臺(tái)的。也就是說(shuō),無(wú)論你的目標(biāo)應(yīng)用平臺(tái)是什么,幾乎所有的情況下都能夠帶來(lái)性能的提升,采用這些建議通常是很好的做法。
編譯設(shè)置
紋理壓縮
首先一定要確保使用了紋理壓縮,這不僅能壓縮存儲(chǔ)空間,同時(shí)也會(huì)節(jié)省運(yùn)行時(shí)的帶寬,這是提升性能且節(jié)約電池壽命最好的方法之一。紋理壓縮的優(yōu)點(diǎn)是它們會(huì)一直處于壓縮狀態(tài)直到它們要被用于某個(gè)片段處理操作的時(shí)候。
Unity支持各種各樣的紋理壓縮方法,默認(rèn)方法是ETC,當(dāng)然你也可以選擇其他方法,如下圖所示:
壓縮格式選項(xiàng)介紹如下:
-
ETC作為一種紋理壓縮格式支持所有的設(shè)備,但是在壓縮質(zhì)量和大小方面被ETC2所取代,盡管ETC很簡(jiǎn)單并且有廣泛的支持,但是它不支持阿爾法(Alpha)通道而且壓縮率也不是很理想。
-
PVRTC這種紋理壓縮格式僅支持PowerVR硬件平臺(tái),支持Alpha通道,具有最好的壓縮比率和壓縮質(zhì)量,通過(guò)高度靈活的配置一定能夠滿足質(zhì)量/大小的要求。
-
ASTC是一個(gè)開(kāi)源的壓縮格式,支持大部分平臺(tái),它支持Alpha通道,具有與PVRTC相似的壓縮率和可配置性。
-
DXT作為一種壓縮格式廣泛的被桌面應(yīng)用所支持,在移動(dòng)領(lǐng)域由于授權(quán)問(wèn)題,目前只有Nvidia Tegra平臺(tái)支持
盡管紋理格式設(shè)置是全局的,但是每一幀的紋理壓縮質(zhì)量都可以調(diào)節(jié),如下圖所示:
質(zhì)量設(shè)置
最普遍的優(yōu)化方法之一就是降低每個(gè)像素點(diǎn)的光數(shù)量,允許的光數(shù)量將直接影響GPU的負(fù)載,因?yàn)閳?chǎng)景內(nèi)的每個(gè)對(duì)象都需要在不同的光情況下進(jìn)行渲染。這意味著每個(gè)網(wǎng)格都需要通過(guò)一個(gè)光照,在像素光數(shù)量選項(xiàng)設(shè)置中光數(shù)量的最大值將影響網(wǎng)格的效果。如果影響網(wǎng)格的光數(shù)量超過(guò)了上限,那么只有最重要的光將會(huì)被用于渲染每個(gè)網(wǎng)格,如果光線是均勻分布的且不重疊,那么在任何給定的時(shí)間內(nèi)你都可以增加有效的光數(shù)量。
如何改變每個(gè)像素允許的光數(shù)量如下圖所示:
確保陰影地圖分辨率是“剛剛好”,使用最低的設(shè)置仍然看起來(lái)效果會(huì)很好,如果陰影地圖分辨率太高,這不僅會(huì)浪費(fèi)內(nèi)存和帶寬而且也會(huì)影響緩存的效率。
如下圖所示陰影分辨率也可以根據(jù)每個(gè)光來(lái)設(shè)置,各自的光陰影分辨率總是優(yōu)先于全局的質(zhì)量設(shè)置,除非選擇使用“Use Quality Setting”選項(xiàng)。
如果相機(jī)角度允許并且級(jí)聯(lián)設(shè)置不會(huì)覆蓋很多區(qū)域的話,適當(dāng)調(diào)整陰影級(jí)聯(lián)的數(shù)量也是一個(gè)很好的主意。這種情況下,你可以降低級(jí)聯(lián)的數(shù)量,從4降到2或者沒(méi)有級(jí)聯(lián)。
當(dāng)然也可以通過(guò)改變陰影級(jí)聯(lián)設(shè)置從“close”到“stable”來(lái)增加有效的陰影地圖分辨率,雖然能夠增加有效的陰影地圖分辨率但是代價(jià)是會(huì)出現(xiàn)不定的閃爍。
-
Close fit意味著陰影渲染算法將會(huì)盡可能高效的使用設(shè)置好的陰影地圖分辨率,結(jié)果是更高質(zhì)量的陰影效果,然而這也會(huì)導(dǎo)致一些閃爍問(wèn)題,尤其是當(dāng)相機(jī)或者光移動(dòng)的時(shí)候,我們使用“軟陰影”選項(xiàng)可以把這些閃爍隱藏掉。
-
Stable fit表示陰影渲染將盡可能的使陰影邊緣穩(wěn)定,這意味著當(dāng)相機(jī)或者光移動(dòng)時(shí)陰影不會(huì)再有閃爍的現(xiàn)象,當(dāng)然這也會(huì)使得陰影質(zhì)量降低。
“Close fit”和“Stable fit”兩者之間的平衡需要仔細(xì)的考慮,“close fit”需要較低分辨率的陰影看起來(lái)質(zhì)量更高一些,但是需要更多的過(guò)濾(軟陰影)來(lái)隱藏閃爍,另一方面“stable fit”則需要更高分辨率陰影看起來(lái)質(zhì)量也高一些,但是它不需要太多的過(guò)濾,因?yàn)樗鼪](méi)有閃爍問(wèn)題。
網(wǎng)格設(shè)置
LOD(細(xì)節(jié)等級(jí))是管理幾何圖形復(fù)雜度非常好的一個(gè)工具,當(dāng)相機(jī)遠(yuǎn)離某個(gè)給定的對(duì)象時(shí)你可以使用它們來(lái)對(duì)幾何圖形的詳細(xì)程度,這種方式不會(huì)使屏幕上的幾何圖形超過(guò)一定的數(shù)量,而且質(zhì)量也是足夠的。
注意LOD是移動(dòng)端優(yōu)化幾何內(nèi)容非常好的一種方式,設(shè)置更高的LOD這樣較低分辨率的網(wǎng)格就可以被使用了。
下面的截圖展示了如何在質(zhì)量設(shè)置中設(shè)置LOD偏差:
注意減少幾何圖形負(fù)載會(huì)幫助減少計(jì)算量,使得器件不至于嚴(yán)重發(fā)熱同時(shí)具有更長(zhǎng)的電池壽命。
圖形設(shè)置
如果你需要HDR渲染,使用FP16來(lái)取代RG11B10會(huì)更好,因?yàn)樗鼤?huì)提供更好的精度和質(zhì)量。
延遲渲染 vs 前向渲染
對(duì)于光設(shè)置Unity提供延遲渲染和前向渲染兩個(gè)選項(xiàng),對(duì)于使用很多重疊光源的場(chǎng)景,延遲渲染通常會(huì)提供更好的性能,然而在移動(dòng)端前向渲染則會(huì)提供更好的性能,因?yàn)橐恍┘铀傺舆t渲染的高級(jí)功能比如PLS(像素本地存儲(chǔ))在移動(dòng)端是不被Unity支持的,對(duì)于少量光的場(chǎng)景,前向渲染具有更好的性能因?yàn)樗拈_(kāi)銷更少,下面的截圖展示了如何在延遲渲染和前向渲染之間進(jìn)行選擇:
播放器設(shè)置
最新的安卓設(shè)備(包括PowerVR)都能夠支持Vulkan API,Vulkan真的很好,它能夠讓你減少CPU的負(fù)載,并且更好的控制同步操作。它更適合多核CPU,因?yàn)樗С窒騁PU提交多線程命令。
當(dāng)選擇要使用的API時(shí),Unity會(huì)嘗試使用最先進(jìn)的。然而如果硬件平臺(tái)不支持你選擇的API,Unity則會(huì)嘗試其他API,從而獲得最廣泛的支持。
如果你選擇使用OpenGL,那么使用多線程渲染可能是個(gè)好主意,這個(gè)選擇會(huì)確保渲染和其他操作在各自獨(dú)立的線程下運(yùn)行,這意味著不同操作會(huì)被更好的分配到不同的內(nèi)核來(lái)執(zhí)行,雖然這不會(huì)像Vulkan的多線程命令提交特性那樣好,但是這仍然會(huì)大大提升CPU的性能。
著色器
在著色器中對(duì)于透明表面可以使用alpha blending取代alpha test/clip()方法,注意alpha test與之前使用的深度測(cè)試方法一樣會(huì)損壞整體架構(gòu)。在PowerVR平臺(tái)上,底層原語(yǔ)會(huì)在片段處理流水線階段之前執(zhí)行深度寫(xiě)入操作,這使得PowerVR設(shè)備不會(huì)覆蓋底層原語(yǔ)的操作,從而節(jié)省了大量的計(jì)算時(shí)間和帶寬。
然而PowerVR的alpha tested/discard原語(yǔ)只有在片段著色器執(zhí)行完成之后才能夠進(jìn)行數(shù)據(jù)寫(xiě)入緩存操作,這種延遲深度寫(xiě)入會(huì)影響性能,因?yàn)橹钡絘lpha tested原語(yǔ)完成更新深度緩沖區(qū)操作后,后續(xù)的原語(yǔ)操作才能夠執(zhí)行。
在所有的移動(dòng)架構(gòu)平臺(tái)上,不使用部分色彩遮蓋是有好處的,最好設(shè)置為RGBA或者0,如果你使用部分色彩遮蓋,那么之前的數(shù)據(jù)幀不得不重新讀取,這是由全屏原語(yǔ)操作來(lái)執(zhí)行的,會(huì)將它作為紋理來(lái)處理,而且這個(gè)紋理需要被部分清除,通過(guò)提交另一個(gè)全屏原語(yǔ)命令來(lái)完成。
盡管所有的移動(dòng)架構(gòu)平臺(tái)都非常擅長(zhǎng)于半精度計(jì)算,但是PowerVR卻非常的適合,因此一定要盡可能的利用這個(gè)特性,相比高精度(FP32),在著色器中使用半精度(FP16)會(huì)帶來(lái)顯著的性能提升,這主要?dú)w功于專用的FP16積之和(SOP)計(jì)算流水線,在每個(gè)周期內(nèi)能夠并行處理兩個(gè)SOP操作,理論上使浮點(diǎn)操作的吞吐量增加了一倍,F(xiàn)P16 SOP流水線在大部分PowerVR Rougue圖形內(nèi)核上都有采用,當(dāng)然這取決于具體的型號(hào)。
清除標(biāo)志
對(duì)于每一幀確保屏幕被清除是非常有必要的,這樣GPU就不需要再?gòu)闹暗膸彺嬷屑虞d圖像內(nèi)容,使用“solid color”或者“天空盒”清除模式來(lái)確保GPU不再?gòu)膬?nèi)存中加載之前用過(guò)的紋理數(shù)據(jù)。
在PowerVR平臺(tái)上,深度準(zhǔn)備操作是一件非常反效率的事情,因?yàn)镚PU不得不進(jìn)行兩次深度測(cè)試操作來(lái)將深度緩存保存到內(nèi)存中,從而完成清除冗余操作。你可以通過(guò)將相機(jī)的清除標(biāo)志設(shè)置為“depth only”或者“don’t clear”來(lái)確保Unity不會(huì)這樣做,我們強(qiáng)烈建議你不要使用這兩種模式。
Mipmaps(紋理映射)
與網(wǎng)格(LOD組)的距離等級(jí)(LOD)解決方案類似,紋理的LOD解決方案稱為mipmapping(紋理映射),隨著相機(jī)距離的增加mipmapping可以自動(dòng)降低顯示紋理的分辨率,這會(huì)顯著提升緩存效率,提高性能,降低帶寬等,按照下面的截圖來(lái)設(shè)置mipmaps:
使用mipmaps需要記住的一點(diǎn)是它們只能用于場(chǎng)景內(nèi)的3D元素,對(duì)于2D元素比如UI是1比1映射到屏幕上,因此是不需要的,但是如果它們被縮放那么你可能仍然需要使用mipmaps。
為了確保不同mipmap等級(jí)之間的無(wú)縫轉(zhuǎn)換,一定要確保在mipmapped對(duì)象上使用三線性過(guò)濾,如下圖所示:
網(wǎng)格優(yōu)化
首先確定你啟用了網(wǎng)格優(yōu)化選項(xiàng),這個(gè)設(shè)置會(huì)重新排列頂點(diǎn)和索引從而更好的利用GPU緩存空間,如下面截圖所示:
移動(dòng)端的內(nèi)容優(yōu)化
移動(dòng)設(shè)備本身就有一些特殊的約束限制,它們要確保電池的電量至少能夠使用一天,并且在用戶的手上不會(huì)出現(xiàn)嚴(yán)重發(fā)熱等問(wèn)題,這意味著將電腦上的游戲移植到移動(dòng)端時(shí),我們必須要進(jìn)行內(nèi)容優(yōu)化。
首先最重要的幾何復(fù)雜度需要優(yōu)化,現(xiàn)在電腦屏幕上幾何圖形的數(shù)量通常在2百萬(wàn)到3百萬(wàn)都是可見(jiàn)的,在移動(dòng)設(shè)備上,這個(gè)數(shù)量一般是20萬(wàn)到30萬(wàn)個(gè)多邊形,多邊形的數(shù)量?jī)?yōu)化完之后,開(kāi)發(fā)者還需要配置文件并且驗(yàn)證頂點(diǎn)著色器是否過(guò)于的復(fù)雜。
其次是紋理分辨率和帶寬的使用,舉個(gè)例子,后期處理效果需要進(jìn)行調(diào)整來(lái)適應(yīng)移動(dòng)端設(shè)備,在電腦上GPU內(nèi)存帶寬是200B/s到300GB/s,在移動(dòng)設(shè)備上可用的內(nèi)存帶寬是CPU和GPU共享的,大約在20GB/s到30GB/s,盡管這意味著紋理分辨率需要降低一半,但是你也需要考慮到移動(dòng)屏幕要小的多(電腦屏幕大約20+英寸,移動(dòng)設(shè)備屏幕大約5英寸),所以較小的紋理通常還是足夠的,調(diào)整之后還需要進(jìn)行概要分析從而驗(yàn)證結(jié)果。
總結(jié)
正如上文我們所看到的,Unity提供了一系列選項(xiàng)來(lái)優(yōu)化移動(dòng)端的內(nèi)容和游戲,這些都可以在PowerVR上得到很好的應(yīng)用,盡管不會(huì)帶來(lái)即時(shí)的性能提升,但是至少會(huì)有效的降低GPU負(fù)載,從而節(jié)省了電池的電量。
-
gpu
+關(guān)注
關(guān)注
28文章
4739瀏覽量
128941 -
powervr
+關(guān)注
關(guān)注
0文章
98瀏覽量
31068 -
Unity
+關(guān)注
關(guān)注
1文章
127瀏覽量
21829
原文標(biāo)題:面向Unity游戲引擎:PowerVR性能建議
文章出處:【微信號(hào):Imgtec,微信公眾號(hào):Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論