zoukankan      html  css  js  c++  java
  • cocos2d 缓存池 对象的再利用

    1.简单的叙述说明池


    例如,我们知道,游戏的游戏类型跑酷,游戏元素都在不断重复。游戏的内容将继续从屏幕右侧的创建,当元件在屏幕的左侧的,将消失。假设不变new 对象。release 对象 性能影响。怎样优化呢?就涉及到缓存池的概念。


    再举一个样例:一个主角在一个竞技场中不断杀怪。每次有5个怪出现,杀死一个又会出来一个。

    每次出怪就new 怪,死亡怪就release怪。会非常浪费的。

    已经死亡的怪,我们简单地给他补满血不就能够反复使用了嘛!像拍电影,一个人不是真正死亡,仅仅是看起来死了。还是能够反复使用的嘛!


    2.缓存池简单实现


    我们能够事先new10个怪放入到一个数组中。简单把这个数组称作缓存池,事实上就是一个数组。

    再搞个int的变量表示取数组中第几个怪,初始化为0,表示取第一个怪。

    1.当我们想要从屏幕中创建一个新怪时,不去new,而是用那个int变量从数组中取一个怪拿来用。当然拿来用之后,还要简单的初始化下,给他补满血啊。穿上完整衣服等等。再把int变量加1,假设int变量等于数组的长度时。把它归0。

    2.当一个怪被主角杀死时,让这怪播完死亡动画后,就remove掉,但不把他全然release掉。

    差点儿相同实现就是这样,简单吧!

    仅仅是注意初始缓存池。new对象的数量。一般要大于你实际使用的数量。


    3.简单代码


    //创建缓存池
    Vector bonePools;
    void createBonePools(){
        
        if(bonePools.empty()){
            for(int i = 0; i < 30; ++i){
                auto oneBone = Bone::create();
                bonePools.pushBack(oneBone);
            }
        }
    }

    //从缓存池中取一个对象
    int _boneIndex;
    Bone* getOneBone(){
        if(_boneIndex == bonePools.size()){
            _boneIndex = 0;
        }
        Bone* result = bonePools.at(_boneIndex);
         result->reuseInit();//这个比較重要,反复使用一个元素也要简单初始化一些东西的。之前死亡的人物记得给他补满血
        ++_boneIndex;
        return result;
    }


    cocos2d 缓存池 对象的再利用

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Android View 阴影的总结
    清晰的教你如何将 Maven 项目上传至 中央仓库以及版本更新
    简单粗暴的上传项目至 Github
    App自动更新(DownloadManager下载器)
    类型判断
    前端防御XSS
    window.location.href/replace/reload()/页面跳转+替换+刷新
    对数组排序进行"洗牌"(随机排序)
    iframe跨域上传图片
    Vim 新手节省时间的小技巧
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4638336.html
Copyright © 2011-2022 走看看