cocos2dx 紋理快取

2022-08-27 02:33:08 字數 2422 閱讀 7073

在遊戲中需要載入大量的紋理,這些操作都是很耗記憶體和資源的。

當遊戲中有個介面用到的非常多,第一次點進這介面時速度非常慢(因為要載入繪製很多)出現卡頓,我們可以使用texturecache提前非同步載入紋理,等載入結束,進入到這個介面再使用這些速度就會非常快。

texture2d: 紋理,即加載入記憶體後供cpu和gpu操作的貼圖物件。

texturecache(紋理快取),用於載入和管理紋理。一旦紋理載入完成,下次使用時可使用它返回之前載入的紋理,從而減少對gpu和cpu記憶體的占用。

當你建立乙個精靈,你一般會使用sprite::create(pszfilename)。假如你去看sprite::create(pszfilename)的實現方式,你將看到它將這個增加到紋理快取中去了,

sprite* sprite::create(const std::string& filename)

_safe_delete(sprite);

return nullptr;

}bool sprite::initwithfile(const std::string& filename)

// don't release here.

// when load texture failed, it's better to get a "transparent" sprite then a crashed program

// this->release();

return false;

}

上面**顯示在控制載入紋理。一旦這個紋理被載入了,在下一時刻就會返回之前載入的紋理引用,並且減少載入的時候瞬間增加的記憶體。(詳細api請看texturecache api)

在3.0版本中,texturecache不再作為單例模式使用。作為director的成員變數,通過以下方式獲取

director::getinstance()->gettexturecache();
如果檔名以前沒有被載入時,它會建立乙個新的texture2d 物件,它會返回它。它將使用檔名作為key否則,它會返回乙個引用先前載入的影象。 texturecache遮蔽了載入紋理的許多細節; addimage函式會返回乙個紋理texture2d的引用,可能是新載入到記憶體的,也可能是之前已經存在的;

texture2d *texture = director::getinstance()->gettexturecache()->addimage(filename);
也可以通過gettextureforkey方法來獲得這個key所對應的紋理快取,如果這個key對應的紋理不存在,那麼就返回null

texture2d *texture = director::getinstance()->gettexturecache()->gettextureforkey(texturekeyname);
texturecache類還支援非同步載入資源的功能,利用addimageasync方法。你可以很方面地給addimageasync方法新增乙個**方法,這樣,當紋理非同步載入結束的時候,可以得到通知。

你可以選擇非同步載入方式,這樣你就可以為loading場景增加乙個進度條。關鍵**如下:

texturecachetest::texturecachetest()

: _numberofsprites(20)

, _numberofloadedsprites(0)

void texturecachetest::loadingcallback(cocos2d::texture2d *texture)

}

removeunusedtextures則會釋放當前所有引用計數為1的紋理,即目前沒有被使用的紋理。比如新場景建立好後,使用此方法釋放沒有使用的紋理非常方便。

director::getinstance()->gettexturecache()->removeunusedtextures();
當沒有其它物件(比如sprite)持有紋理的引用的時候,紋理仍然會存在記憶體之間。基於這一點,我們可以立馬從快取中移除出去,這樣,當紋理不存需要的時候,馬上就會從記憶體中釋放掉。如下**所示:

director::getinstance()->gettexturecache()->removetextureforkey("images/grossinis_sister2.png");
當收到"memory warning"時,可以呼叫removealltextures()方法。在短期內: 它還將釋放一些資源,防止您的應用程式被殺害; 中期: 它將分配更多的資源;從長遠來看:它會是相同的。

director::getinstance()->gettexturecache()->removealltextures();
****:

cocos2dx 紋理快取

快取 cache 機制的原理是什麼?把新加進記憶體的資源做乙個hashmap儲存,每乙個資源加乙個key。每次載入資源,先從快取中尋找,如果找到就直接返回,否則載入到記憶體後再返回。一 自動快取紋理 直接使用display.newsprite filename 建立精靈,引擎內部會自動把紋理載入到快...

cocos2dx 紋理快取的理解

在cocos2dx中顯示一張,需要首先把它從檔案讀取到記憶體,再根據檔案格式進行解碼,轉換為gpu可以識別的格式,這塊可以被gpu識別的 記憶體中的影象資料,被稱為紋理。為了節省記憶體空間,減少大量瑣碎的小檔案的讀取引發的多次i o操作,將多個紋理拼成為乙個大的紋理圖,成為紋理圖集。就像是給別人看你...

cocos2d x 紋理畫素格式

紋理的畫素格式是影象儲存在gpu記憶體的方式。你可能會見到以下畫素格式 紅色通道 綠色通道 藍色通道和alpha 通道各8位。如果想獲得最好的質量,使用這種格式是很靠譜的。但它會占用的記憶體會比16位的紋理多一倍,在iphone上記憶體是很寶貴的資源,這個 自然的,它的運算速度也是相對較慢的。常用的...