日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

项目研发常用的优化策略——遮挡剔除(Occlusion Culling)

發(fā)布時間:2023/12/31 56 生活家
生活随笔 收集整理的這篇文章主要介紹了 项目研发常用的优化策略——遮挡剔除(Occlusion Culling) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

項(xiàng)目研發(fā)常用的優(yōu)化策略——遮擋剔除(Occlusion Culling)

前言:我們在本次的博客中討論我們游戲項(xiàng)目研發(fā)的過程中為解決項(xiàng)目卡頓、死機(jī)、移動設(shè)備熱量高等問題。對于一個Unity初學(xué)者來說,或者僅僅滿足于項(xiàng)目功能的具體的實(shí)現(xiàn)上。而一個中高級的游戲研發(fā)人員則絕對不能僅僅滿足于此。

一:攝像機(jī)的剔除的距離                                                          

Camera.main.layerCullDistances 屬性用來設(shè)置攝像機(jī)基于層的消隱距離。攝像機(jī)可以通過層(GameObject.Layer)的方式來設(shè)置不同層物體的消隱距離。但是這個距離必須是小于或者等于攝像機(jī)的FarClippingPlanes才有效。我們同樣在Layer中增加一個層Cube層,屬于第8層。如圖所示:

(1):在我們的項(xiàng)目中創(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)造一個高樓林立的場景(有點(diǎn)丑,大家見諒)。如圖所示:

(2):除了把攝像機(jī)、直線光、地面,其余的把層級視圖中的所有的游戲?qū)ο蠖紭?biāo)記為“遮擋靜態(tài)”(Occluder Static/Occludee Static),如圖所示:

特別提示:當(dāng)我們選擇一個包含多個子對象的父對象,標(biāo)記為“靜態(tài)遮擋”的時候,會出現(xiàn)一個彈出窗口,我們一般點(diǎn)擊選擇“Yes change children”就可以了。

(3):執(zhí)行命名菜單:Windows——>"Occlusion Culling",彈出“遮擋剔除”面板,然后點(diǎn)擊“Bake”按鈕,進(jìn)行烘培。如圖所示:

(4):這時候當(dāng)我們移動攝像機(jī)的時候,如果攝像機(jī)低頭“看”地面時,整個場景中的游戲?qū)ο蠖紵o須進(jìn)行渲染。如果所示:

總結(jié):關(guān)于遮擋剔除,Unity還提供了“Occlusion Area”、“Occlusion Portal”但是在實(shí)際的項(xiàng)目中實(shí)用價值不高,顧再次不做詳細(xì)的介紹。

總結(jié)

以上是生活随笔為你收集整理的项目研发常用的优化策略——遮挡剔除(Occlusion Culling)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。