Cocos 2 dxプロジェクト--アクション系ゲームメモリ最適化--Spine構造分析1

12153 ワード

原文住所:http://www.cnblogs.com/freeze86/p/4245060.html
SPineデータ組織
spAtlas:これは.atlasファイルで解けた構造で、テクスチャが含まれています.
struct spAtlas {
    spAtlasPage* pages;
    spAtlasRegion* regions;
    void* rendererObject;
    int ref;
};

まず気にしないで、そのデータ組織を見て、spAtlasPage、spAtlasRegion、rendererObjectは何ですか?下を見る
struct spAtlasPage {
    const spAtlas* atlas;
    const char* name;
    spAtlasFormat format;
    spAtlasFilter minFilter, magFilter;
    spAtlasWrap uWrap, vWrap;
    void* rendererObject;
    int width, height;
    spAtlasPage* next;
};


spAtalsPageはそのメンバーを見て、とても簡単に見ることができて、わあ、これはテクスチャで、あなたに真実を見せて、はは
void _spAtlasPage_createTexture (spAtlasPage* self, const char* path) {
    CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage(path);
    texture->retain();
    self->rendererObject = texture;
    self->width = texture->getPixelsWide();
    self->height = texture->getPixelsHigh();
}


見ましたか、真実はここにあります.中にはテクスチャの幅があって、高いです.奇抜なのは彼がまだ(spAtlasPage*next)を持っていることです.これはチェーンテーブルの構造ですね.もしあなたのアクションファイルが複数のテクスチャを使っていたら、このポインタは役に立ちます.その他はしばらく無視して、上(_spAtlasPage_createTexture)を見てみますと、ありません.ここでテクスチャを持っています.だからテクスチャは解放されませんよ.
 
struct spAtlasRegion {
    const char* name;
    int x, y, width, height;
    float u, v, u2, v2;
    int offsetX, offsetY;
    int originalWidth, originalHeight;
    int index;
    int/*bool*/rotate;
    int/*bool*/flip;
    int* splits;
    int* pads;
    spAtlasPage* page;
    spAtlasRegion* next;
};


この商品を見ると、テクスチャに含まれる要素、1つ、1つの説明情報です.
Cocos2dx项目--动作类游戏内存优化--Spine结构分析1_第1张图片
このテクスチャが見えますか?各ブロックは1つ(spAtlasRegion)に対応するはずです.
これです.atlasファイルに含まれる情報ですね!このように画像がどのように分割され、どのくらいの部分に分かれているのか.各部分の座標は何ですか.
あのrenderobjectは何ですか.私もよくわかりませんが、見続けます.
spAtlas* spAtlas_create (const char* begin, int length, const char* dir, void* rendererObject) {
    spAtlas* self;

    int count;
    const char* end = begin + length;
    int dirLength = strlen(dir);
    int needsSlash = dirLength > 0 && dir[dirLength - 1] != '/' && dir[dirLength - 1] != '\\';

    spAtlasPage *page = 0;
    spAtlasPage *lastPage = 0;
    spAtlasRegion *lastRegion = 0;
    Str str;
    Str tuple[4];

    self = NEW(spAtlas);
    self->rendererObject = rendererObject;
        ................  


見ましたか?ハイライトは最後の一言です.このオブジェクトを作成するには、void*rendererObjectを渡す必要があります.そして、これは自分にspAtlas*selfを与えます.
    .......     self = NEW(spAtlas);     self->rendererObject = rendererObject;
そして外で私の呼び出しは
atlas = spAtlas_createFromFile(atlasFile, 0);私は意外にも1つの0を伝えて、ははは、役に立たないで、しばらくここに着きます.
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
.JSONファイルには、上記のspAtlasRegionのツリー構造の組織情報、すなわちスケルトン情報、および各動作情報、各動作中の各キーフレーム中の各Regionのデータが格納されています.ははは.
 
まず、作成されたコードを見てみましょう.
SkeletonRenderer::SkeletonRenderer (const char* skeletonDataFile, const char* atlasFile, float scale) {
    initialize();

    if(1)
    {
        CTimeMgr::GetInst()->time_begin("spAtlas_createFromFile");
        atlas = spAtlas_createFromFile(atlasFile, 0);
        CCAssert(atlas, "Error reading atlas file.");
        CTimeMgr::GetInst()->time_end();

        CTimeMgr::GetInst()->time_begin("spSkeletonJson_create");
        spSkeletonJson* json = spSkeletonJson_create(atlas);
        CTimeMgr::GetInst()->time_end();

        json->scale = scale;
        CTimeMgr::GetInst()->time_begin("spSkeletonJson_readSkeletonDataFile");
        spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
        CTimeMgr::GetInst()->time_end();
        CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data file.");
        spSkeletonJson_dispose(json);
        setSkeletonData(skeletonData, true);
    }
    else
    {
        atlas = spAtlas_createFromFile(atlasFile, 0);
        CCAssert(atlas, "Error reading atlas file.");
        spSkeletonJson* json = spSkeletonJson_create(atlas);
        json->scale = scale;
        spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);
        CCAssert(skeletonData, json->error ? json->error : "Error reading skeleton data file.");
        spSkeletonJson_dispose(json);
        setSkeletonData(skeletonData, true);
    }
    
}


if(1)の内容は、私が変更したもので、elseの内容は元のものです.私が変更した目的は,1回のロードで複数回使用するためであり,もちろん他の場所で応答する参照カウントのあるプロファイルである.やはり正直にelseの内容を見てみましょう.      
      atlas = spAtlas_createFromFile(atlasFile, 0); これは言うまでもありませんが、とりあえずテクスチャ図集を作成しましょうspSkeletonJson*json=spSkeletonJson_create(atlas); テクスチャ図集に基づいて、JSONオブジェクトを作成します.それは漏斗のように、テクスチャ解析JSONファイルが用意したもので、使い終わったら分析します.       json->scale = scale;        spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile);スケルトンファイルの解析dispose(json); 漏斗分析了吧setSkeletonData(skeletonData,true);(以上のコードはSkeletonRendererクラスのコンストラクション関数にありますので、よく見えますか、解析したspSkeletonDataはSkeletonRendererが持っているでしょう)
 
spSkeletonData* spSkeletonJson_readSkeletonDataFile (spSkeletonJson* self, const char* path) {
    int length;
    spSkeletonData* skeletonData;
    const char* json = _spUtil_readFile(path, &length);
    if (!json) {
        _spSkeletonJson_setError(self, 0, "Unable to read skeleton file: ", path);
        return 0;
    }
    skeletonData = spSkeletonJson_readSkeletonData(self, json);
    FREE(json);
    return skeletonData;
}


ここで何してるの?ハイライトはこのskeletonData=spSkeletonJsonreadSkeletonData(self, json); どうせこの中にJSONファイルが解析されていることを知っていればいいのに!
いいですよ.JSONファイルがスケルトン組織とアニメーションモーションを含むデータであることを知ればよい.ATLASファイルこそテクスチャ関連でOKです.私たちがしなければならないのは、テクスチャを持たず、使いたいときにロードし、使いたくないときは、テクスチャをすべて取り外すことです.
テクスチャのロードに40 msが必要な場合、テクスチャはメモリ512*512*4=1 Mを占有し、このターゲットに従って変更するとします.実は40 msで1 Mメモリを交換しました.
速度とメモリのバランスが必要です.ははは、私たちは次から微細創傷手術を始めます.