猴子原創,歡迎轉載。轉載請註明: 轉載自Cocos2D開發網--Cocos2Dev.com,謝謝!
原文地址: http://www.cocos2dev.com/?p=331
以前寫過一個遊戲中的天氣系統,今天有人說我的天氣系統有點卡,不是很好用。我看下了他的代碼,發現他改了My Code,把CCSpriteBatchNode刪除了,直接用addChild,每個sprite都是重新讀取的貼圖。
我想說,同學呀,你把暴風雪所有特效開啟後,你有沒有注意下你的遊戲情境顯示了1000多渲染批次。這能不卡嗎?
今天剛好有點時間,我介紹下CCSpriteBatchNode,以及利用它最佳化遊戲渲染效率。
在cocos2d-x 2.x 之後,大家都看到了左下角的FPS變成3行,多了兩行資料。
最上面一行是指的當前情境的渲染批次。(簡單理解為需要渲染多少個貼圖出來)
中間一行是渲染每一幀需要的時間。
最下行就是大家熟悉的FPS。
CCSpriteBatchNode介紹:
1、先說下渲染批次:這是遊戲引擎中一個比較重要的最佳化指標,指的是一次渲染凋用。也就是說,渲染的次數越少,遊戲的運行效率越高。
2、CCSpriteBatchNode就是cocos2d-x為了降低渲染批次而建立的一個專門管理精靈的類。
舉例介紹:
1、使用CCSprite建立1000個Icon.png到情境中,這樣渲染批次就是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) ); addChild(testIcon);}
如下:
上面的可以看到,建立了1000個Icon到情境中,這是的FPS是22,渲染批次是1000次。
2、使用CCSpriteBatchNode批量渲染,一次渲染就把所有的CCSprite繪製出來。大大降低渲染批次。
舉例介紹:
1、使用CCSprite建立1000個Icon.png到情境中,但是這裡利用了CCSpriteBatchNode批量渲染。這時的渲染批次、FPS如何呢?
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);}
如下:
上面的可以看到,建立了1000個Icon到情境中,這是的FPS是39.9,渲染批次是1次。
註:
1、
CCSpriteBatchNode::create(const char *fileImage);//利用貼圖建立,預設子節點數量29.(數量不夠時,系統會自己增加)
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(const char *fileImage, unsigned int capacity);//利用貼圖建立,並指定子節點數量
2、使用CCSpriteBatchNode時,所使用的貼圖必須是同一張圖片,也不能指定精靈的深度。所有的精靈都必須在同一渲染層。
3、但是項目中總不可能局限於一張貼圖上,所以你可以把多張貼圖合并成一張大貼圖(合并的工具很多,我不介紹了)。所以利用合成後的大貼圖建立一個CCSpriteBatchNode。
然後建立CCSprite的時候,設定貼圖的地區就可以了。