这不是一个真正的问题,因为我知道如何解决它,但我只是好奇。下面我有我的故事板的截图。这很简单,它最初加载一个主菜单,它有一个按钮,通过模态segue加载UIView。 UIView包含一个容器视图控制器,它有一个导航控制器,其根视图控制器是GLKViewController。有两种方法可以返回主菜单。首先,您可以点击暂停按钮,将暂停视图控制器推到OpenGL视图控制器的顶部,然后点击那里的返回菜单按钮,触发退回segue返回主菜单。或者,您可以等待计时器向下运行至零并且您的游戏结束,此时游戏在视图控制器上通过segue显示,然后您可以从那里放松回主菜单。此故事板的屏幕截图链接如下:
http://i.stack.imgur.com/2LKVQ.png
您可能会注意到我有两个segue通过视图控制器连接到游戏。最初,我使用模态segue来显示该视图控制器。一切都运行良好,除非我解开主菜单然后尝试开始新游戏,[EAGLContext currentContext]等于nil,我以下面的方式加载到我的GLKViewController子类'viewDidLoad中。
if (![EAGLContext currentContext])
{
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
/* Reload all my buffers/textures/shaders/etc here */
}
else
{
self.context = [EAGLContext currentContext];
}
if (!self.context)
{
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
view.drawableMultisample = GLKViewDrawableMultisample4X;
[EAGLContext setCurrentContext:self.context];
不是很大,最初我的嵌入式GLKViewController只是画了一个黑屏,但当我弄清楚发生了什么时,这只是意味着我必须重新加载我之前加载的所有缓冲区/纹理/着色器/等进入旧的环境并缓存以备将来使用。但是,如果我从推送segue中解开,或者通过暂停菜单或切换到通过推送segue在视图上显示游戏,[EAGLContext currentContext]不是零,但仍然等于我初始化的上下文我第一次加载GLKView。因此,我可以使用所有缓存的缓冲区/纹理/着色器/等,而不必重新加载它们。
做一些阅读,我不确定为什么从模式segue中展开会擦除当前上下文,而从push segue执行此操作则不会。我做一些阅读的理解是每个线程都维护着自己的EAGLContext,无论我设置视图控制器的哪个方向段,我总是留在主线程上。我很好奇是否有人知道为什么会这样。