项目研发常用的优化策略——遮挡剔除(Occlusion Culling)
項目研發(fā)常用的優(yōu)化策略——遮擋剔除(Occlusion Culling)
前言:我們在本次的博客中討論我們游戲項目研發(fā)的過程中為解決項目卡頓、死機(jī)、移動設(shè)備熱量高等問題。對于一個Unity初學(xué)者來說,或者僅僅滿足于項目功能的具體的實現(xiàn)上。而一個中高級的游戲研發(fā)人員則絕對不能僅僅滿足于此。
一:攝像機(jī)的剔除的距離
Camera.main.layerCullDistances 屬性用來設(shè)置攝像機(jī)基于層的消隱距離。攝像機(jī)可以通過層(GameObject.Layer)的方式來設(shè)置不同層物體的消隱距離。但是這個距離必須是小于或者等于攝像機(jī)的FarClippingPlanes才有效。我們同樣在Layer中增加一個層Cube層,屬于第8層。如圖所示:
(1):在我們的項目中創(chuàng)建一個立方體和球體。并把立方體的Layer設(shè)置為Cube,如圖所示:
(2):我們創(chuàng)建一個腳本Demo18_OcclusionCulling.cs,并把腳本掛載在攝像機(jī)上。腳本代碼如下:
public class Demo18_OcclusionCulling : MonoBehaviour
{
public Transform Sphere; //球體的位置
void Start()
{
//定義大小為32的一維數(shù)組,用來存儲所有層的剔除信息
float[] distance = new float[32];
//設(shè)置第九層層的剔除的距離
distance[8] = Vector3.Distance(transform.position, Sphere.position);
//將數(shù)字賦給攝像機(jī)的layerCullDistances
Camera.main.layerCullDistances = distance;
}
void Update()
{
//攝像機(jī)遠(yuǎn)離物體進(jìn)行測試
transform.Translate(-transform.forward * Time.deltaTime);
}
}//class_end
(3):進(jìn)行腳本的測試:當(dāng)我們運(yùn)行腳本的時候,當(dāng)攝像機(jī)的距離超過Vector3.Distance(transform.position, Sphere.position);立方體雖然在攝像機(jī)的視野范圍之內(nèi),但是仍然不可見。只有小于這個距離的時候才可以觀察到。大家可以自行的測試。
二:遮擋剔除(Occlusion Culling)
當(dāng)場景中包含大量的模型的時候,勢必會造成渲染效率的降低(即幀速率FPS的降低)。如果使用遮擋剔除的技術(shù)之后,可以使那么被阻擋的物體不被渲染。從而達(dá)到提高渲染效率的目的。
基本的原理:遮擋剔除的基本的原理是:在場景的空間中創(chuàng)建一個遮擋區(qū)域,該遮擋區(qū)域有單元格(Cell)組成,每個單元格構(gòu)成整個場景遮擋區(qū)域的一部分。這些單元格會把整個的場景拆分成對個部分。當(dāng)攝像機(jī)能夠看到該單元格的時候,表示該單元格的物體就會被渲染出來。而被其他的單元格擋住的不被攝像機(jī)看到的單元格中的物體將不會被渲染。
(1):我們先來構(gòu)造一個高樓林立的場景(有點丑,大家見諒)。如圖所示:
(2):除了把攝像機(jī)、直線光、地面,其余的把層級視圖中的所有的游戲?qū)ο蠖紭?biāo)記為“遮擋靜態(tài)”(Occluder Static/Occludee Static),如圖所示:
特別提示:當(dāng)我們選擇一個包含多個子對象的父對象,標(biāo)記為“靜態(tài)遮擋”的時候,會出現(xiàn)一個彈出窗口,我們一般點擊選擇“Yes change children”就可以了。
(3):執(zhí)行命名菜單:Windows——>"Occlusion Culling",彈出“遮擋剔除”面板,然后點擊“Bake”按鈕,進(jìn)行烘培。如圖所示:
(4):這時候當(dāng)我們移動攝像機(jī)的時候,如果攝像機(jī)低頭“看”地面時,整個場景中的游戲?qū)ο蠖紵o須進(jìn)行渲染。如果所示:
總結(jié):關(guān)于遮擋剔除,Unity還提供了“Occlusion Area”、“Occlusion Portal”但是在實際的項目中實用價值不高,顧再次不做詳細(xì)的介紹。
總結(jié)
以上是生活随笔為你收集整理的项目研发常用的优化策略——遮挡剔除(Occlusion Culling)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是二级索引
- 下一篇: 编译Flink项目的时候遇到cannot