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); } }, });
结果 :
一次不能说明问题 , 再做一次测试 .
从结果上来看 , 的确是存在性能差异的 .
相关文章推荐
- cocos2d_x之AnySDK接入流程
- cocos2d js 学习笔记之瓦片地图
- Cocos2d-x 物理引擎及碰撞
- Cocos2d-x基础知识
- cocos2d3.x在android下屏蔽多点触控
- cocos2dx 3.12 各平台资源加密解密
- cocos2dx v2下载
- 【iOS】Cocos2dx封装为view方便做3D动画效果
- cocos2dx 3.x (单选,多选,复选checkBox按钮的实现) RadioButton
- cocos2dx和lua计算两点的夹角
- cocos2dx基础篇(23)——进度条CCProgressTimer
- cocos2d-js 打包app包时 调用 cc.audioEngine.playMusic(sound, loop); 不能播放音乐
- Cocos2d-x3.3 使用WebView以及遇到的问题
- 面试 cocos2dx
- cocos2dx实现转盘旋转外加粒子效果
- cocos2dx 入门
- cocos2dx-3.x 导出自定义类到 lua 过程详解
- Cocos2d-x是怎样实现跨平台?
- 怎样在cocos2Dx项目里加so库
- cocos2dx三种定时器