久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

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

手機站
千鋒教育

千鋒學(xué)習站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進入千鋒手機站

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

關(guān)注千鋒學(xué)習站小程序
隨時隨地免費學(xué)習課程

當前位置:首頁  >  技術(shù)干貨  > Unity對象池的學(xué)習

Unity對象池的學(xué)習

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

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

千鋒教育

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

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

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

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

    //prefabPool.cullDespawned = true;自動清理對象池

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

    public GameObject bulletObj;

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

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

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

    private int currentIndex = 0;

    void Awake()

    {

        bullet = this;//實例化對象池

    }

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

void Start()

    {

        pooledObjects = new List<GameObject>();

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

        {

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

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

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

        }

    }

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

public GameObject GetPooledObject()

    {

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

        {

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

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

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

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

            {

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

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

            }

        }

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

        {

            GameObject obj = Instantiate(bulletObj);

            pooledObjects.Add(obj);

            return obj;

        }

        return null;

    }

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

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

  這一方法可以極大程度改善因遍歷而浪費的機能、時間,對游戲性能進行優(yōu)化。

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

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

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習老師24小時內(nèi)將與您1V1溝通
免費領(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)選,有其獨特的優(yōu)勢和特點。包括其...詳情>>

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

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

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

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

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

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

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

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

2023-10-14 11:25:48