0

cocos2dプロジェクトのメモリ管理に問題があります。私のアプリでは、インタラクションを開始する前にすべてのアニメーションを作成する必要があります。私は3つのアニメーションを持っています。それぞれに、解像度が1300 x 1000 px、サイズが200koの20個のpngファイルがあります。

だから私の初期化で私はちょうど書いた:

self.animation = [CCAnimation animation];
[_animation setDelayPerUnit:0.04];
for(int i = 1; i <= 20; i++)
{
   [_animation addSpriteFrameWithFilename:[NSString stringWithFormat:@"image(%d)@2x.png",i]];
}
[[CCAnimationCache sharedAnimationCache] addAnimation:_animation name:@"animationWin"];

この種のコードは3回実行されます。アプリを実行すると、直接クラッシュします。2つのアニメーションをプリロードしただけでは、クラッシュは発生しません。forループ内にブレークポイントを設定すると、forループ内でクラッシュすることがわかります。

この問題を解決する方法がわかりません...アイデアはありますか?

あなたの助けをどうもありがとう!

4

3 に答える 3

2

以下はあなたのためにものを一掃します。

NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : before purging all caches");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCDirector sharedDirector] purgeCachedData];
NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : after purging all caches");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

メモリの量を決定するのはテクスチャサイズであるため、PVR形式への変更は役に立ちません(PVRは、実行時に必要なRAMではなく、「ディスク」サイズとロード時間でのみメリットがあります)。各ピクセルの深さは次のようになります。

+(void) mediumPixelFormat{
    [CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444];
}

フォーマットはいつでも変更できます。また、POTでは非常に無駄な1300x1000に気づきました。これは実際には2048x2048のテクスチャと同じくらいのスペースを取ります。グラフィックアーティストと協力して、それを1024x1024に削ったり、3つのテクスチャを2つに組み合わせたりする方法はありますか?

于 2012-07-12T17:32:08.500 に答える
2

それぞれに、解像度が1300 x 1000 px、サイズが200koの20個のpngファイルがあります。

数学をやってみましょう。

PNGファイルが32ビットであり、NPOT(2の累乗以外)のサポートが有効になっていないという仮定の下で、各テクスチャは以下を消費します。

1300x1000=>2の累乗に拡張=>2048x1024=>ピクセル数=>2,097,152=>ピクセルあたり32ビット(4バイト)の色深度=>8メガバイト=>20テクスチャの倍=>tadaaa…なんと160MBテクスチャのメモリ使用量。

さてあなたの問題があります!

PNGのファイルサイズは関係ありません。圧縮形式です。ただし、実際に十分に圧縮されているPVRに切り替えない限り、テクスチャは圧縮されていませんが、アーティファクトや変色も発生します。

間違いなく最善の解決策は、ロードしようとしているアートワークのサイズや量を調整することです。

于 2012-07-12T19:56:56.203 に答える
0

さて、あなたはあまりにも多くのメモリを使用していると思います。PVRTCのような別のテクスチャフォーマットであるスプライトシート/バッチノードを使用して、さまざまなピクセルフォーマットを試してみてください。

上記のすべてを支援するために、TexturePackerをお勧めします

于 2012-07-12T13:26:24.433 に答える