【发布时间】:2012-05-24 15:11:38
【问题描述】:
我有一个GLSurfaceView 设置并使用GLSurfaceView.Renderer 按预期呈现。我的应用程序使用来自 android 支持包的片段。当我导航到一个新片段时,surfaceDestroyed 被调用,但是当我通过后台堆栈返回片段时,GLSurfaceView 不会呈现,对 requestRender 的调用不会导致 onDraw 调用。
我知道我需要在表面视图上调用onResume 和onPause,并且我正在从托管片段执行此操作,但它似乎无法解决问题。所有关于 htis 方法的例子都参考了活动,这可能是问题吗?如果是这样,您如何在片段中使用GLSurfaceView。
非常感谢任何见解,我很乐意发布代码,但这对我来说似乎更像是一个普遍的问题,
谢谢
【问题讨论】:
-
这是一个很好的问题,我也在寻找答案(如果我能找到解决方案会更新)。
-
我没有尝试在片段中使用 GLSurfaceView,但根据我对 Internet 上基于活动的示例的经验,它们大多不完整或已过时。我认为主要问题是您需要在 onPause 中使用所有 OpenGL 资源(纹理、着色器、VBO IIRC)并在 onResume 中重新创建它们。我最近会检查我的旧代码。您是否尝试将您的确切代码放入活动中?
-
@Blackhex 代码在活动中运行良好,当我决定将其移动到片段中时,我遇到了问题。我对 OpenGL 没有太多经验,所以如果你能指出我在暂停时释放所有资源的正确方向,我会试一试。
-
对于 onResume() 中的每个 glCreateShader()、glCreateProgram()、glGetTextures()、glGenBuffers() 和 glGenFramebuffers(),都应该有 glDeleteShader()、glDeleteProgram()、glDeleteTextures()、glDeleteBuffers()和 onPause() 中的 glDeleteFramebuffers()。我看到我在 onPause() 中也有 glBindFramebuffer(GL_FRAMEBUFFER, 0)。另一个区别是我使用的是原生 C OpenGL ES 库,而(据我所知)你使用的是 Java 绑定。
标签: android opengl-es android-fragments glsurfaceview