0

私は本当に頭を悩ませている問題を抱えています。

つまり、基本的に MainMenuScene があり、これがテスト レイヤーを作成します。このレイヤーは非常に単純で、スコア ラベルとメニューに追加されるボタンを作成するだけです。このボタンを押すと、MainMenuScene が空白のシーンに置き換えられ、MainMenuScene が再び読み込まれます。

ここまでは順調ですね。ただし、問題は、シーンがリロードされるたびにインストゥルメントでヒープショットを取得すると、ヒープが約 20kb 増加することです。拡張ビューを深く掘り下げると、testLayer のスプライトとフォントが解放されていないように見えますが、レイヤーの dealloc メソッドが呼び出されています。

また、コアの Cocos ファイル以外のファイルに ARC サポートを追加します。これは何らかの形で関連している可能性がありますか?

テストレイヤーは次のとおりです。

@implementation TestLayer

-(id)init
{
    self = [super initWithColor:ccc4(2,2,2,210)];
    if (self != nil)
    {
        // ask director the the window size
    CGSize s = [[CCDirector sharedDirector] winSize];

        self.isTouchEnabled = YES;

        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        formatter.numberStyle = NSNumberFormatterDecimalStyle;

        NSNumber * n = [NSNumber numberWithInt:[SDCloudUserDefaults integerForKey:@"highscore"]];

        NSString *string = [formatter stringFromNumber:n];

        //score
        CCLabelBMFont * scoreLabel = [CCLabelBMFont labelWithString:string fntFile:@"scoreFont.fnt" width:s.width alignment:kCCTextAlignmentCenter];
        scoreLabel.position =  ccp( POS_X(443), POS_Y(877) );
        [self addChild:scoreLabel z:90];

        //PLAY BUTTON
       CCMenuItemSprite *playButton = [CCMenuItemSprite itemFromNormalSprite:[CCSprite spriteWithFile:@"play_up.png"]
                                                               selectedSprite:[CCSprite spriteWithFile:@"play_down.png"]
                                                                       target:self
                                                                     selector:@selector(Transition:)];

        playButton.position = ccp( POS_X(380) , POS_Y(177));

        menu = [CCMenu menuWithItems: playButton, nil];
        menu.position = ccp(0, 0);
        [self addChild: menu];

       }
    return self;
}

-(void) Transition:(ccTime) dt
{
    [self unschedule:@selector(Transition:)];
    [[SceneManager sharedSceneManager]RunSceneWithID:SCENE_LOADING:eCCTransitionCrossFade:1.0f];

}

- (void) dealloc
{
    NSLog(@"%s",__FUNCTION__);
}
@end

これの何が悪いのか本当にわかりません。

ありがとう

4

1 に答える 1

0

そうです、[super dealloc] などへのすべての正しい呼び出しを使用して、ARC されていないプロジェクトで同じテストを行ったところ、まったく同じ動作が得られました。

しかし、詳しく調べてみても、リークがあるのか​​、それとも結果を正しく解釈していないのかはまだわかりません.

そのため、プログラムを初期状態にして、ヒープショットを撮ります。次に、シーンを置き換えてリロードする ui ボタンを押します。初期状態に戻って別のヒープショットを取得すると、ヒープが約 20kb ほど増加していることに気付きました。もう一度 ui ボタンを押すと、前のヒープショットが 0 バイトに戻ります。これを数回行った後、以前のヒープショットは常にゼロバイトに戻ります。

cocos2d では、シーンを置き換えるたびに、そのシーンに関連付けられているすべての割り当てが解除され、戻ってきたときにすべてが再度割り当てられるためです。そのため、その成長はそのレイヤーを子として持つシーンのサイズであるため、ヒープの成長は常にあると思います。これは理にかなっていますか?

また、これを行うたびに、統計の #Living 列が増加していないことに気付きました。これは良い兆候ですよね?

于 2013-02-13T15:57:25.213 に答える