一区二区三区中文国产亚洲_另类视频区第一页_日韩精品免费视频_女人免费视频_国产综合精品久久亚洲

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Unity對(duì)象池的學(xué)習(xí)

Unity對(duì)象池的學(xué)習(xí)

來源:千鋒教育
發(fā)布人:wjy
時(shí)間: 2022-07-29 16:40:00 1659084000

  對(duì)象池在Unity3D中是極為重要的技術(shù),在遇到需要大量重復(fù)創(chuàng)建、銷毀的對(duì)象時(shí),對(duì)象池可以將其存放入池中,反復(fù)利用,從而盡可能的重復(fù)使用內(nèi)存中駐留的資源。

千鋒教育

  對(duì)象池的典型用法就是射擊游戲中的子彈。在不使用對(duì)象池時(shí),子彈的“一生”是這樣的:創(chuàng)建→產(chǎn)生作用→銷毀;而使用對(duì)象池后,子彈的“一生”是這樣的:從對(duì)象池中取出使用→產(chǎn)生作用→存放進(jìn)對(duì)象池→從對(duì)象池中取出使用···

  顯而易見的,該方法能避免重復(fù)對(duì)象的創(chuàng)建、銷毀過程,節(jié)省內(nèi)存空間的使用。以下為一個(gè)子彈對(duì)象池的大致創(chuàng)建過程

  首先是對(duì)象池創(chuàng)建

    //prefabPool = new PrefabPool(Resources.Load<Transform>("xxx"));加載本地預(yù)制

    //prefabPool.cullDespawned = true;自動(dòng)清理對(duì)象池

    public static BulletPool bullet;//該部分用于初始化此對(duì)象池的配置

    public GameObject bulletObj;

    public int pooledAmount = 5;//初始化對(duì)象池中對(duì)象數(shù)量

    public bool lockPoolSize = false;//取消鎖定對(duì)象池大小

    private List<GameObject> pooledObjects;//創(chuàng)建對(duì)象池鏈表

    private int currentIndex = 0;

    void Awake()

    {

        bullet = this;//實(shí)例化對(duì)象池

    }

在start()中初始化對(duì)象池鏈表

void Start()

    {

        pooledObjects = new List<GameObject>();

        for (int i = 0; i < pooledAmount; ++i)

        {

            GameObject obj = Instantiate(bulletObj);//創(chuàng)建子彈對(duì)象

            obj.SetActive(false);//將子彈對(duì)象的激活狀態(tài)Active設(shè)置為false

            pooledObjects.Add(obj);//將子彈存放入對(duì)象池中

        }

    }

調(diào)用該子彈對(duì)象池中的可用子彈

public GameObject GetPooledObject()

    {

        for (int i = 0; i < pooledObjects.Count; ++i)//遍歷對(duì)象池以尋找可用子彈

        {

            //從上一次調(diào)用的子彈的下一個(gè)開始尋找

            //例如上一次發(fā)射的子彈是對(duì)象池中序號(hào)為2的子彈,則本次調(diào)用對(duì)象池中子彈時(shí)從3開始檢查是否可用

            int temI = (currentIndex + i) % pooledObjects.Count;

            if (!pooledObjects[temI].activeInHierarchy)//檢查該對(duì)象的Active狀態(tài)

            {

                currentIndex = (temI + 1) % pooledObjects.Count;

                return pooledObjects[temI];//如果Active為false則返回調(diào)用該對(duì)象

            }

        }

        if(!lockPoolSize)//若沒有false狀態(tài)的子彈供我們使用,則生成新的對(duì)象并加入對(duì)象池

        {

            GameObject obj = Instantiate(bulletObj);

            pooledObjects.Add(obj);

            return obj;

        }

        return null;

    }

  在對(duì)象池中尋找可用對(duì)象時(shí),最初只通過遍歷進(jìn)行地毯式搜索。在實(shí)際使用時(shí),經(jīng)過頻繁的調(diào)用后,會(huì)產(chǎn)生略微影響體驗(yàn)的卡頓,一開始以為是對(duì)象過多,機(jī)器的機(jī)能限制,后來查看到了一篇文章,指明了這一問題產(chǎn)生的原因。

  在尋找可用對(duì)象時(shí),如果每次遍歷都從頭開始,如果對(duì)象池極大,且先前的對(duì)象仍然處于激活狀態(tài),我們將需要大量時(shí)間用來無謂的遍歷,導(dǎo)致卡頓。因此,在代碼中記錄之前使用的對(duì)象序號(hào),并從序號(hào)記錄的下一個(gè)對(duì)象開始查找可用對(duì)象。

  這一方法可以極大程度改善因遍歷而浪費(fèi)的機(jī)能、時(shí)間,對(duì)游戲性能進(jìn)行優(yōu)化。

  對(duì)象池是Unity中對(duì)性能優(yōu)化極為重要的技術(shù)。在CPU、內(nèi)存并非充滿"Power"的情況下,對(duì)象池是讓硬件的無謂重復(fù)盡可能降到最低,使有限的硬件資源用在最需要的地方,達(dá)到優(yōu)化效果。

  個(gè)人看來,對(duì)象池最大的優(yōu)點(diǎn)在于復(fù)用、預(yù)載這兩方面。復(fù)用是對(duì)象池的典型特征、靈魂所在;而預(yù)載方面,作為玩家試想一下,玩家是愿意在加載界面多花1秒鐘,還是在激烈戰(zhàn)斗時(shí)突然卡頓0.1秒。結(jié)果是顯而易見的。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢(shì)和特點(diǎn)。包括其...詳情>>

2023-10-14 12:34:11
ORM解決的主要問題是什么?

ORM(對(duì)象關(guān)系映射)解決的主要問題是將關(guān)系數(shù)據(jù)庫與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以表格的形式存儲(chǔ),而在面向?qū)ο?..詳情>>

2023-10-14 12:26:19
Go為什么不支持三元運(yùn)算符?

Go為什么不支持三元運(yùn)算符Go語言是一種以簡(jiǎn)潔和有效性為目標(biāo)的編程語言,因此在設(shè)計(jì)過程中,Go的設(shè)計(jì)者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

2023-10-14 12:12:36
IT通常說的平臺(tái)是什么意思?

在信息技術(shù)(IT)領(lǐng)域,”平臺(tái)”這個(gè)詞有著廣泛的含義,它常常指代支持軟件應(yīng)用開發(fā)和運(yùn)行的基礎(chǔ)框架和環(huán)境。以下是對(duì)”平臺(tái)”這個(gè)概念的更深入...詳情>>

2023-10-14 11:55:36
什么是PowerPivot?

什么是PowerPivotPowerPivot,全稱”PowerPivot for Excel”,是Microsoft提供的一種數(shù)據(jù)分析工具,可以作為Excel的插件使用。通過PowerPivot,...詳情>>

2023-10-14 11:25:48