cocos2dx之CCTextureCache

_Proxy發表於2020-04-07

首先是最底層也最有效的紋理快取CCTextureCache,這裡快取的是載入到記憶體中的紋理資源,也就是圖片資源。其原理是對加入快取的紋理資源進行一次引用,使其引用計數加一,保持不被清除,而Cocos2d-x的渲染機制是可以重複使用同一份紋理在不同的場合進行繪製,從而達到重複使用,降低記憶體和GPU運算資源的開銷的目的。常用的是如下所示的3個介面:

    /** Retruns ths shared instance of the cache */
    static CCTextureCache * sharedTextureCache();

    /** Returns a Texture2D object given an file image
    * If the file image was not previously loaded, it will create a new CCTexture2D
    *  object and it will return it. It will use the filename as a key.
    * Otherwise it will return a reference of a previosly loaded image.
    * Supported image extensions: .png, .bmp, .tiff, .jpeg, .pvr, .gif
    */
    CCTexture2D* addImage(const char* fileimage);

    /** Removes unused textures
    * Textures that have a retain count of 1 will be deleted
    * It is convinient to call this method after when starting a new Scene
    * @since v0.8
    */
    void removeUnusedTextures();

在這3個介面中,CCTextureCache遮蔽了載入紋理的許多細節;addImage函式會返回一個紋理CCTexture2D的引用,可能是新載入到記憶體的,也可能是之前已經存在的;而removeUnusedTextures則會釋放當前所有引用計數為1的紋理,即目前沒有被使用的紋理。後面會看到,引用計數的記憶體管理方式為快取的設計帶來了很大的便利。

實際上,我們很少需要呼叫addImage這個介面,因為引擎內部所有的紋理載入都是通過這個快取進行的,換句話說,載入的每一張圖片都被快取了,所以我們更需要關心什麼時候清理快取。引擎會在裝置出現記憶體警告時自動清理快取,但是這顯然在很多情況下已經為時過晚了。一般情況下,我們應該在切換場景時清理快取中的無用紋理,因為不同場景間使用的紋理是不同的。如果確實存在著共享的紋理,將其加入一個標記陣列來保持其引用計數,以避免被清理了。



相關文章