cocos2d 缓存池 对象重复使用

1.缓冲池简单描述

 

我们知道一个游戏比如跑酷类型的游戏,游戏元素会不断重复。游戏元素会不断从屏幕右边创建出来,当一个元素移出左边屏幕时,又会消失掉。如果不断地new 对象,release 对象 会有性能影响。如何优化呢?就涉及到缓存池的概念。

 

再举一个例子:一个主角在一个竞技场中不断杀怪。每次有5个怪出现,杀死一个又会出来一个。每次出怪就new 怪,死亡怪就release怪,会很浪费的。已经死亡的怪,我们简单地给他补满血不就可以重复使用了嘛!像拍电影,一个人不是真正死亡,只是看起来死了,还是可以重复使用的嘛!

 

2.缓存池简单实现

 

我们可以事先new10个怪放入到一个数组中,简单把这个数组称作缓存池,其实就是一个数组。再搞个int的变量表示取数组中第几个怪,初始化为0,表示取第一个怪。

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

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

差不多实现就是这样,简单吧!只是注意初始缓存池,new对象的数量。一般要大于你实际使用的数量。

 

3.简单代码

 

//创建缓存池
Vector<Bone*> 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;
}

http://www.waitingfy.com/archives/1319

1319

3 Responses to cocos2d 缓存池 对象重复使用

  1. 莫小贱V说道:

    不太明白“重复”这个词在逻辑中哪里用到了?楼主能解释一下吗?都已经被remove掉了 那数组不是就没有了一个吗 数组中被取完不是还要new吗

    • 瓦力冫说道:

      加入到cocos2d的Vector中比较好,这样引用次数+1。再用的时候addChild,引用次数继续+1。 当你把这个对象removeFromParent的时候,屏幕上看不到了,引用次数-1。但因为总的引用次数还未到释放。它还在Vector中,没有完全Release。不要去Release Vector。你可以退出场景的时候再清空Vector。不过我想着看这篇文章,觉得你如果不涉及到骨骼动画那种怪,普通的东西不需要这么复杂搞,性能完全够。

      • 莫小贱V说道:

        谢谢解答 理解错你说的remove的意思了 以为是从数组中删除 确实 平常开发一般的小游戏 这样的缓存池不太需要 一次创建的精灵也没有那么多 涉及的绘制命令也就没有那么多

Leave a Reply

Name and Email Address are required fields.
Your email will not be published or shared with third parties.