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

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(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)前位置:首頁(yè)  >  技術(shù)干貨  > Unity對(duì)象池的學(xué)習(xí)

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

        來(lái)源:千鋒教育
        發(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ì)象池中取出使用···

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

          首先是對(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è)開(kāi)始尋找

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

                    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)//若沒(méi)有false狀態(tài)的子彈供我們使用,則生成新的對(duì)象并加入對(duì)象池

                {

                    GameObject obj = Instantiate(bulletObj);

                    pooledObjects.Add(obj);

                    return obj;

                }

                return null;

            }

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

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

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

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

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

        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解決的主要問(wèn)題是什么?

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

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

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

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

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

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

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

        2023-10-14 11:25:48
        雷州市| 榆社县| 永州市| 元谋县| 保山市| 休宁县| 咸宁市| 邛崃市| 平武县| 万州区| 上饶市| 阳信县| 甘德县| 高邑县| 中宁县| 盘锦市| 富蕴县| 汉川市| 武鸣县| 阿拉善右旗| 乐平市| 庆元县| 科技| 峨眉山市| 博白县| 开阳县| 于都县| 石景山区| 太保市| 鄂伦春自治旗| 罗定市| 兴仁县| 平谷区| 成都市| 大姚县| 防城港市| 恩施市| 密云县| 临西县| 且末县| 龙泉市|