資源描述:
《unity3d游戲開發(fā)之優(yōu)化》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、首先介紹下drawcall(這個東西越少你的遊戲跑的越快):在遊戲中每一個被展示的獨(dú)立的部分都被放在了一個特別的包中,我們稱之為“描繪指令”(drawcall),然後這個包傳遞到3D部分在螢?zāi)簧铣尸F(xiàn)出來。這就和你希望你的親友收到準(zhǔn)備好的聖誕禮物需要包裝好然後穿過城市準(zhǔn)時放在他應(yīng)該出現(xiàn)的地方一樣沒什麼不同。你的CPU來完成包裝和傳遞他們的活,同時會消耗很多的頻寬,所以最終分配好這些關(guān)鍵性資源很重要。目前,真正可怕的事情是從描繪指令消耗遠(yuǎn)景開始,每一個獨(dú)立的飛濺到地板上的血跡和一個角色或者一具死屍消耗的位元組是一樣的多的:他們都消耗同樣的描
2、繪指令。除此之外,沒有什麼更多的差別。那麼如何降低drawcall呢??那麼我們就用到Culling(剔除)技術(shù)。如果不應(yīng)用這個技術(shù),電腦是不管3721把場景裡所有的東西都送去渲染的。看得見的也渲染,看不見得照樣也送去渲染。很傻是吧,那咋辦呢。得告訴電腦,那個你看得見的渲染,看不見的就算了。於是就有了1.視錐體剔除(FrustumCulling)這個unity系統(tǒng)自帶了好像,就不用操心了。2.遮擋剔除(OcclusionCulling)Unity3專業(yè)版內(nèi)置了一個強(qiáng)大的OcclusionCulling外掛程式Umbra免費(fèi)的遮擋剔除(O
3、cclusionCulling)??遮擋剔除是一種什麼樣的特性呢,當(dāng)一個物體被其他物體遮擋住而不在攝像機(jī)的可視範(fàn)圍內(nèi)時不對其進(jìn)行渲染。.遮擋剔除在3D圖形計算中並不是自動進(jìn)行的。因為在絕大多數(shù)情況下離camera最遠(yuǎn)的物體首先被渲染,靠近攝像機(jī)的物體後渲染並覆蓋先前渲染的物體(這被稱為重複渲染,無效渲染"overdraw").遮擋剔除不同於視錐體剔除.視錐體剔除只是不渲染攝像機(jī)視角範(fàn)圍外的物體而對於被其他物體遮擋但依然在視角範(fàn)圍內(nèi)的物體則不包括在內(nèi).注意當(dāng)你使用遮擋剔除時你依然受益於視錐體剔除(FrustumCulling).左邊的場景
4、使用了遮擋剔除.右邊的場景未使用遮擋剔除.遮擋剔除的運(yùn)行將通過在場景中使用一個虛擬的攝像機(jī)來創(chuàng)建一個物體潛在可視性狀態(tài)(set)的層級.這些資料可以讓每個執(zhí)行時間內(nèi)的攝像機(jī)來確定什麼能看見什麼看不見。通過這些資料,Unity將確定只把可以看見的物體送去渲染.這將降低drawcalls的數(shù)量並提供遊戲的運(yùn)行效率.occlusionculling的資料由單元(cells)組成.每個單元是整個場景範(fàn)圍數(shù)值的一部分.更多特定的單元來自一個二叉樹(binarytree).OcclusionCulling使用兩個叉,一個給ViewCells(靜態(tài)物
5、體)另一個給TargetCells(移動物體).ViewCellsmap給出了一個定義了靜態(tài)可視物體的索引清單(精確剔除後的靜態(tài)物體).非常重要的一點(diǎn)是在創(chuàng)建你的物體時要隨時注意,因為你需要在物體的尺寸和單元的尺寸間取得一個好的平衡.理想情況下,youshouldn'thavecellsthataretoosmallincomparisonwithyourobjectsbutequallyyoushouldn'thaveobjectsthatcovermanycells.有時你可以通過將大的物體拆成幾個部分來改進(jìn)遮擋剔除效果.無論如何你
6、仍然能夠?qū)⑿〉奈矬w合併為一體來降低drawcalls,在它們都屬於一些小的組件的時候,occlusionculling將不起作用.確定元件中那個是可視的元件的選集和可視資訊被認(rèn)為是PVS(潛在可視狀態(tài)PotentiallyVisibleSet).OcclusionCulling設(shè)置為了使用遮擋剔除需要進(jìn)行相關(guān)的手動設(shè)置.首先你關(guān)卡中的幾何體必須被分割成明顯的不同尺寸的塊.這也有助於佈置關(guān)卡中小塊的容易定義的區(qū)域被其他大物體遮擋(例如牆,建築物)這意味著每個單獨(dú)的mesh被確定是否渲染取決於occlusion資料.所以如果你有一個物體包含
7、了房間裡的所有傢俱那麼所有的傢俱要麼全渲染,要麼全不渲染.是否渲染是基於元件而不是基於每個單獨(dú)物體自身的。在檢視面板(Inspector)你需要標(biāo)識(tag)所有需要應(yīng)用遮擋剔除的場景物體。最快的方法是是將你需要標(biāo)示為Static的物體作為一個EmptyGameObject的子物體並設(shè)置這個EmptyGameObject為Static,當(dāng)option出現(xiàn)的時候選擇affectchildren.當(dāng)子物體被taggedasStatic你可以取消子物體和EmptyGameObject的父子關(guān)係.檢視面板中的Staticcheckbox?下一步
8、點(diǎn)擊Tools->OcclusionCulling.打開OcclusionCulling檢視面板,在面板中你會發(fā)現(xiàn)幾個數(shù)值被調(diào)整過了。這些數(shù)值前面描述過:-OcclusionCulling-Object?遮