如何解决从UIKit视图控制器切换回时,无法重新启动iPhone OpenGL图形
|| 我正在两个iPhone视图控制器之间切换:一个初始viewController运行一个3D动画的OpenGL视图,另一个是带有程序设置的UIKit视图的viewController。启动应用程序时,OpenGL动画运行良好,并且可以切换到第二个VC来更改程序设置。当我通过委托从设置VC切回时,我无法使OpenGL动画重新启动-我只得到了黑色视图。 当我切换回GL视图时,我还需要做些其他事情来重新初始化OpenGL-ES状态吗? 我从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];
}
我目前不在startAnimation中使用CADisplayLink,而是在使用NSTimer。
通过委托返回后,我的OpenGL drawView在GL视图中运行,但是显示屏上没有任何显示。
更新:已解决!!!正如quixoto所建议的那样,重新创建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];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。