私はちょっと夢中になっています。紹介シーンをランチする場所から 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 に相当します。表示された値でより良いスクリーンショットを撮ることができませんでした - 申し訳ありません):
メモリ割り当てを減らし、増加させなかったと思いました。どうしてこれなの?
第二に、なぜメモリ割り当てがいくらかの数 (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)
テクスチャ シートのすべてのフレームが一時的にメモリに読み込まれているようです。これは正常ですか?これを回避する方法はありますか?(これにより、複数のシートでシーンをロードするときにメモリ リークが発生する可能性があります)