我的情况似乎很奇怪。我会尽量提供足够的细节,以便比我聪明的人可以解释这一点。基本上这里是设置:
OS: Android 2.2 Froyo
Device: SGS Vibrant
Application: OpenGL-ES 1.1
这就是问题所在:我可以成功地渲染一个相当复杂的场景,并且它可以无休止地运行数小时而不会泄漏任何内存。 Dalvikvm 每 3-5 分钟在 logcat 中出现一次,除非我尝试退出我的应用程序并再次运行它,否则不会有任何问题。事实上,我可以重新启动我的应用程序 2 次,但在第三次时,我得到了 GL_OUT_OF_MEMORY
。
我已将错误追踪到 gl.glDrawArrays()
调用。我可以确认 gl.glGetError()
在有问题的 DrawArrays 调用之前返回 0,并且在 DrawArrays 调用之后它将返回 1285 (GL_OUT_OF_MEMORY)。
自然地,我想到了我不是在清理资源和释放 OpenGL 上下文。这是应用程序关闭时我所做的。
for(int x=0; x<buffers.length; x++){
if(gl.glIsBuffer(buffers[x])){
gl.glDeleteBuffers(1, buffers, x);
buffers[x]=0;
}
}
for(int y=0; y<textures.length; y++){
if(gl.glIsTexture(textures[y])){
gl.glDeleteTextures(1, textures, y);
textures[y]=0;
}
}
System.out.println("ERROR: "+gl.glGetError());
finish();
当我前两次运行我的应用程序时,我在关闭时没有收到任何返回的错误。然而,在第 3 次尝试时,我遇到了上述错误,我将其追溯到 gl.glDrawArrays()
调用。
这是第 3 次运行期间发生的事情的简要总结:
对象 1-56 通过它们各自的
gl.glDrawArrays()
调用就像热刀穿过黄油一样。没有产生错误。对象 57-64 生成一个
GL_OUT_OF_MEMORY
错误。对象得到渲染,但纹理是黑色的。
我非常确定我会在应用程序关闭时删除所有缓冲区和纹理。我也确信此错误并非特定于某个 3D 模型,因为我已尝试跳过模型 #57,但 #58 仍然会出现此错误。
请帮忙,因为我的想法已经用完了!
最佳答案
我刚刚发现如果您首先将 NULL 指针传递给 glVertexAttribPointer,则可以设置 GL_OUT_OF_MEMORY。
drawArrays 之前没有错误,之后是 GL_OUT_OF_MEMORY。 (在 Galaxy S2 4.1.2、GLES2 上测试)也许这就是您程序中一段时间后出于某种原因发生的事情?
我花了很长时间才找到... TODO:更多单元测试 :)
关于java - GL_OUT_OF_MEMORY 在调用 glDrawArrays 之后。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287545/