做程序開發肯定要考慮到內存的優化,畢竟iphone本身的內存就不是很大,這一節主要說這個cocos2d開發對內存的優化,具體表現在,既可以對相同的精靈(圖片)只渲染一次,也可以對不能的精靈只渲染一次。
下面是程序的做法,先屏蔽前面的代碼。
先簡單介紹一下 CCSpriteBatchNode類,它是用來優化遊戲渲染效率的,CCSpriteBatchNode 中的所有CCSprite只會被渲染1次,因此可以提高遊戲的FPS。限制:加入到CCSpriteBatchNode 中的CCSprite必須使用同一張紋理圖。
具體代碼
CCSpriteBatchNode *node =CCSpriteBatchNode::create("Peashooter1.tiff");//先渲染文件
this->addChild(node);
CCSprite *plant = CCSprite::create("Peashooter1.tiff"); //創建精靈
plant->setPosition(ccp(300,300));
node->addChild(plant); //添加到 node中
運行:可以看到 添加一個精靈 此時的FPS爲1。下面再添加一個文件相同精靈:
CCSpriteBatchNode *node =CCSpriteBatchNode::create("Peashooter1.tiff");//先渲染文件
this->addChild(node);
CCSprite *plant = CCSprite::create("Peashooter1.tiff"); //創建精靈
plant->setPosition(ccp(300,300));
node->addChild(plant); //添加到 node中
//再創建一個精靈
CCSprite *plant1 = CCSprite::create("Peashooter1.tiff"); //創建精靈
plant1->setPosition(ccp(400,400));
node->addChild(plant1);
return true;
運行:
可以看到兩個精靈都被創建出來了,但是FPS還是爲1,這就是CCSpriteBatchNode的作用,它保證添加到類裏面所有相同文件的精靈只被渲染一次。
既然相同的精靈可以只渲染,那麼不同的文件的精靈可不可以只被渲染一次,答案是可以的,看下面的做法。
這時要用到第(五)篇文章講的內容,具體做法是我們可以先把很多種不同的圖片合成一張大圖,然後將這張大圖添加到CCSpriteBatchNode中,這時渲染大圖裏面的小圖都會只被渲染一次,看具體程序做法:
///*如果想讓不同圖片只渲染一次得要用到幀緩存機制渲染多個不同的圖片 */
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Person.plist"); //先緩存大圖
CCSpriteBatchNode *node1 =CCSpriteBatchNode::create("Person.png");//渲染到一個大圖片
this->addChild(node1);
CCSpriteFrame *frame =CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("本.png");
CCSprite *plant3 =CCSprite::createWithSpriteFrame(frame);
plant3->setPosition(ccp(200,200));
node1->addChild(plant3);
CCSpriteFrame *frame1 =CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("登.png");
CCSprite *plant4 =CCSprite::createWithSpriteFrame(frame1);
plant4->setPosition(ccp(500,500));
node1->addChild(plant4);
這個大圖 所有小圖片的名字:運行:
我們可以看到又增加了兩張圖片,而且這兩張圖片不是一樣的,但是FPS還是爲2只加了1,表示新增加的兩個精靈只被渲染了一次,現在我們發現幀緩存機制 是非常強大的,在遊戲開發中經常用到。