在我們面試使用Cocos2dx 開發遊戲的公司時候,有可能會問到CCSpriteBatchNode和CCSpriteFrameCache的區別有什麼?
總的講CCSpriteBatchNode是讀取一張圖(或者是一張大圖)根據Rect讀取不同紋理,返回小圖給Sprite使用。CCSpriteFrameCache讀取拼圖和plist,可以根據圖片名字獲取小的紋理圖。
1:CCSpriteBatchNode
在屏幕上面繪製一張圖片時,圖形處理器會先準備渲染, 然後渲染圖形,完成渲染後進行清理,這就是對一張圖片開始渲染、結束渲染的系統開銷。如果使用一張紋理貼圖渲染一組精靈,圖形處理器硬件只需要執行一次準備、渲染、完成渲染進行清理。
我們在使用一張圖片多次出現在屏幕中的時候就可以使用CCSpriteBatchNode,會減少圖形處理器硬件渲染圖片對系統的開銷。
我們測試使用普通的CCSprite添加1000張圖片
for(int i = 0;i < 1000;++i)
{
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::create("Icon.png");
testIcon->setPosition( ccp(x, y) );
this->addChild(testIcon);
}
我們會在左下角看到FPS 等一些信息。 此時顯示的是渲染的批次是 1000.
我們使用CCSpriteBatchNode同樣添加1000張圖片
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);
batchNode->setPosition(CCPointZero);
this->addChild(batchNode);
for(int i = 0;i < 1000;++i)
{
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
testIcon->setPosition( ccp(x, y) );
batchNode->addChild(testIcon);
}
然而此時顯示:渲染批次是 1.
// 利用貼圖創建,默認子節點的數量是29(數量不夠時,系統會自己增加)
CCSpriteBatchNode::create(const char* fileImage);
// 創建貼圖並指定子節點的數量
CCSpriteBatchNode::create(const char* fileImage, unsigned int capacity);
2:CCSpriteFrameCache
將精靈添加到精靈幀緩存中
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("animations/grossini.plist", "animations/grossini.png");
m_pSprite1 = CCSprite::spriteWithSpriteFrameName("grossini_dance_01.png");
m_pSprite1->setPosition( ccp( s.width/2-80, s.height/2) );
this->addChild(m_pSprite);
結合使用看到更清楚明瞭
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animations/ghosts.plist", "animations/ghosts.png");
CCSpriteBatchNode *aParent = CCSpriteBatchNode::batchNodeWithFile("animations/ghosts.png");
addChild(aParent, 0, kTagSprite1);
CCSprite *pFather = CCSprite::spriteWithSpriteFrameName("father.gif");
pFather->setPosition(ccp( s.width/2, s.height/2));
aParent->addChild(pFather, 0, kTagSprite2);
大致就是這樣,在後面如有更好的解釋修改。
-------------------------------------我的一步步的爬坑---------------------