【cocos2dx】画像(テクスチャアトラス)を非同期処理で読み込む

基本に立ち返るために、cocos2d-xによるiPhone/Androidアプリプログラミングガイドを読み直しています。

今回は、この本のChapter5に記載のある非同期処理を実際に試してみました。

cocos2d-xによるiPhone/Androidアプリプログラミングガイドcocos2d-xによるiPhone/Androidアプリプログラミングガイド
清水 友晶

マイナビ
売り上げランキング : 30109

Amazonで詳しく見る

画像の非同期読み込み

画像が大きい、また表示する画像が多くなるとどうしても処理が重くなります。 その際に、画像だけを非同期で読み込める方法が記載されています。

CCTextureCacheクラスのaddImageAsync()を利用する

普段テクスチャアトラスでスプライトを表示しているので、テクスチャアトラスを非同期で読み込みます。

このような感じで利用できます。 [c]

CCTextureCache *cashe = CCTextureCache::sharedTextureCache(); cashe->addImageAsync("sprites.png", this, callfuncO_selector(HelloWorld::callBackPart));

void HelloWorld::callBackPart(CCObject *obj){

CCSpriteFrameCache *cashe = CCSpriteFrameCache::sharedSpriteFrameCache();
cashe->addSpriteFramesWithFile("sprites.plist", (CCTexture2D*)obj);

}

[/c]

効果

効果は以下のようになりました。

非同期利用

init()終了 時間 0.000027 読み込み + 表示終了 時間 0.404182

通常通り

init() + 読み込み + 表示終了 時間 0.114159

結果

結果を見ると、全体の時間は非同期の方が重いですが、init()の処理は非同期の方が早いです。 テクスチャアトラスを複数使ったり、表示する画像を多くすればまた違ってくるとは思います。

また、実験段階ではテクスチャアトラスを[png]で出力して利用していますが、通常は[pvr.ccz]を利用しています。 この非同期の方法では、addImageAsync()で[pvr.ccz]が利用ができません。 これが利用できればもっと早くなるのではないかと考えています。