Question

I have a Cocos2d project and I want a constant background throughout the app. In the applicationDidFinishLaunching method of its delegate, I have replaced the line:

[viewController setView:glView];

with

[[viewController view] addSubview:glView];

because I have added subviews to the RootViewController's view in it's initWithNib, and those changes are lost if the view is replaced with glView.

I have also changed the pixelFormat of glView from kEAGLColorFormatRGB565 to kEAGLColorFormatRGBA8. When I make that change, glView becomes transparent and I can see through it, but the fps drops dramatically. If I don't make that change, the view doesn't become transparent, but I don't see the huge drop in fps. I'm talking about a significant drop in fps, from 59.0-60.0 to about 35.0-42.0.

I am using this code right below the addSubview line above to make the view transparent:

glClearColor(0, 0, 0, 0);
director.openGLView.backgroundColor = [UIColor clearColor];
director.openGLView.opaque = NO;

The last two lines are the culprits; commenting them out (both, not just one) causes the large drop in fps, while commenting out the glClearColor line has no effect on fps.

The whole applicationDidFinishLaunching method looks like this:

- (void) applicationDidFinishLaunching:(UIApplication*)application {
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    if(![CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
        [CCDirector setDirectorType:kCCDirectorTypeDefault];

    CCDirector *director = [CCDirector sharedDirector];

    // Init the View Controller
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;

    // Create the EAGLView manually
    //  1. Create a RGB565 format. Alternative: RGBA8
    //  2. depth format of 0 bit. Use 16 or 24 bit for 3d effects, like CCPageTurnTransition
    //

    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]            
                                   pixelFormat:kEAGLColorFormatRGBA8 
                   depthFormat:0
                       ];

    // attach the openglView to the director
    [director setOpenGLView:glView];

    if(![director enableRetinaDisplay:YES] )
        CCLOG(@"Retina Display Not supported");

    #if GAME_AUTOROTATION == kGameAutorotationUIViewController
        [director setDeviceOrientation:kCCDeviceOrientationPortrait];
    #else
        [director setDeviceOrientation:kCCDeviceOrientationPortrait];
    #endif

    [director setAnimationInterval:1.0/60];
    [director setDisplayFPS:YES];

    // make the OpenGLView a child of the view controller
    [[viewController view] addSubview:glView];

    //***make glView transparent***
    glClearColor(0, 0, 0, 0);
    director.openGLView.backgroundColor = [UIColor clearColor];
    director.openGLView.opaque = NO;

    // make the View Controller a child of the main window
    [window addSubview:viewController.view];

    [window makeKeyAndVisible];

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

    // Removes the startup flicker
    [self removeStartupFlicker];

    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene:[MainMenu scene]];
}

Any ideas as to why this is happening? I can provide more code if need be.

Was it helpful?

Solution

If you're testing this on a 1st or 2nd generation device, the drop in framerate is to be expected. Nothing you can do about it. These devices are heavily fillrate-limited, and a transparent 32-bit GL view is just asking too much of the device.

If this happens on a 3rd or even 4th generation device, then there's got to be something wrong but I couldn't begin to tell what that might be.

If you're testing the performance on the Simulator, don't. It's irrelevant.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top