zoukankan      html  css  js  c++  java
  • 对象缓冲池 ( cc.pool ) :

    对象缓冲池 ( 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);
            }
        },
    
    });

    结果 :

    这里写图片描述

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

    这里写图片描述

    从结果上来看 , 的确是存在性能差异的 .

  • 相关阅读:
    mac上的终端bash命令(二)基础
    Android 开发笔记___drawable
    Android 开发笔记___图像按钮__imageButton
    Android 开发笔记___滚动视图__scroll view
    Android 开发笔记___textvieww__跑马灯效果
    Android 开发笔记___textview_聊天室效果
    Android 开发笔记___图像视图__简单截屏
    Android 开发笔记___图像视图
    javaScript学习笔记(一)js基础
    iview2+ 表单密码验证
  • 原文地址:https://www.cnblogs.com/luorende/p/8572080.html
Copyright © 2011-2022 走看看