【问题标题】:opengles view switching problemopengles视图切换问题
【发布时间】:2026-02-23 06:00:02
【问题描述】:

我正在尝试使用 OpenGLES 制作简单的游戏。 我有两个 EAGLViews(菜单和游戏视图)。 每个视图都有自己的 viewController。视图的初始化由 viewController 的 initWithNIBName 方法完成。 而当我想显示视图时,我只需使用主窗口的 addSubview 方法。 游戏视图仅在启动时初始化一次。仅在需要时才初始化菜单视图。问题是,当我从游戏视图转到菜单然后返回,然后我重新绘制游戏视图时,出现了问题。 (我在绘制之前在 drawView 方法中设置了 EAGLContext,所以上下文可能是正确的)。 不知道问题出在哪里? 或者如果整个切换管理错误,请给我和建议。 感谢您的回复。

【问题讨论】:

    标签: iphone opengl-es multiple-views


    【解决方案1】:

    我猜你遇到了纹理显示不正确的问题?

    我不知道 OpenGL 背后的真实情况,但这是我的假设: 每次回到 EAGLView,EAGLView 的 EAGLContext 都会改变。 (如果您一直从 OpenGLES 模板复制和粘贴)纹理只能在上下文处于正确状态后加载,否则您无法加载任何纹理。现在,通过离开 EAGLView 并返回,您正在从 initWithCoder:(NSCoder*)coder 实例化一个新的 EAGLContext:

        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    
        if (!context || ![EAGLContext setCurrentContext:context]) {
            [self release];
            return nil;
        }
    

    那么我们怎样才能保留这个上下文呢?我使它成为全球性的。就那么简单。当 EAGLView 再次被实例化时,让它检查“全局”EAGLContext 是否为 nil。如果它是 nil,就实例化它,否则什么也不做。除非你想退出你的程序,否则永远不要释放或释放这个全局 EAGLContext。

    这对我有用,但同样,我上面的假设可能不正确。如果有人知道真实的事情,请教我。我也虚心地需要指导。我想真正知道为什么会发生这种情况以及为什么我们也必须这样做。

    顺便说一句,这能回答你的问题吗,Jenicek?

    【讨论】:

    • 当您切换视图并且屏幕上有不同的 OpenGL 视图时,您需要使用正确的 OpenGL 上下文调用 [EAGLContext setCurrentContext:context]。否则,gl* 调用仍然会修改其他 OpenGL 视图的内容。