CCSpriteBatchNode和CCSpriteFrameCache的區別及用法

在我們面試使用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); 


大致就是這樣,在後面如有更好的解釋修改。



-------------------------------------我的一步步的爬坑---------------------



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章