2

这不是一个真正的问题,因为我知道如何解决它,但我只是好奇。下面是我的故事板的屏幕截图。它相当简单,它最初加载一个主菜单,其中有一个按钮,通过模态 segue 加载 UIView。该 UIView 包含一个容器视图控制器,该控制器具有一个导航控制器,其根视图控制器是 GLKViewController。有两种方法可以返回主菜单。首先,您可以点击暂停按钮,将暂停视图控制器推到 OpenGL 视图控制器的顶部,然后点击那里的返回菜单按钮,触发展开转回主菜单。或者,您可以等待计时器降至零并让您的游戏结束,此时游戏通过视图控制器通过 segue 显示,然后你可以从那里放松回到主菜单。该故事板的屏幕截图链接如下:

http://i.stack.imgur.com/2LKVQ.png

您可能会注意到我有两个连接到游戏的视图控制器。最初,我使用模态 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 只是画了一个黑屏,但是当我弄清楚发生了什么时,这只是意味着我必须重新加载我之前加载到旧的所有缓冲区/纹理/着色器/等上下文并已缓存以备将来使用。但是,如果我通过暂停菜单或在切换到通过 push segue 呈现游戏视图之后从 push segue 中解开,[EAGLContext currentContext] 不是 nil,而是与我初始化的上下文相同我第一次加载 GLKView。因此,我可以使用所有缓存的缓冲区/纹理/着色器/等,而不必重新加载它们。

做一些阅读,我不确定为什么从模态转场展开会删除当前上下文,而从推送转场中展开不会。通过阅读我的理解是,每个线程都维护自己的 EAGLContext,无论我设置视图控制器 segues 的哪种方式,我总是留在主线程上。我很好奇是否有人知道为什么会发生这种情况。

4

0 回答 0