Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cocos2D/iOS7: continuously increasing memory usage for boilerplate code

This is what it looks like with iOS7 simulator when application is just running without any user interaction(also I'm not running any code of mine, only boilerplate Cocos2D):

enter image description here

No such issue with 5.0->6.1. The code producing this problem is Cocos2D boilerplate code which I tried to minimize with commenting and this is the minimum code from App delegate:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Create the main window
    window_ = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


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

    director_ = (CCDirectorIOS*) [CCDirector sharedDirector];

    director_.wantsFullScreenLayout = YES;

    // Display FSP and SPF
    [director_ setDisplayStats:YES];

    // set FPS at 60
    [director_ setAnimationInterval:1.0/60];

    // attach the openglView to the director
    [director_ setView:glView];

    [glView setMultipleTouchEnabled:YES];

    // 2D projection
    [director_ setProjection:kCCDirectorProjection2D];
    //  [director setProjection:kCCDirectorProjection3D];

    // Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
    if( ! [director_ enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");

    // Default texture format for PNG/BMP/TIFF/JPEG/GIF images
    // It can be RGBA8888, RGBA4444, RGB5_A1, RGB565
    // You can change this setting at any time.
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

    // If the 1st suffix is not found and if fallback is enabled then fallback suffixes are going to searched. If none is found, it will try with the name without suffix.
    // On iPad HD  : "-ipadhd", "-ipad",  "-hd"
    // On iPad     : "-ipad", "-hd"
    // On iPhone HD: "-hd"
    CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils];
    [sharedFileUtils setEnableFallbackSuffixes:NO];             // Default: NO. No fallback suffixes are going to be used
    [sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"];      // Default on iPhone RetinaDisplay is "-hd"
    [sharedFileUtils setiPadSuffix:@"-ipad"];                   // Default on iPad is "ipad"
    [sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];    // Default on iPad RetinaDisplay is "-ipadhd"

    // Assume that PVR images have premultiplied alpha
    [CCTexture2D PVRImagesHavePremultipliedAlpha:YES];

    // Create a Navigation Controller with the Director
    navController_ = [[MyNavigationController alloc] initWithRootViewController:director_];
    navController_.navigationBarHidden = YES;

    // for rotation and other messages
    [director_ setDelegate:navController_];

    // set the Navigation Controller as the root view controller
    [window_ setRootViewController:navController_];

    // make main window visible
    [window_ makeKeyAndVisible];

    return YES;
}

I also commented out CCDirector from directorDidReshapeProjection startup to eliminate my own code. So when application launches now I only see frame rate on black screen.

The same result I see from Instruments.

Unfortunately can't test iOS 7 on device, but I don't expect simulator to act like that.

Update:

I made 2 Mark Generations with the following result.

enter image description here

All items are those 64 byte allocations. I have no clue what type they are. Worth to mention that I'm using latest stable Cocos2D 2.1.

Update #2:

Call stack of 64 byte allocation.

enter image description here

like image 415
Pablo Avatar asked Oct 01 '13 08:10

Pablo


1 Answers

Not so much an answer as a confirmation: it seems to be a problem specific to iOS 7.0 and cocos2d 2.1.

I observed the same behavior: cocos2d 2.1 on iOS 7.0 simulator increases memory usage over time. And a lot, too, every few seconds by ~1 MB. But let's disregard that, the Simulator is not a real device.

On a device (iPod touch 5th gen with iOS 7) memory is barely going up. Using marked generations over a period of 5 minutes indicates a growth of at most 15 KB. Occasionally there is a block of 10-15 KB allocated but eventually let go, at least most of it. The amount of memory added and sticking around over a 5 minute period is about 5 KB. Not much, but also more than nothing for a template app that doesn't do or respond to anything.

The memory that is added and never released on the device is mostly marked as <non-object> as in the Simulator, with a few CGPath thrown in between. So this may indicate that there could be a memory management issue in cocos2d 2.1 on iOS 7 - though it's too minor to have any negative effect on most apps (~100 KB "leaked" per hour).

Sprite Kit and OpenGL applications as well as running on a iOS 6 Simulator (I couldn't test on a iOS 6 device) don't show any such issue, live bytes remains steady with marked generations reporting no growth at all.

like image 122
LearnCocos2D Avatar answered Nov 03 '22 09:11

LearnCocos2D