调用glDrawArrays后的GL_OUT_OF_MEMORY.为什么?

Tem*_*age 6 java android opengl-es

我的情况似乎很奇怪.我会尝试提供足够的细节,以便比我聪明的人可以解释这一点.基本上这里是设置:

OS: Android 2.2 Froyo
Device: SGS Vibrant
Application: OpenGL-ES 1.1
Run Code Online (Sandbox Code Playgroud)

这就是问题所在:我可以成功渲染一个相当复杂的场景,它可以无限运行几个小时而不会泄漏任何内存.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();
Run Code Online (Sandbox Code Playgroud)

当我前两次运行我的应用程序时,我不会在关机时返回任何错误.但是在第3次尝试时,我得到了上述错误,我追踪到了这个问题gl.glDrawArrays().

以下是第3次运行期间发生的事情的简要概述:

  1. 对象1-56 gl.glDrawArrays()通过黄油等热刀进行各自的通话.没有生成错误.

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

我更确定我在应用程序关闭时删除所有缓冲区和纹理.我也相信这个错误不是特定于一个3D模型,因为我试图跳过模型#57,但是#58仍然会得到这个错误.

请帮助,因为我的想法已经用完了!

ark*_*kod 8

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

drawArrays之前没有错误,GL_OUT_OF_MEMORY之后.(在Galaxy S2 4.1.2,GLES2上测试)也许这是在你的程序中经过一段时间后出于某种原因发生的事情?

这让我永远找到... TODO:更多单元测试:)


Wro*_*lai 2

调用 glDrawArrays 后的 GL_OUT_OF_MEMORY。为什么?

这确实很难说,但据我所知,当内存中的多边形太多,或者至少相同的顶点被定义n次时,就会发生此错误。既然你说你有一个复杂的场景;这个问题很可能是内存问题。

一种解决方案可能是使用glDrawElements()并让您的场景通过在必要时让多边形共享相同的顶点来减少顶点数量。通过这种方式,你的记忆力会降低,这可能会解决问题。