1. 程式人生 > >遊戲開發效能優化之物件池

遊戲開發效能優化之物件池

# 為什麼要使用物件池 物件池優化是遊戲開發中非常重要的優化方式,也是影響遊戲效能的重要因素之一。 在遊戲中有許多物件在不停的建立與移除,比如角色攻擊子彈、特效的建立與移除,NPC的被消滅與重新整理等,在建立過程中非常消耗效能,特別是數量多的情況下。 物件池技術能很好解決以上問題,在物件移除消失的時候回收到物件池,需要新物件的時候直接從物件池中取出使用。 優點是減少了例項化物件時的開銷,且能讓物件反覆使用,減少了新記憶體分配與垃圾回收器執行的機會。 # Cocos官方文件說明的使用方式 [https://docs.cocos.com/creator/manual/zh/scripting/pooling.html](https://docs.cocos.com/creator/manual/zh/scripting/pooling.html) ![image.png](https://img2020.cnblogs.com/other/330473/202007/330473-20200731101736160-2090820732.png) 1. 這樣的一個物件池,其實嚴格意義上來說更像是節點池,因為它已經處理了節點移除等操作。 2. 無法將普通的TS物件放入cc.NodePool 進行管理。那麼當我們需要對普通的TS物件進行管理的時候還是需要自己再寫一個物件池。 3. 好處就是回收節點的時候不需要對節點做任何操作。 4. 將節點新增到場景中時不需要考慮是否存在的問題,直接addChild就可以了,因為存在於物件池中的節點必定是從場景中移除的節點。 5. 在使用的過程中頻繁移除和新增有效能問題。 針對以上問題,我分享一下自己使用物件池的經驗。 # 物件池的封裝 1. 節點物件池 ``` import { IPool } from "./IPool"; export default class CCNodePool implements IPool{ private pool: cc.NodePool; private resItem: cc.Prefab; private name: string = '' /** * * @param prefab 預製體 * @param conut 初始化個數 */ constructor(name: string, resItem: cc.Prefab, conut: number) { this.name = name this.pool = new cc.NodePool(); this.resItem = resItem; for (let i = 0; i < conut; i++) { let obj: cc.Node = this.getNode(); // 建立節點 this.pool.put(obj); // 通過 putInPool 介面放入物件池 } } getName() { return this.name } get() { let go: cc.Node = this.pool.size() > 0 ? this.pool.get() : this.getNode(); return go; } getNode() { if(this.resItem){ return cc.instantiate(this.resItem); }else{ console.error(' 預製體沒有賦值 ') return null; } } size() { return this.pool.size(); } put(go: cc.Node) { this.pool.put(go); } clear() { this.pool.clear(); } } ``` 2. 非節點物件池 ``` export default class TSOb