Unity優(yōu)化-創(chuàng)新互聯(lián)

我們?cè)谧鲇螒虻臅r(shí)候,應(yīng)該了解哪些性能因素影響游戲,才能對(duì)癥下藥。對(duì)于一個(gè)游戲來(lái)說(shuō),主要有兩種計(jì)算資源:CPU和GPU。這兩者會(huì)互相合作,來(lái)讓游戲可以在預(yù)期的幀率和分辨率下工作。CPU負(fù)責(zé)幀率,GPU主要負(fù)責(zé)與分辨率相關(guān)的一些東西。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的正寧網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

總結(jié)起來(lái),主要有以下性能瓶頸:

CPU:過(guò)多的Draw Calls;復(fù)雜的腳本或者物理模擬。

頂點(diǎn)處理:過(guò)多的頂點(diǎn);過(guò)多的逐頂點(diǎn)計(jì)算。

像素(Fragment)處理(GPU):過(guò)多的fragment,overdraws;過(guò)多的逐像素計(jì)算。

寬帶:尺寸很大且未壓縮的紋理;分辨率過(guò)高的framebuffer。

對(duì)于CPU來(lái)說(shuō),限制它的主要是游戲中的Draw Calls。那么什么是Draw Call呢?在OpenGL中,在每次繪圖前,我們都需要先準(zhǔn)備好頂點(diǎn)數(shù)據(jù)(位置、法線、顏色、紋理坐標(biāo)等),然后調(diào)用一系列API把它們放到GPU可以訪問(wèn)到的指定位置,最后,我們需要調(diào)用_glDraw命令,來(lái)告訴GPU進(jìn)行渲染,而調(diào)用_glDraw命令的時(shí)候,就是一次Draw Call。為什么Draw Call會(huì)成為性能瓶頸呢(而且是CPU的瓶頸)?我們想要繪制圖像時(shí),就一定需要調(diào)用Draw Call。例如,一個(gè)場(chǎng)景里有水有樹(shù),我們渲染水的時(shí)候使用的是一個(gè)material以及一個(gè)shader,但渲染樹(shù)的時(shí)候就需要一個(gè)完全不同的material和shader,那么就需要CPU重新準(zhǔn)備頂點(diǎn)數(shù)據(jù)、重新設(shè)置shader,而這種工作實(shí)際是非常耗時(shí)的。如果場(chǎng)景中,每一個(gè)物體都使用不同的material、不同的紋理,那么就會(huì)產(chǎn)生太多Draw Call,影響幀率,游戲性能就會(huì)下降。

  如何減少DrawCalls?

主要介紹批處理(Batching)

最常見(jiàn)的就是通過(guò)批處理(Batching)了。從名字上來(lái)理解,就是一塊處理多個(gè)物體的意思。那么什么樣的物體可以一起處理呢?答案就是使用同一個(gè)材質(zhì)的物體。這是因此,對(duì)于使用同一個(gè)材質(zhì)的物體,它們之間的不同僅僅在于頂點(diǎn)數(shù)據(jù)的差別,即使用的網(wǎng)格不同而已。我們可以把這些頂點(diǎn)數(shù)據(jù)合并在一起,再一起發(fā)送給GPU,就可以完成一次批處理。

Unity中有兩種批處理方式:一種是動(dòng)態(tài)批處理,一種是靜態(tài)批處理。對(duì)于動(dòng)態(tài)批處理來(lái)說(shuō),好消息是一切處理都是自動(dòng)的,不需要我們自己做任何操作,而且物體是可以移動(dòng)的,但壞消息是,限制很多,可能一不小心我們就會(huì)破壞了這種機(jī)制,導(dǎo)致Unity無(wú)法批處理一些使用了相同材質(zhì)的物體。對(duì)于靜態(tài)批處理來(lái)說(shuō),好消息是自由度很高,限制很少,壞消息是可能會(huì)占用更多的內(nèi)存,而且經(jīng)過(guò)靜態(tài)批處理后的所有物體都不可以再移動(dòng)了。

首先來(lái)說(shuō)動(dòng)態(tài)批處理。Unity進(jìn)行動(dòng)態(tài)批處理的條件是,物體使用同一個(gè)材質(zhì)并且滿足一些特定條件。Unity總是在不知不覺(jué)中就為我們做了動(dòng)態(tài)批處理。例如下面的場(chǎng)景:這個(gè)場(chǎng)景共包含了4個(gè)物體,其中兩個(gè)箱子使用了同一個(gè)材質(zhì)??梢钥吹?,它的Draw Calls現(xiàn)在是3,并且顯示Save by batching是1,也就是說(shuō),Unity靠Batching為我們節(jié)省了1個(gè)Draw Call。下面,我們來(lái)把其中一個(gè)箱子的大小隨便改動(dòng)一下,看看會(huì)發(fā)生什么:可以發(fā)現(xiàn),Draw Calls變成了4,Save by batching的數(shù)目也變成了0。這是為什么呢?它們明明還是只使用了一個(gè)材質(zhì)啊。原因就是前面提到的那些需要滿足的其他條件。動(dòng)態(tài)批處理雖然自動(dòng)得令人感動(dòng),但它對(duì)模型的要求很多:頂點(diǎn)屬性的大限制為900,而且未來(lái)有可能會(huì)變。不要依賴這個(gè)數(shù)據(jù)。

一般來(lái)說(shuō),那么所有對(duì)象都必須需要使用同一個(gè)縮放尺度(可以是(1, 1, 1)、(1, 2, 3)、(1.5, 1.4, 1.3)等等,但必須都一樣)。但如果是非統(tǒng)一縮放(即每個(gè)維度的縮放尺度不一樣,例如(1, 2, 1)),那么如果所有的物體都使用不同的非統(tǒng)一縮放也是可以批處理的。這個(gè)要求很怪異,為什么批處理會(huì)和縮放有關(guān)呢?這和Unity背后的技術(shù)有關(guān)系。

使用lightmap的物體不會(huì)批處理。多passes的shader會(huì)中斷批處理。接受實(shí)時(shí)陰影的物體也不會(huì)批處理。

上述除了最常見(jiàn)的由于縮放導(dǎo)致破壞批處理的情況,還有就是頂點(diǎn)屬性的限制。例如,在上面的場(chǎng)景中我們添加之前未優(yōu)化后的箱子模型:可以看到Draw Calls一下子變成了5。這是因?yàn)樾绿砑拥南渥幽P椭?,包含?74個(gè)頂點(diǎn),而它使用的頂點(diǎn)屬性有位置、UV坐標(biāo)、法線等信息,使用的總和超過(guò)了900。

動(dòng)態(tài)批處理的條件這么多,一不小心它就不干了,因此Unity提供了另一個(gè)方法,靜態(tài)批處理。接著上面的例子,我們保持修改后的縮放,但把四個(gè)物體的“Static Flag”勾選上:

點(diǎn)擊Static后面的三角下拉框,我們會(huì)看到其實(shí)這一步設(shè)置了很多東西,這里我們想要的只是“Batching static”一項(xiàng)。這時(shí)我們?cè)倏碊raw Calls,恩,還是沒(méi)有變化。但是不要急,我們點(diǎn)擊運(yùn)行,變化出現(xiàn)了:

Draw Calls又回到了3,并且顯示Save by batching是1。這就是得利于靜態(tài)批處理。而且,如果我們?cè)谶\(yùn)行時(shí)刻查看模型的網(wǎng)格,會(huì)發(fā)現(xiàn)它們都變成了一個(gè)名為Combined Mesh (roo: scene)的東西。這個(gè)網(wǎng)格是Unity合并了所有標(biāo)識(shí)為“Static”的物體的結(jié)果,在我們的例子里,就是四個(gè)物體:

你可以要問(wèn)了,這四個(gè)對(duì)象明明不是都使用了一個(gè)材質(zhì),為什么可以合并成一個(gè)呢?如果你仔細(xì)觀察上圖的話,會(huì)發(fā)現(xiàn)里面標(biāo)明了“4 submeshes”,也就是說(shuō),這個(gè)合并后的網(wǎng)格其實(shí)包含了4個(gè)子網(wǎng)格,也就是我們的四個(gè)對(duì)象。對(duì)于合并后后的網(wǎng)格,Unity會(huì)判斷其中使用同一個(gè)材質(zhì)的子網(wǎng)格,然后對(duì)它們進(jìn)行批處理。

但是,我們?cè)偌?xì)心點(diǎn)可以發(fā)現(xiàn),我們的箱子使用的其實(shí)是同一個(gè)網(wǎng)格,但合并后卻變成了兩個(gè)。而且,我們觀察運(yùn)行前后Stats窗口中的“VBO total”,它的大小由241.6KB變成了286.2KB,變大了!

這里就體現(xiàn)了靜態(tài)批處理的缺點(diǎn),如果在靜態(tài)批處理前有一些物體共享了相同的網(wǎng)格(例如這里的兩個(gè)箱子),那么每一個(gè)物體都會(huì)有一個(gè)該網(wǎng)格的復(fù)制品,即一個(gè)網(wǎng)格會(huì)變成多個(gè)網(wǎng)格被發(fā)送給GPU。在上面的例子看來(lái),就是VBO的大小明顯增大了。如果這類使用同一網(wǎng)格的對(duì)象很多,那么這就是一個(gè)問(wèn)題了,這種時(shí)候我們可能需要避免使用靜態(tài)批處理,這意味著犧牲一定的渲染性能。例如,如果在一個(gè)使用了1000個(gè)重復(fù)樹(shù)模型的森林中使用靜態(tài)批處理,那么結(jié)果就會(huì)產(chǎn)生1000倍的內(nèi)存,這會(huì)造成嚴(yán)重的內(nèi)存影響。這種時(shí)候,解決方法要么我們可以忍受這種犧牲內(nèi)存換取性能的方法,要么不要使用靜態(tài)批處理,而使用動(dòng)態(tài)批處理(前提是大家使用相同的縮放大小,或者大家都使用不同的非統(tǒng)一縮放大?。蛘咦约壕帉?xiě)批處理的方法。當(dāng)然,我認(rèn)為最好的還是使用動(dòng)態(tài)批處理來(lái)解決。

有一些小提示可以使用:
盡可能選擇靜態(tài)批處理,但得時(shí)刻小心對(duì)內(nèi)存的消耗。

如果無(wú)法進(jìn)行靜態(tài)批處理,而要使用動(dòng)態(tài)批處理的話,那么請(qǐng)小心上面提到的各種注意事項(xiàng)。例如:

盡可能讓這樣的物體少并且盡可能讓這些物體包含少量的頂點(diǎn)屬性。

不要使用統(tǒng)一縮放,或者都使用不同的非統(tǒng)一縮放。

對(duì)于游戲中的小道具,例如可以撿拾的金幣等,可以使用動(dòng)態(tài)批處理。

對(duì)于包含動(dòng)畫(huà)的這類物體,我們無(wú)法全部使用靜態(tài)批處理,但其中如果有不動(dòng)的部分,可以把這部分標(biāo)識(shí)成“Static”。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:Unity優(yōu)化-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article26/csjocg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、標(biāo)簽優(yōu)化網(wǎng)站建設(shè)、搜索引擎優(yōu)化、網(wǎng)站改版企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)