激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 如何使用CocosCreator對象池

如何使用CocosCreator對象池

2022-03-01 16:50戰(zhàn) 勝 js教程

這篇文章主要介紹了CocosCreator對象池,對性能有研究的同學,要著重看一下

前言:

在運行時進行節(jié)點的創(chuàng)建( cc.instantiate )和銷毀( node.destroy )操作是非常耗費性能的,因此我們在比較復雜的場景中,通常只有在場景初始化邏輯( onLoad )中才會進行節(jié)點的創(chuàng)建,在切換場景時才會進行節(jié)點的銷毀。如果制作有大量敵人或子彈需要反復生成和被消滅的動作類游戲,我們要如何在游戲進行過程中隨時創(chuàng)建和銷毀節(jié)點呢?這里就需要對象池的幫助了。

對象池就是一組可回收的節(jié)點對象,我們通過創(chuàng)建cc.NodePool的實例來初始化一種節(jié)點的對象池。通常當我們有多個 prefab 需要實例化時,應該為每個 prefab 創(chuàng)建一個 cc.NodePool 實例。

當我們需要創(chuàng)建節(jié)點時,向?qū)ο蟪厣暾堃粋€節(jié)點,如果對象池里有空閑的可用節(jié)點,就會把節(jié)點返回給用戶,用戶通過node.addChild將這個新節(jié)點加入到場景節(jié)點樹中。
當我們需要銷毀節(jié)點時,調(diào)用對象池實例的put(node) 方法,傳入需要銷毀的節(jié)點實例,對象池會自動完成把節(jié)點從場景節(jié)點樹中移除的操作,然后返回給對象池。

這樣就實現(xiàn)了少數(shù)節(jié)點的循環(huán)利用。

具體操作

第一步:準備好 Prefab

把你想要創(chuàng)建的節(jié)點事先設置好并做成 Prefab 資源,有些朋友可能不會制作預制體?
(只需要將資源管理器里的資源 拉拽到 層級管理器中 然后 將節(jié)點在拉拽回 資源管理器)
這樣就完成預制體的創(chuàng)建了!

第二步:初始化對象池

在場景加載的初始化腳本中,我們可以將需要數(shù)量的節(jié)點創(chuàng)建出來,并放進對象池:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
properties: {
    enemyPrefab: cc.Prefab  // 所需要的預制體
},
onLoad: function () {
    //  創(chuàng)建對象池
    this.enemyPool = new cc.NodePool();
    
    let initCount = 5;
    for (let i = 0; i < initCount; ++i) {
        let enemy = cc.instantiate(this.enemyPrefab); // 創(chuàng)建節(jié)點
        this.enemyPool.put(enemy); // 通過 put 接口放入對象池
    }
}

對象池里需要的初始節(jié)點數(shù)量可以根據(jù)游戲的需要來控制,即使我們對初始節(jié)點數(shù)量的預估不準確也不要緊,后面我們會進行處理。

第三步:從對象池請求對象

接下來在我們的運行時代碼中就可以用下面的方式來獲得對象池中儲存的對象了:

?
1
2
3
4
5
6
7
8
9
10
11
12
createEnemy: function (parentNode) {
    let enemy = null;
    if (this.enemyPool.size() > 0) { // 通過 size 接口判斷對象池中是否有空閑的對象
        // get()獲取對象
        enemy = this.enemyPool.get();
        
    } else { // 如果沒有空閑對象,也就是對象池中備用對象不夠時,我們就用 cc.instantiate 重新創(chuàng)建
        enemy = cc.instantiate(this.enemyPrefab);
    }
    enemy.parent = parentNode; // 將生成的敵人加入節(jié)點樹
    enemy.getComponent('Enemy').init(); //接下來就可以調(diào)用 enemy 身上的腳本進行初始化
}

安全使用對象池的要點就是在 get 獲取對象之前,永遠都要先用 size 來判斷是否有可用的對象,如果沒有就使用正常創(chuàng)建節(jié)點的方法,雖然會消耗一些運行時性能,但總比游戲崩潰要好!另一個選擇是直接調(diào)用 get ,如果對象池里沒有可用的節(jié)點,會返回 null ,在這一步進行判斷也可以。

第四步:將對象返回對象池

當我們殺死敵人時,需要將敵人節(jié)點退還給對象池,以備之后繼續(xù)循環(huán)利用,我們用這樣的方法:

?
1
2
3
4
onEnemyKilled: function (enemy) {
    // enemy 應該是一個 cc.Node
    this.enemyPool.put(enemy); // 和初始化時的方法一樣,將節(jié)點放進對象池,這個方法會同時調(diào)用節(jié)點的 removeFromParent
}

這樣我們就完成了一個完整的循環(huán),主角需要刷多少怪都不成問題了!將節(jié)點放入和從對象池取出的操作不會帶來額外的內(nèi)存管理開銷,因此只要是可能,應該盡量去利用。

第五步:使用組件來處理回收和復用的事件

使用構(gòu)造函數(shù)創(chuàng)建對象池時,可以指定一個組件類型或名稱,作為掛載在節(jié)點上用于處理節(jié)點回收和復用事件的組件。

在創(chuàng)建對象池時可以用:

?
1
let menuItemPool = new cc.NodePool('MenuItem');  // 指定一個組件類型

這樣當使用 menuItemPool.get() 獲取節(jié)點后,就會調(diào)用 MenuItem 里的 reuse方法,完成點擊事件的注冊。
當使用menuItemPool.put(menuItemNode)回收節(jié)點后,會調(diào)用 MenuItem 里的 unuse方法,完成點擊事件的反注冊。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cc.Class({
    extends: cc.Component,
    onLoad: function () {
        this.node.selected = false;
        this.node.on(cc.Node.EventType.TOUCH_END, this.onSelect, this.node);
    },
    // put() 收回對象池時會調(diào)用
    unuse: function () {
        this.node.off(cc.Node.EventType.TOUCH_END, this.onSelect, this.node);
    },
    // get()獲取對象池內(nèi)對象時會調(diào)用
    reuse: function () {
        this.node.on(cc.Node.EventType.TOUCH_END, this.onSelect, this.node);
    }
});

另外 cc.NodePool.get() 可以傳入任意數(shù)量類型的參數(shù),這些參數(shù)會被原樣傳遞給 reuse 方法:

?
1
2
3
4
5
6
7
8
9
10
11
// BulletManager.js
let myBulletPool = new cc.NodePool('Bullet'); //創(chuàng)建子彈對象池
let newBullet = myBulletPool.get(this); // 傳入 manager 的實例,用于之后在子彈腳本中回收子彈
 
// Bullet.js
reuse (bulletManager) {
    this.bulletManager = bulletManager; // get 中傳入的管理類實例
}
hit () {
    this.bulletManager.put(this.node); // 通過之前傳入的管理類實例回收子彈
}

第六步:清除對象池

如果對象池中的節(jié)點不再被需要,我們可以手動清空對象池,銷毀其中緩存的所有節(jié)點:

?
1
myPool.clear(); // 調(diào)用這個方法就可以清空對象池

當對象池實例不再被任何地方引用時,引擎的垃圾回收系統(tǒng)會自動對對象池中的節(jié)點進行銷毀和回收。但這個過程的時間點不可控,另外如果其中的節(jié)點有被其他地方所引用,也可能會導致內(nèi)存泄露,所以最好在切換場景或其他不再需要對象池的時候手動調(diào)用 clear 方法來清空緩存節(jié)點。

以上就是如何使用CocosCreator對象池的詳細內(nèi)容,更多關于CocosCreator對象池的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/qq_45021180/article/details/104484744

延伸 · 閱讀

精彩推薦
  • js教程不用typsescript如何使用類型增強功能

    不用typsescript如何使用類型增強功能

    這篇文章主要給大家介紹了關于不用typsescript如何使用類型增強功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參...

    小云菜7982022-02-12
  • js教程微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    這篇文章主要介紹了微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友...

    巴法云6062022-02-22
  • js教程JavaScript實現(xiàn)切換多張圖片

    JavaScript實現(xiàn)切換多張圖片

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)切換多張圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    是M11772022-01-10
  • js教程JavaScript實現(xiàn)點擊出現(xiàn)子菜單效果

    JavaScript實現(xiàn)點擊出現(xiàn)子菜單效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)點擊出現(xiàn)子菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    weixin_551084226462022-01-19
  • js教程基于JS繪制2021的煙花效果 附源碼下載

    基于JS繪制2021的煙花效果 附源碼下載

    這篇文章主要介紹了基于JS繪制2021的煙花效果,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    3512022-02-17
  • js教程JS實現(xiàn)隨機點名系統(tǒng)

    JS實現(xiàn)隨機點名系統(tǒng)

    這篇文章主要為大家詳細介紹了JS實現(xiàn)隨機點名系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乘風破浪的程序媛3592022-02-22
  • js教程JavaScript 繪制餅圖的示例

    JavaScript 繪制餅圖的示例

    這篇文章主要介紹了JavaScript 繪制餅圖的示例,幫助大家更好的利用JavaScript繪制圖表,感興趣的朋友可以了解下...

    MwqgKG11442022-01-21
  • js教程詳解ES6實現(xiàn)類的私有變量的幾種寫法

    詳解ES6實現(xiàn)類的私有變量的幾種寫法

    這篇文章主要介紹了詳解ES6實現(xiàn)類的私有變量的幾種寫法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    Do_Better11932022-01-20
主站蜘蛛池模板: 欧美中文在线 | 99视频在线观看视频 | 欧美成人精品欧美一级乱黄 | 国产精品视频2021 | 国产资源在线视频 | 91麻豆精品国产91久久久更新资源速度超快 | 精品黑人一区二区三区国语馆 | 在线免费视频a | 亚洲性综合网 | 精品国产视频一区二区三区 | 中文在线观看www | 性爱视频在线免费 | 性少妇videosexfreexx | 真人一级毛片免费 | 国产精品亚洲精品日韩已方 | 成人羞羞在线观看网站 | 久久久久久久久久久av | 蜜桃欧美性大片免费视频 | 日本中文一级片 | 成人三级电影网址 | 全黄裸片武则天一级第4季 偿还电影免费看 | 色淫网站免费视频 | 久久久精品综合 | 欧美a视频 | 日韩视频在线一区二区三区 | 欧美一极视频 | 中国性xxx | 成人做爰高潮片免费视频美国 | 日本高清com| 九九热免费精品视频 | av在线成人| 欧美男人天堂网 | 久久9999久久| 在线成人免费观看 | 久久精品视频黄色 | 欧美亚成人 | 伊人在线视频 | 免费观看一级欧美大 | av在线久草 | 国av在线 | 中文字幕在线资源 |