遊戲開發效能優化之物件池
阿新 • • 發佈:2020-07-31
# 為什麼要使用物件池
物件池優化是遊戲開發中非常重要的優化方式,也是影響遊戲效能的重要因素之一。
在遊戲中有許多物件在不停的建立與移除,比如角色攻擊子彈、特效的建立與移除,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