EAGLView прозрачность кадров в секунду - PullRequest
2 голосов
/ 05 января 2012

У меня есть проект Cocos2d, и я хочу иметь постоянный фон для всего приложения.В методе applicationDidFinishLaunching его делегата я заменил строку:

[viewController setView:glView];

на

[[viewController view] addSubview:glView];

, потому что я добавил подпредставления для представления RootViewController в его initWithNib, и этиизменения будут потеряны, если вид заменить на glView.

Я также изменил формат пикселя glView с kEAGLColorFormatRGB565 на kEAGLColorFormatRGBA8.Когда я делаю это изменение, glView становится прозрачным, и я могу видеть сквозь него, но частота кадров резко падает.Если я не внесу это изменение, представление не станет прозрачным, но я не вижу огромного падения fps.Я говорю о значительном падении частоты кадров с 59.0-60.0 до 35.0-42.0.

Я использую этот код прямо под строкой addSubview выше, чтобы сделать представление прозрачным:

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

Последние две строки являются виновниками;комментирование их (обоих, а не только одного) вызывает большое падение fps, в то время как комментирование строки glClearColor не влияет на fps.

Весь метод applicationDidFinishLaunching выглядит следующим образом:

- (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]];
}

Есть идеи относительно того, почему это происходит?Я могу предоставить больше кода, если это будет необходимо.

1 Ответ

0 голосов
/ 05 января 2012

Если вы тестируете это на устройстве 1-го или 2-го поколения, следует ожидать снижения частоты кадров.С этим ничего не поделаешь.Эти устройства сильно ограничены скоростью заполнения, а прозрачный 32-битный GL-дисплей просто требует слишком много от устройства.

Если это происходит на устройствах 3-го или даже 4-го поколения, значит, что-то не такно я не мог понять, что это может быть.

Если вы тестируете производительность на симуляторе, не надо.Это не имеет значения.

...