読者です 読者をやめる 読者になる 読者になる

フニゲの開発日記

Electronとか...

テクスチャの非同期読み込み

cocos2d-html5


テクスチャが少なければ起動時にすべて読み込むのが無難だが、量が増えてくるとそうもいかない。ステージのはじめに必要なテクスチャをロードして、次のステージに行く前にメモリを解放する手続きが必要になる。

cc.TextureCacheは、dumpCachedTexture()でロードされているテクスチャの一覧をデバッグ出力する。

var textureCache = cc.TextureCache.getInstance();
textureCache.dumpCachedTextureInfo();

これを使えば、正しく読み込み・解放が行われているか確認できる。


以下のサンプルでは各ステージのテクスチャの名前を
res/stage0.png, res/stage1.png, ...
とした。テクスチャアトラスのデータは
res/stage0.plist, res/stage1.plist, ...
でいいかな。
plistの方は小さいので、resource.jsに書いて先読みすることにする。

// title.js
    ...

    // ステージnoが選択されたとき
    stageSelected:function (no) {
        var stage = "res/stage" + no;

        if (Title.currentStage != null) {
            // テクスチャアトラスを使っているときは、テクスチャを削除する前に
            //  対応するSpriteFrameを削除しておいたほうがいいと思う
            var spriteFrameCache = cc.SpriteFrameCache.getInstance();
            spriteFrameCache.removeSpriteFramesFromFile(stage + ".plist");

            // テクスチャを削除 
            var textureCache = cc.TextureCache.getInstance();
            textureCache.removeTextureForKey(Title.currentStage + ".png");
        }
        Title.currentStage = stage;

        // 新しいテクスチャをロード
        var textureCache = cc.TextureCache.getInstance();
        textureCache.addImageAsync(stage + ".png", this, this.loadFinished);
    },

    // テクスチャの読み込みが終わったとき
    loadFinished:function () {
        var stage = Title.currentStage;
        var spriteFrameCache = cc.SpriteFrameCache.getInstance();
        spriteFrameCache.addSpriteFrames(stage + ".plist", stage + ".png");

        // ちゃんと読み込み・解放できたか確認しておこう
        var textureCache = cc.TextureCache.getInstance();
        textureCache.dumpCachedTextureInfo();

        // ステージ開始
        cc.Director.getInstance().replaceScene(Game.scene());
    },
    ...
});

Title.currentStage = null;

動かなかったので修正した。これで間違ってないかな。

広告を非表示にする