1

私はちょっと夢中になっています。紹介シーンをランチする場所から AppDelegate を取得しました。TexturePacker を使用して、 RGBA4444 ピクセル形式を使用して plist と png ファイルを取得し、最適化されたファイルを保持するために「PNG ファイルを圧縮する」オプションをXCode で「いいえ」に設定しました。

私の AppDelegate は、デフォルトのピクセル形式 kEAGLColorFormatRGB565 で構成されています。

 CCGLView *glView = [CCGLView viewWithFrame:[window_ bounds]
                               pixelFormat:kEAGLColorFormatRGB565   //kEAGLColorFormatRGBA8
                               depthFormat:0    //GL_DEPTH_COMPONENT24_OES
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

シナリオ 1: AppDelegate を実行し、デフォルトのピクセル形式を変更せずに(つまり、デフォルトの AppDelegate 設定をそのままにして) イントロダクション シーンをプッシュすると、次の割り当て分析が得られます。青いピークは、plist ファイルから最初の CCSprite フレームを作成するときの IntroductionScene での16 MB のメモリ割り当てに対応します (青いピークは 16 MB に対応します。表示された値でこれ以上のスクリーンショットを撮ることはできませんでした。残りは約2MB のメモリが割り当てられています - 申し訳ありません)。

最初のケース

シナリオ 2: IntroBackgroundScene でデフォルトのピクセル形式をkCCTexture2DPixelFormat_RGBA4444に設定しました (以下を参照)。

@implementation IntroBackgroundScene

-(id) init
{
    if ((self = [super init]))
    {
        [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];

        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Intro background.plist"];
        background = [CCSprite spriteWithSpriteFrameName:@"Intro background 0.png"];
        background.anchorPoint = CGPointMake(0.5f, 0.5f);
        background.position = CGPointMake(160.0f, 0.0f);
        [self addChild:background];

        foreground = [CCSprite spriteWithSpriteFrameName:@"Intro background 1.png"];
        foreground.anchorPoint = CGPointMake(0.5f, 0.5f);
        foreground.position = CGPointMake(160.0f, 0.0f);
        [self addChild:foreground z:2];

これにより、 26 MB のメモリ使用量のピークが得られます(ピクセル形式の設定がkCCTexture2DPixelFormat_RGBA4444に設定されている場合でも)。以下を参照してください (青いピークは 26 MB に相当します。表示された値でより良いスクリーンショットを撮ることができませんでした - 申し訳ありません):

2 番目のケース

メモリ割り当てを減らし、増加させなかったと思いました。どうしてこれなの?

第二に、なぜメモリ割り当てがいくらかの数 (16/26MB) までピークに達し、その後 2MB に下がるのはなぜですか? 最適化されたテクスチャ シートを使用しているため、常に 2MB になると予想していました。

TexturePacker のビルド設定は次のとおりです。

テクスチャパッカー

私は Cocos2d 用にビルドしており、RGBA4444 を有効にした 2048*2048 ピクセルのシートを使用しています。1 ピクセルあたり 2 バイトしか消費しないため、合計で約 8 MB になります。IntroBackground の init メソッドで memort の割り当てが最大で 16 MB に達し、その後なぜ 2MB (8 MB ではなく) しか減らないのかがわかりません。

これを分析して理解する方法についての洞察は大歓迎です。

編集: iPod touch 第 4 世代のテクスチャ ダム情報:

cocos2d: "Intro background.png" rc=7 id=3 2048 x 2048 @ 32 bpp => 16384 KB cocos2d: CCTextureCache dumpDebugInfo: 2 テクスチャ、16448 KB (16.06 MB)

テクスチャ シートのすべてのフレームが一時的にメモリに読み込まれているようです。これは正常ですか?これを回避する方法はありますか?(これにより、複数のシートでシーンをロードするときにメモリ リークが発生する可能性があります)

4

1 に答える 1

1

私の推測では、(ピークを説明するために) アプリには 1) 圧縮されたデータ ストリームをコアにロードするため、2) コアで解凍するため、圧縮されたものと解凍されたもの、およびプロセスで使用される補助オブジェクトの両方が保持されます。次に、メモリ ブロックが GPU に渡されると、メモリが解放されます (そして、テクスチャのメモリ要件はメイン プロセスから割り引かれます) ... トレースがデバイスで取得されたと仮定します。シミュレーターはホストの GPU を使用しないため、シミュレーターで同じトレースを取得すると、テクスチャのメモリ要件を含む、はるかに高いメモリ フット プリントが表示されます。

于 2013-04-01T13:01:00.523 に答える