Не удается перезапустить графику iPhone OpenGL, когда я переключаюсь назад с контроллера представления UIKit - PullRequest
2 голосов
/ 24 мая 2011

Я переключаюсь между двумя контроллерами представления iPhone: начальный viewController, выполняющий представление 3D анимации OpenGL, и второй viewController с представлением UIKit настроек программы. Анимация OpenGL работает нормально, когда я запускаю приложение, и я могу переключиться на второй VC, чтобы изменить настройки программы. Когда я возвращаюсь из VC настроек через делегата, я не могу перезапустить анимацию OpenGL - у меня только черный вид.

Что-нибудь еще нужно сделать, чтобы повторно инициализировать состояние OpenGL-ES, когда я снова переключаюсь в представление GL?

Мой переключатель с GL viewController на настройки viewController работает нормально:

- (IBAction) switchToSettingsView:(id) sender {
    SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil];
    controller.settingsDelegate = self;
    [self stopTimer];    // Stop the animation
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];
[controller release];
}

Когда я возвращаюсь из представления настроек через следующего делегата, я вижу только черный фон:

- (void) settingsViewControllerDidFinish:(SettingsViewController *)controller {
    [self dismissModalViewControllerAnimated:YES];
    [self startTimer];
    [glView startAnimation];
    [glView drawView];   // Explicitly re-drawing the GL view doesn't help
}

Добавление viewDidAppear / viewWillDisappear не помогло. Их называют как положено.

- (void)viewDidAppear:(BOOL)animated
{
    [glView startAnimation];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [glView stopAnimation];
}

В настоящее время я не использую CADisplayLink в startAnimation, я использую NSTimer.

Мой OpenGL drawView работает в режиме GL после того, как я возвращаюсь через делегата, но на дисплее ничего не появляется.

ОБНОВЛЕНИЕ: РАЗРЕШЕНО !!! Как и предполагал Кихото, воссоздание контекста EAGL помогло. Я также должен был воссоздать кадровые буферы. Выполнение одного без другого не решило проблему. Вот код, который я использовал для повторной инициализации графического состояния:

// Re-initialize the EAGL context and framebuffers
- (void)reInitContext {
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
        kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

    [context release];      // Releases the old EAGL Context
    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

    if (!context) {
        NSLog(@"RECREATING EAGL CONTEXT FAILED!");
    } else {
        NSLog(@"RECREATING EAGL CONTEXT SUCCEEDED!");
    };
    if (![EAGLContext setCurrentContext:context]) {
        NSLog(@"RE-SETTING EAGL CONTEXT FAILED!");
    } else {
        NSLog(@"RE-SETTING EAGL CONTEXT SUCCEEDED!");
    };

    [self destroyFramebuffer];
    [self createFramebuffer];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...