您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-JS 性能优化 - 对象缓冲池 ( cc.pool )

2016-12-23 13:46 951 查看

对象缓冲池 ( cc.pool ) :

作用 :

优化创建效率 , 尤其是针对需要多次创建的情况 .

缓冲池 API :

缓冲池 ( cc.pool ) 提供的函数并不多 , 只有5个 .

cc.pool.putInPool(obj);             //将对象放入缓冲池
cc.pool.hasObject(objClass);        //判断缓冲池是否存在可用的指定对象
cc.pool.removeObject(obj);          //删除指定对象
cc.pool.getFromPool(objClass);      //从缓冲池获取指定对象
cc.pool.drainAllPools();            //清空缓冲池


用法 :

创建一个对象类 (Hero) , 添加两个函数 , unuse 和 reuse , 重点要注意的是 , unuse 里面的 retain 方法 , 没有的话 , 对象可能会被系统回收 .

var Hero = cc.Sprite.extend({
_hp:null,
_mp:null,
ctor: function(hp,mp){
this._super("res/box.png");
this.initData(hp,mp);
},

initData: function(hp,mp){
this._hp = hp;
this._mp = mp;
},

unuse: function(){
this._hp = 0;     //属性清空
this._mp = 0;
this.retain();    //保存  防止被回收
this.removeFromParent();
},

reuse: function(hp,mp){
this.initData(hp,mp);
}
});


添加创建Hero 函数 .

var CreateHero = function(hp,mp){
if(cc.pool.hasObject(Hero))   //判断缓冲池里 是否存在 Hero对象
{
cc.log('取出');
return cc.pool.getFromPool(Hero,hp,mp);   // 从缓冲池里取出 Hero对象
}
else
{
cc.log('新创建');
return new Hero(hp,mp)
}
};


先预先将5000个Hero对象放入缓冲池 , 然后我将连续创建5000个Hero的总耗时 和 预先将Hero放入缓冲池再取出5000个的总耗时做一个对比 .

var HelloWorldLayer = cc.Layer.extend({
ctor:function () {
this._super();
this.preparHeroPool();    //预先将5000个Hero放入缓冲池

this.create(1);   //第一轮  从对象池取出5000个
this.create(2);   //第二轮  新创建5000个
},

create: function(num){

var time = new Date().getTime();

for(var i = 0; i < 5000; i++)
{
var hero = CreateHero(1,2);
hero.setPosition(cc.winSize.width/2, cc.winSize.height/2);
this.addChild(hero);
}

var totleTime = new Date().getTime() - time;
cc.log("第 "+num+" 轮总耗时 = ",totleTime);
},

preparHeroPool: function(){

for(var i = 0; i < 5000; i++)
{
var node = new Hero(0,0);
cc.pool.putInPool(node);
}
},

});


结果 :



一次不能说明问题 , 再做一次测试 .



从结果上来看 , 的确是存在性能差异的 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: