我正在尝试使用OpenGLES制作简单的游戏。 我有两个EAGLViews(菜单和游戏视图)。 每个视图都有自己的viewController。视图的初始化由viewController的initWithNIBName方法完成。 当我想显示视图时,我只是使用主窗口的addSubview方法。 游戏视图仅在启动时初始化一次。菜单视图仅在需要时初始化。问题是,当我从游戏视图转到菜单然后回来,然后我重绘游戏视图时,出现了问题。 (我在绘制之前在drawView方法中设置EAGLContext,因此上下文可能是正确的)。 你知道问题出在哪里吗? 或者,如果整个转换管理错误,请给我一些建议。 谢谢你的回复。
答案 0 :(得分:1)
我猜你在纹理无法正确显示方面遇到了麻烦?
我不知道OpenGL背后的真实情况,但这是我的假设: 每次回到EAGLView时,EAGLView的EAGLContext都会被更改。 (如果您一直在从OpenGLES模板中复制和粘贴)纹理只能在上下文处于正确状态后加载,否则您无法加载任何纹理。现在,通过离开EAGLView并返回,您将从initWithCoder实例化一个新的EAGLContext:(NSCoder *)编码器:
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
return nil;
}
那么我们如何才能保留这种背景呢?我把它变得全球化。就那么简单。当要再次实例化EAGLView时,请检查“全局”EAGLContext是否为零。如果它是零,只需实例化它,否则什么也不做。除非您想退出程序,否则永远不要释放或取消分配这个全局EAGLContext。
这对我有用,但同样,我的上述假设可能不正确。如果有人知道真实的东西,请告诉我。我也谦卑地需要指导。我想真正知道为什么会这样,为什么我们也必须这样做。
顺便说一下,这是否回答了你的问题,Jenicek?