调用glDrawArrays后出现GL_OUT_OF_MEMORY错误。为什么?

6
我有一个看起来相当奇怪的情况。我会试着提供足够的细节,让比我聪明的人能够解释这个问题。基本上,这是设置的方式:
OS: Android 2.2 Froyo
Device: SGS Vibrant
Application: OpenGL-ES 1.1

这里的问题是:我可以成功地渲染一个相当复杂的场景,而且它可以无限地运行数小时而不会泄漏任何内存。Dalvikvm 每 3-5 分钟在 logcat 中出现一次,如果我不尝试退出我的应用程序并再次运行它,就不会有任何问题。实际上,我可以重新启动我的应用程序两次,但第三次,我会得到 GL_OUT_OF_MEMORY 错误。
我已经将错误追踪到了 gl.glDrawArrays() 调用。我可以确认,在所讨论的 DrawArrays 调用之前,gl.glGetError() 返回 0,而在之后它将返回 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. 对象1-56通过它们各自的 gl.glDrawArrays() 调用如刀子般顺畅地运行。没有生成任何错误。

  2. 对象57-64会生成一个 GL_OUT_OF_MEMORY 错误。对象被渲染,但纹理是黑色的。

我非常确定在应用程序关闭时删除了所有缓冲区和纹理。我也相信这个错误不是针对一个3D模型的,因为我尝试跳过模型#57,但模型#58仍然会出现这个错误。
请帮忙解决,因为我想不出其他办法了!
4个回答

8

我刚刚发现,如果你先将NULL指针传递给glVertexAttribPointer,就可以设置GL_OUT_OF_MEMORY。

在drawArrays之前没有错误,但在之后却出现了GL_OUT_OF_MEMORY。(在Galaxy S2 4.1.2,GLES2上进行测试)也许这就是你的程序之后出现问题的原因之一?

我花了很长时间才找到这个问题...TODO:增加更多单元测试 :)


2
在调用glDrawArrays后出现GL_OUT_OF_MEMORY错误。为什么会这样?
很难说,但据我所知,当你在内存中有太多的多边形,或者至少是同一顶点被定义了n次时,就会出现这个错误。由于你说你有一个复杂的场景,这个问题可能是一个内存问题。
解决方法之一可以是使用glDrawElements(),让你的场景通过让多边形共享相同的顶点来减少顶点数量。这样可以降低内存使用量,并且可能会解决问题。

2
我发现当非空指针调用glVertexAttribPointer()时,glDrawArrays()会设置GL_OUT_OF_MEMORY。这是因为另一个代码片段调用了glBindBuffer()来使用顶点数组对象,但之后没有解绑缓冲区。调用glBindBuffer(GL_ARRAY_BUFFER,0)解决了问题。

1
如果在Android上使用不正确的glVertexAttribPointer调用,也可能会发生这种情况。当我将ST属性不正确地传递给先前准备好的法线属性时(重复glVertexAttribPointer调用以准备法线属性,第二个应绑定到ST属性),我遇到了这个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接