2012-02-13 15 views
0

cocos2d-iphoneでグラフィックを使用するノードを完全に消去する方法がわかりません。タイルマップまたはスプライトからテクスチャを正しく廃棄する

どういう意味ですか?まあ、例えば、私はCCTMXTiledMapを持っています。いくつかのテクスチャを使用しています。さて、私はもはやこのタイルマップを使用する必要はないので、私はそれを殺す、と私はそのようなテクスチャも殺したと仮定し、メモリは解放されます。

私は[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];を使用して現在メモリに保持されているテクスチャに関する情報を取得しています。

CCTMXTiledMap *map = [CCTMXTiledMap tiledMapWithTMXFile:@"myMap.tmx"]; 
    [self addChild:map z:0]; 
    [[CCTextureCache sharedTextureCache] 
          dumpCachedTextureInfo]; // I get 32MB usage. 
    [self removeChild:map cleanup:YES]; // I assume this will "kill" the map. 
    [[CCTextureCache sharedTextureCache] 
          dumpCachedTextureInfo]; // I STILL get 32MB usage 

ご覧のとおり、子からマップを削除しても、実際に使用されているテクスチャは消去されていないようです。

メモリを解放するにはどうすればいいですか?私はCCSpritesなどと同じことが起こると思う。CCTextureCacheにAcoording、私はちょうど私のアプリケーションがクラッシュするまで、スタックメモリを保持します。

注:[[CCTextureCache sharedTextureCache] removeAllTextures];のようなものを使用してすべてをクリーンアップすることができます。しかし、それは非常に効率的ではないようです。

答えて

1

CCTextureCacheは、NOの参照が存在するテクスチャのみを削除します。私は自分でCTMXTileMapクラスを使用していませんが、多分そこにテクスチャを参照するオブジェクトがあります。 CCSpriteBatchNodeでも同じことが起こります。 spriteFrames、次にremoveUnusedTexturesをキャッシュから削除する必要があります。その時点でメモリが再利用されます。マップを子として削除した後、removeUnusedTexturesを使用することを提案してください。

CTMXTileMapで明示的なクリーンアップが表示されない場合は、deallocに依存して、テクスチャを参照できるオブジェクトを削除しています。おそらく(これについてはっきりしないかもしれません)、測定をやり直す前に、自動リリースプールに最終的に地図を公開するチャンスを与えてください。

+0

CCSpriteはどうですか?どのようにあなたのCCSpritesを処分しますか? – Voldemort

+0

hmmm ...私はそれに答える前にココのコードを読んでいます:)私は、その親からスプライトを削除すると、キャッシュの保持カウントが下がり、removeUnusedTexturesがそれを吐いてフラッシュしますメモリを再利用するためのテクスチャ。 100%確実ではありません。 – YvesLeBorg

+0

@Omega:小さい慈悲のために神に感謝、仮定は正しいです。 removeUnusedTexturesはプレーンなバニラスプライト(親がnil)を削除します。クイックテストを実行することでこれを確認しました。 – YvesLeBorg

関連する問題