2012/12/28

cocos2dでメモリ使用量をリアルタイムに表示する

長い事ブログをさぼっていたが、そろそろ再会せねば!と言う事で久しぶりに投稿です。
今回はcocos2dでメモリ使用量を表示しようと思い、googleで検索をした所、以下のブログ記事を発見しました。

cocos2dで残りメモリ表示 « なんかもう実験的

でも今回は残りメモリというよりは、現在使用中のメモリ量を表示したかったので、上記記事の内容を使い回してコードを追加してみました。

結果は以下の通り






以下のコードを順に追加します。
cocos2dのバージョンは2.1を使用しています。


CCDirector.h


@endの手前にでも追加します
+(double) getMemoryActiveBytes;
+(double) getMemoryActiveKiloBytes;
+(double) getMemoryActiveMegaBytes;

CCDirector.m


#importの最後の部分にでも追加します
#include <sys/sysctl.h>
#import <mach/mach.h>
#import <mach/mach_host.h>

@endの手前にでも追加します
+(double) getMemoryActiveBytes
{
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
    if( kerr != KERN_SUCCESS ) {
        return NSNotFound;
    }
 
    return info.resident_size;
}

+(double) getMemoryActiveKiloBytes
{
    return [CCDirector getMemoryActiveBytes] / 1024.0;
}

+(double) getMemoryActiveMegaBytes
{
    return [CCDirector getMemoryActiveKiloBytes] / 1024.0;
}

既存のshowStatsメソッド内にコードを追加します
-(void) showStats
{
    frames_++;
    accumDt_ += dt;

    if( displayStats_ ) {
        // Ms per Frame

        if( accumDt_ > CC_DIRECTOR_STATS_INTERVAL)
        {
            NSString *spfstr = [[NSString alloc] initWithFormat:@"%.3f", secondsPerFrame_];
            [SPFLabel_ setString:spfstr];
            [spfstr release];

            frameRate_ = frames_/accumDt_;
            frames_ = 0;
            accumDt_ = 0;

//            sprintf(format,"%.1f",frameRate);
//            [FPSLabel setCString:format];

            // 以下をコメントアウト
            //NSString *fpsstr = [[NSString alloc] initWithFormat:@"%.1f", frameRate_];
            // 以下を追加
            NSString *fpsstr = [[NSString alloc] initWithFormat:@"%.1f  %.1f  %.1f", frameRate_, [CCDirector getAvailableMegaBytes], [CCDirector getMemoryActiveMegaBytes]];
            [FPSLabel_ setString:fpsstr];
            [fpsstr release];
            
            NSString *draws = [[NSString alloc] initWithFormat:@"%4lu", (unsigned long)__ccNumberOfDraws];
            [drawsLabel_ setString:draws];
            [draws release];
        }

        [drawsLabel_ visit];
        [FPSLabel_ visit];
        [SPFLabel_ visit];
    }
    
    __ccNumberOfDraws = 0;
}
以上でメモリ使用量が表示されたと思います。

cocos2dのバージョンが1.*の場合はshowFPSの内容を変更してください。
上記のコードでは残りメモリも表示するようにしていますので、詳細は上の方で紹介しましたブログ先を参照してください。

参考URL
cocos2dで残りメモリ表示 « なんかもう実験的

1 件のコメント:

  1. すばらしいコードの公開ありがとうございます!

    ただ、CCDirectorのソースに手を入れるのはメンテナンス性が落ちると思ったので、shinichiさんのソースを参考(ほとんどコピペ)して、CCDirectorのカテゴリとして実装したコードを書いて、githubにて公開してみました↓
    http://labs.torques.jp/2013/01/28/3114/
    特にライセンスとか記述していませんが、問題ありましたら連絡ください。

    返信削除