CCTextureCache 和 CCSpriteFrameCache

CCTexture2D是一个纹理贴图

CCTexture2D* cache =CCTextureCache::sharedTextureCache()->addImage("hero.png"); 
CCSprite* sprite =CCSprite::spriteWithTexture(cache); 
CCTextureCache 它相当于CCTexture2D的容器,是内存池,用来缓存CCTexture2D对象的,它内部有一个字典CCMutableDictionarym_pTextures,key为图片的名称,值是CCTexture2D。

 CCSpriteBatchNode

它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显。因为cocos2d-x采用opengles绘制图片的,opengles绘制每个精灵都会执行:open-draw-close流程。而CCSpriteBatchNode是把多个精灵放到一个纹理上,绘制的时候直接统一绘制该texture,不需要单独绘制子节点,这样opengles绘制的时候变成了:open-draw()-draw()…-draw()-close(),节省了多次open-close的时间。CCSpriteBatchNode内部封装了一个CCTextureAtlas(纹理图集,它内部封装了一个CCTexture2D)和一个CCArray(用来存储CCSpriteBatchNode的子节点:单个精灵)。注意:因为绘制的时候只open-close一次,所以CCSpriteBatchNode对象的所有子节点都必须和它是用同一个texture(同一张图片):

在addChild的时候会检查子节点纹理的名称跟CCSpriteBatchNode的是不是一样,如果不一样就会出错,

 CCSpriteFrameCache

它是管理CCSpriteFrame的内存池,跟CCTextureCache功能一样,不过跟CCTextureCache不同的是,如果内存池中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。它的内部封装了一个字典:CCDictionary*m_pSpriteFrames,key为帧的名称。CCSpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。

下面是使用CCSpriteFrameCache的使用代码示例:

CCSpriteFrameCache* cache =CCSpriteFrameCache::sharedSpriteFrameCache(); 
    cache->addSpriteFramesWithFile("animations/grossini.plist","animations/grossini.png"); 
    m_pSprite1 =CCSprite::spriteWithSpriteFrameName("grossini_dance_01.png"); 
    CCSpriteFrameCache * cache = CCSpriteFrameCache::sharedSpriteFrameCache();
    cache->addSpriteFramesWithFile("game-art.plist");
    CCSpriteFrame * frame = cache->spriteFrameByName("ship-anim0.png");
    CCSpriteBatchNode * node =CCSpriteBatchNode::createWithTexture(frame->getTexture());
    this->addChild(node,2);
    for(int i=0;i<<span style="color:#0433ff">5;i++)
    {
       CCSprite * sprite =CCSprite::createWithSpriteFrame(frame);
       sprite->setPosition(ccp(CCRANDOM_0_1()*480,CCRANDOM_0_1()*320));
       node->addChild(sprite);
    }

在这里要注意的就是 两种获得图片纹理的不同方式,一种就是通过

CCSpriteFrameCache先获取plist文件,该文件是个字典,里面的元素可以通过键值取到,然后在加入到 CCSpriteBatchNode中进行渲染,第二种方法就是用 CCTexture2D首先通过  
CCTexture2D
* text2d= CCTextureCache :: sharedTextureCache ()-> addImage ( "enemy_duck.png" );获得一张贴图,然后在将这些图分别画出来,代码如下
CCTexture2D * text2d = CCTextureCache::sharedTextureCache()->addImage("enemy_duck.png");
    if (!CCSprite::initWithTexture(text2d))
    {
       returnfalse;
    }

    CCArray * frames = CCArray::create();
    float spritewith= text2d->getContentSize().width/10;
    float hight = text2d->getContentSize().height;
    for(inti=0;i<<span style="color:#0433ff">10;i++)
    {
       CCRect rect= CCRectMake(spritewith*i,0, spritewith, hight);
       CCSpriteFrame * sprite = CCSpriteFrame::createWithTexture(text2d, rect);
       frames->addObject(sprite);
    }

    CCAnimation * anim = CCAnimation::createWithSpriteFrames(frames,0.08f);
    CCAnimate * animate = CCAnimate::create(anim);
    CCRepeatForever *repeate = CCRepeatForever::create(animate);
    this->runAction(repeate);


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在cocos2d-x中释放内存可以采取以下几个步骤。首先,需要注意释放缓存类的顺序。通常情况下,CCTextureCache占用的资源最多,因此应该最后释放。如果直接释放CCTextureCache,可能会导致其他缓存类找不到资源而导致程序崩溃。其次,对于使用了自动释放池的对象,需要手动调用release来释放。在每一帧结束时,自动释放池会被清空,其中的节点会执行release操作,但是节点并不会立即被释放,而是在下一帧才会被从池中移除。此外,对于通过addChild方法添加到场景中的节点,需要手动调用release来释放。当场景退出时,会析构释放子节点容器,每个子节点会被调用release,从而释放整个场景节点树。最后,如果有特效的场景切换,可以使用CCDirector::sharedDirector()->replaceScene来切换场景,并在切换前释放不再使用的资源。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [关于cocos2d-x 资源释放问题](https://blog.csdn.net/Winthinking/article/details/50708114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [cocos2dx 内存管理机制,自动释放池](https://blog.csdn.net/qingmvc/article/details/117377180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值