调用glDrawArrays后的GL_OUT_OF_MEMORY。为什么?

时间:2011-06-09 02:42:03

标签: java android opengl-es

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

OS: Android 2.2 Froyo
Device: SGS Vibrant
Application: OpenGL-ES 1.1

问题在于:我可以成功渲染一个相当复杂的场景,并且它可以无限地运行数小时而不会泄漏任何内存。 Dalvikvm每隔3-5分钟出现在logcat中一次,除非我尝试退出我的应用程序并再次运行它,否则没有问题。事实上,我可以重启我的应用程序2次,但第三次,我得到GL_OUT_OF_MEMORY

我已将错误追踪到gl.glDrawArrays()来电。我可以确认{| 1}}在DrawArrays调用之前返回0,并且在DrawArrays调用之后它将返回1285(GL_OUT_OF_MEMORY)。

当然,我认为我没有清理资源并释放OpenGL上下文。以下是关闭应用程序时的操作。

gl.glGetError()

当我前两次运行我的应用程序时,我没有在关机时返回任何错误。但是在第3次尝试时,我收到了上述错误,我将其追踪到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次运行期间发生的事情的简要概述:

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

  2. 对象57-64生成gl.glDrawArrays()错误。对象会被渲染,但纹理是黑色的。

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

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

  调用glDrawArrays后,

GL_OUT_OF_MEMORY。为什么呢?

真的很难说,但是根据我所学到的,当你在内存中太多多个多边形时,或者至少定义了相同的顶点时会发生这个错误 n < / em>次。既然你说你有一个复杂的场景;这个问题可能是内存问题。

一个解决方案可以使用glDrawElements(),让你的场景通过让你的多边形在必要时共享相同的顶点来减少顶点数量。通过这种方式降低了内存,可能可以解决这个问题。

答案 2 :(得分:1)

我发现glDrawArrays()在使用非空指针调用GL_OUT_OF_MEMORY时设置glVertexAttribPointer()。结果是因为不同的代码调用glBindBuffer()来使用顶点数组对象,但之后没有解除缓冲区的绑定。致电glBindBuffer(GL_ARRAY_BUFFER, 0)解决了问题。

答案 3 :(得分:0)

如果您在Android上有错误的glVertexAttribPointer调用,也会发生这种情况。我得到了这个错误,当我错误地将ST属性传递给先前准备的普通属性时(重复glVertexAttribPointer调用以准备普通属性,第二个应该绑定到ST属性)。