2

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

[viewController setView:glView]; 

с

[[viewController view] addSubview:glView]; 

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

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

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

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

Последние две строки являются виновниками; комментируя их (оба, а не только один) вызывает значительное падение кадров в секунду, в то время как комментирование строки 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]]; 
} 

Любые идеи, почему это происходит? При необходимости я могу предоставить больше кода.

ответ

0

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

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

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

+0

Я тестирую этот код на своем iPhone 4 под управлением iOS 5.0.1. –

Смежные вопросы