基本に立ち返るために、cocos2d-xによるiPhone/Androidアプリプログラミングガイドを読み直しています。
今回は、この本のChapter5に記載のある非同期処理を実際に試してみました。
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]が利用ができません。 これが利用できればもっと早くなるのではないかと考えています。