資源描述:
《unity3d游戲開發(fā)之優(yōu)化技術(shù)(2)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、可以看到DrawCalls一下子變成了5。這是因為新添加的箱子模型中,包含了474個頂點(diǎn),而它使用的頂點(diǎn)屬性有位置、UV坐標(biāo)、法線等信息,使用的總和超過了900。動態(tài)批處理的條件這么多,一不小心它就不干了,因此Unity提供了另一個方法,靜態(tài)批處理。接著上面的例子,我們保持修改后的縮放,但把四個物體的“StaticFlag”勾選上:點(diǎn)擊Static后面的三角下拉框,我們會看到其實這一步設(shè)置了很多東西,這里我們想要的只是“Batchingstatic”一項。這時我們再看DrawCalls,恩,還是沒有變化。但是不要急,我們點(diǎn)擊運(yùn)行,變化出現(xiàn)了。DrawCalls又回到了3,并且顯示Saveb
2、ybatching是1。這就是得利于靜態(tài)批處理。而且,如果我們在運(yùn)行時刻查看模型的網(wǎng)格,會發(fā)現(xiàn)它們都變成了一個名為CombinedMesh(roo:scene)的東西。這個網(wǎng)格是Unity合并了所有標(biāo)識為“Static”的物體的結(jié)果,在我們的例子里,就是四個物體:你可以要問了,這四個對象明明不是都使用了一個材質(zhì),為什么可以合并成一個呢?如果你仔細(xì)觀察上圖的話,會發(fā)現(xiàn)里面標(biāo)明了“4submeshes”,也就是說,這個合并后的網(wǎng)格其實包含了4個子網(wǎng)格,也就是我們的四個對象。對于合并后后的網(wǎng)格,Unity會判斷其中使用同一個材質(zhì)的子網(wǎng)格,然后對它們進(jìn)行批處理。但是,我們再細(xì)心點(diǎn)可以發(fā)現(xiàn),我們的箱
3、子使用的其實是同一個網(wǎng)格,但合并后卻變成了兩個。而且,我們觀察運(yùn)行前后Stats窗口中的“VBOtotal”,它的大小由241.6KB變成了286.2KB,變大了!還記得靜態(tài)批處理的缺點(diǎn)嗎?就是可能會占用更多的內(nèi)存。文檔中是這樣寫的:“Usingstaticbatchingwillrequireadditionalmemoryforstoringthecombinedgeometry.Ifseveralobjectssharedthesamegeometrybeforestaticbatching,thenacopyofgeometrywillbecreatedforeachobject,
4、eitherintheEditororatruntime.Thismightnotalwaysbeagoodidea–sometimesyouwillhavetosacrificerenderingperformancebyavoidingstaticbatchingforsomeobjectstokeepasmallermemoryfootprint.Forexample,markingtreesasstaticinadenseforestlevelcanhaveseriousmemoryimpact.”也就是說,如果在靜態(tài)批處理前有一些物體共享了相同的網(wǎng)格(例如這里的兩個箱子),那么每
5、一個物體都會有一個該網(wǎng)格的復(fù)制品,即一個網(wǎng)格會變成多個網(wǎng)格被發(fā)送給GPU。在上面的例子看來,就是VBO的大小明顯增大了。如果這類使用同一網(wǎng)格的對象很多,那么這就是一個問題了,這種時候我們可能需要避免使用靜態(tài)批處理,這意味著犧牲一定的渲染性能。例如,如果在一個使用了1000個重復(fù)樹模型的森林中使用靜態(tài)批處理,那么結(jié)果就會產(chǎn)生1000倍的內(nèi)存,這會造成嚴(yán)重的內(nèi)存影響。這種時候,解決方法要么我們可以忍受這種犧牲內(nèi)存換取性能的方法,要么不要使用靜態(tài)批處理,而使用動態(tài)批處理(前提是大家使用相同的縮放大小,或者大家都使用不同的非統(tǒng)一縮放大?。蛘咦约壕帉懪幚淼姆椒?。當(dāng)然,我認(rèn)為最好的還是使用動態(tài)批
6、處理來解決。有一些小提示可以使用:盡可能選擇靜態(tài)批處理,但得時刻小心對內(nèi)存的消耗。如果無法進(jìn)行靜態(tài)批處理,而要使用動態(tài)批處理的話,那么請小心上面提到的各種注意事項。例如:盡可能讓這樣的物體少并且盡可能讓這些物體包含少量的頂點(diǎn)屬性。不要使用統(tǒng)一縮放,或者都使用不同的非統(tǒng)一縮放。對于游戲中的小道具,例如可以撿拾的金幣等,可以使用動態(tài)批處理。對于包含動畫的這類物體,我們無法全部使用靜態(tài)批處理,但其中如果有不動的部分,可以把這部分標(biāo)識成“Static”。一些討論:HowstaticbatchingworksStaticbatchinguseatonofmemory?Unity3Ddrawcallo
7、ptimization[color=ize:14px]合并紋理(Atlas)雖然批處理是個很好的方式,但很容易就打破它的規(guī)定。例如,場景中的物體都使用Diffuse材質(zhì),但它們可能會使用不同的紋理。因此,盡可能把多張小紋理合并到一張大紋理(Atlas)中是一個好主意。[color=ize:14px]利用網(wǎng)格的頂點(diǎn)數(shù)據(jù)但有時,除了紋理不同外,還有對于不同的物體,它們在材質(zhì)上還有一些微小的參數(shù)變化,例如顏色不同、某些浮點(diǎn)參數(shù)