java - GL_OUT_OF_MEMORY 在调用 glDrawArrays 之后。为什么?

标签 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() 调用。我可以确认 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. 对象 1-56 通过它们各自的 gl.glDrawArrays() 调用就像热刀穿过黄油一样。没有产生错误。

  2. 对象 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/

相关文章:

java - 同时运行两个任务并更改一个变量

JAVA - 如何避免 MySQL 中的值重复?

java - onClick 监听器和 onClick on XML 将不起作用

android - 用于 android 开发的 adt-bundle 中的 Eclipse 通过自动完成卡住

ios - 在 ios 中将图像转换为卡通

iphone - 如何将 OpenGL View 捕获为 UIImage?

java - Hibernate session.load 不填充对象的 arraylist 属性

android - Android JUnit 测试失败,没有像我预期的那样破坏我的 Ant 脚本?

android - 创建使用 AAR 文件作为依赖项的 Android 库

ios - 为 iOS 清洁 C++ OpenGL