精靈性能優化-使用精靈幀緩存

精靈幀緩存是緩存的一種,緩存有以下幾種:

紋理緩存(TextureCache)。使用紋理緩存能夠建立紋理對象,在上一節咱們已經用到了。html

精靈幀緩存(SpriteFrameCache)。可以從精靈表中建立精靈幀緩存,而後再從精靈幀緩存中得到精靈對象,反覆使用精靈對象時候,使用精靈幀緩存能夠節省內存消耗。設計模式

動畫緩存(AnimationCache)。動畫緩存主要用於精靈動畫,精靈動畫中的每一幀是從動畫緩存中獲取的。緩存

這一個節咱們主要介紹精靈幀緩存(SpriteFrameCache),要使用精靈幀緩存涉及到的類有:SpriteFrame和SpriteFrameCache。使用SpriteFrameCache建立精靈對象的主要代碼以下:函數

        

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片動畫

  1. SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist");                              ①  this

  2. to mountain1 =Sprite::createWithSpriteFrameName("mountain1.png");                                             ②  spa


上述代碼第①行是經過SpriteFrameCache建立精靈幀緩存對象,它是採用單例設計模式進行設計的,getInstance()函數能夠得到SpriteFrameCache單一實例,addSpriteFramesWithFile函數是將精靈幀添加到緩存中,其中SpirteSheet.plist是座標文件。咱們能夠屢次調用addSpriteFramesWithFile函數添加更多的精靈幀到緩存中。.net

第②行代碼Sprite::createWithSpriteFrameName("mountain1.png")是經過Sprite的createWithSpriteFrameName函數建立精靈對象,其中的參數mountain1.png是SpirteSheet.plist是座標文件中定義的精靈幀名(見SpirteSheet.plist文件代碼中的第②行)。設計

下面咱們會經過一個實例介紹精靈幀緩存使用,這個實例以下圖所示,在遊戲場景中有背景、山和英雄三個精靈。code


在HelloWorldScene.cpp實現的init函數代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. bool HelloWorld::init()  

  2. {  

  3.    if ( !Layer::init() )  

  4.    {  

  5.        return false;  

  6.    }  

  7.      

  8.    Size visibleSize = Director::getInstance()->getVisibleSize();  

  9.    Point origin = Director::getInstance()->getVisibleOrigin();  

  10.    

  11.     autobackground = Sprite::create("background.png");                                                                 ①  

  12.     background->setAnchorPoint(Point::ZERO);  

  13.    this->addChild(background,0);  

  14.      

  15.     SpriteFrameCache*frameCache = SpriteFrameCache::getInstance();                               ②  

  16.     frameCache->addSpriteFramesWithFile("SpirteSheet.plist");                                                      ③  

  17.    

  18.    auto mountain1 =Sprite::createWithSpriteFrameName("mountain1.png");                              ④  

  19.     mountain1->setAnchorPoint(Point::ZERO);  

  20.    mountain1->setPosition(Point(-200,80));  

  21.    this->addChild(mountain1,0);  

  22.    

  23.     SpriteFrame*heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png");            ⑤  

  24.     Sprite*hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame);                                              ⑥  

  25.    hero1->setPosition(Point(800,200));  

  26.    this->addChild(hero1,0);  

  27.    

  28.    return true;  

  29. }  


上述代碼第①行是建立一個背景精靈對象,這個背景精靈對象,並非經過精靈緩存建立的,而是直接經過精靈文件直接建立的,事實上咱們徹底也能夠將這個背景圖片放到精靈表中。

第②行代碼是得到精靈緩存對象。第③行代碼是經過addSpriteFramesWithFile函數爲精靈緩存中添加精靈幀。在前面的介紹中咱們使用一條語句SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist")替代第②和第③行兩條語句。在這裏咱們分紅兩條語句是由於後面咱們還有使用frameCache變量。

第④行代碼是使用Sprite 的createWithSpriteFrameName函數建立精靈對象,其中的參數是精靈幀的名字。

代碼第⑤~⑥行是使用精靈緩存建立精靈對象的另一種函數,其中第⑤行代碼是使用精靈緩存對象frameCache的getSpriteFrameByName函數建立SpriteFrame對象,SpriteFrame對象就是「精靈幀」對象,事實上在精靈緩存中存放的都是這種類型的對象。第⑥行代碼是經過精靈幀對象建立。第⑤和⑥行使用精靈緩存方式主要應用於精靈動畫時候,相關的知識咱們將在精靈動畫部分介紹。

精靈緩存再也不使用後忘記清空或移除相關精靈幀,不然若是有相同名稱的精靈幀時候,就會出現一些奇怪的現象。清空或移除精靈幀的緩存函數以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. pvoid removeSpriteFrameByName(conststd::string & name)。指定具體的精靈幀名移除。  

  2. pvoid removeSpriteFrames()。指定清空精靈緩存。  

  3. pvoidremoveSpriteFramesFromFile(const std::string & plist)。指定具體的座標文件移除精靈幀。  

  4. pvoid removeUnusedSpriteFrames()。移除沒有使用的精靈幀。  


若是爲了防止該場景中的精靈緩存對下一個場景產生影響,咱們能夠在當前場景所在層的onExit函數中調用這些函數,相關代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. void HelloWorld::onExit()  

  2. {  

  3.     Layer::onExit();  

  4.     SpriteFrameCache::getInstance()->removeSpriteFrames();  

  5. }  


onExit()函數是層退出時候回調的函數,與init函數相似都屬於層的生命週期中的函數。咱們要在h文件中定義,在cpp文件中聲明。HelloWorld.h文件的相關代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. #ifndef __HELLOWORLD_SCENE_H__  

  2. #define __HELLOWORLD_SCENE_H__  

  3.    

  4. #include "cocos2d.h"  

  5.    

  6. class HelloWorld : public cocos2d::Layer  

  7. {  

  8. public:  

  9.    … …  

  10.     virtualbool init();   

  11.         //退出Layer回調函數  

  12.         virtualvoid onExit();      

  13.    … …  

  14.    CREATE_FUNC(HelloWorld);  

  15. };  

  16.    

  17. #endif // __HELLOWORLD_SCENE_H__  

  18. 固然精靈緩存清除工做也能夠放到下一個場景建立時候,也就是下一個場景所在層的init函數中實現,相關代碼以下:  

  19. bool HelloWorld::init()  

  20. {  

  21.    … …     

  22.    SpriteFrameCache::getInstance()->removeSpriteFrames();  

  23.    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist");  

  24.    … …     

  25. }  

相關文章
相關標籤/搜索