三種緩存類介紹

  • 在介紹三個緩存時,我們要先理清一個問題:什麼是紋理?通俗的解釋呢,紋理就是圖片的意思啦。當一張圖片被加載到內存後,它是以紋理的形式存在的。從這裏可以看出,紋理其實就是一塊內存!這塊內存中存放的是按照指定的像素格式填充的圖片像素信息。

    下面進入正題:
    1、TextureCache
    TextureCache紋理緩存是最底層也是最有效的紋理緩存。它到底有什麼用呢?我先描述一個現象吧:假設遊戲中有個界面用到的圖片非常多,,第一次點進這界面時速度非常慢(因爲要加載繪製很多圖片),可第二次點擊卻一下子就進去了。這是爲什麼呢?原來Cocos2dx的渲染機制是可以重複使用同一份紋理在不同的場合進行繪製,從而達到重複使用,降低內存和GPU運算資源的消耗與開銷。舉個例子:創建一個精靈
    auto sp = Sprite::create("image.png");//精靈圖片是image.png
    第一次使用image.png這圖片有兩個步驟,一個是先將圖片加載進TextureCache緩存中,下一步是繪製圖片,從而將其顯示在場景中
    第二次使用image.png時,因爲之前image.png已經被放入TextureCache中,所以這裏只需從緩存中找到這張圖片,然後將其繪製出來就可以
    下面用幾行代碼做個總結:
    //第一種載入精靈的方法
    auto sp1 = Sprite::create("boy.png");
    this->addChild(sp1,1);
    
    //第二種載入精靈的方法
    auto sp_cache = Director::getInstance()->addImage("boy.png");
    auto sp1 = Sprite::createWithTexture(sp_cache);
    this->addChild(sp1,1);

    有人可能回認爲第二種方法效率比較高,其實不然,倆種都一樣!它們都是經過了加載圖片到TextureCache緩存中,然後從緩存中提取該紋理並繪製出來這兩個步驟。但是第二種方法使用起來會更靈活,就像我上面說到的,如果一個界面用到的資源非常多,可以先將這些圖片資源讀取到TextureCache中,等真正進入到這個界面再使用這些圖片速度就會非常快。常用到的地方就是遊戲的資源加載界面,可以參考這篇博客:http://blog.csdn.net/start530/article/details/19420317

     

    2、SpriteFrameCache
    顧名思義,這裏的緩存就是SpriteFrame的緩存。跟TextureCache功能一樣,不過跟TextureCache不同的是,如果內存池中不存在要查找的圖片,它會提示找不到,而不會去本地加載圖片。
    SpriteFrameCache一般用來處理plist文件(這個文件指定了每個獨立的精靈在這張“大圖”裏面的位置和大小),該文件對應一張包含多個精靈的大圖,plist文件可以使用TexturePacker製作。
    auto frameCache = SpriteFrameCache::getInstance();
    frameCache->addSpriteFramesWithFile("boy.plist","boy.png");//boy.png裏集合了boy1.png,boy2.png這些小圖
    auto frame_sp = Sprite::createWithSpriteFrameName("boy1.png");//從SpriteFrameCache緩存中找到boy1.png這張圖片.
    this->addChild(frame_sp,2);

     

    3、AnimationCache

    這個應該是最簡單的吧,是動畫的緩存。對於精靈動畫,每次創建時都需要加載精靈幀,然後按順序添加到數組,再用Animation讀取數組創建動畫。這是一個非常煩瑣的計算過程。而對於使用頻率高的動畫,例如角色的走動、跳舞等,可以將其加入到AnimationCache中,每次使用都從這個緩存中調用,這樣可以有效的降低創建動畫的巨大消耗。
    示例如下:假設有兩組動畫dance_animate,sleep_animate.
    //將其加載到緩存中
    AnimationCache::getInstance()->addAnimation(dance_animate,"dance");//第二個參數是動畫存入緩存時對應的key
    AnimationCache::getInstance()->addAnimation(sleep_animate,"sleep");
    
    //讀取緩存中的動畫
    auto dance_animate = AnimationCache::getInstance()->animationByName("dance");//根據key從緩存中提取動畫
    auto sleep_animate = AnimationCache::getInstance()->animationByName("sleep");

    好了,就這樣。

    來源:http://blog.csdn.net/star530/article/details/23612487
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章