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

我的情况似乎很奇怪。我将尝试提供足够的详细信息,以便比我聪明的人可以对此进行解释。基本上这里是设置:

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:更多单元测试:)

    将在PermGen OOM中最终无休止的创建和运行线程? - java

    在我的过程中,我不断创建一个新的Thread对象(实际上是Thread的子类)(每秒最多几个),运行它并干净地结束。我已经注意到,例如,当该过程进行了25天时,该过程可能会死掉而将hprof抛在后面,这意味着OOM。但是与堆中分配的内存相比,堆转储很小,因此它可能是PermGen OOM,我正试图找出罪魁祸首。我没有使用任何特殊的jvm参数禁止-XX:+ H…

    如何使用system.out.println从void方法填充Jtextarea? - java

    我正在使用具有public void方法init()和System.out.println()的库。在我的实现中,我只能访问无效的方法init(),但无法将sout的输出获取到我的gui组件JTextarea。是否可以捕获它(使用InputStream或其他方式)?任何帮助表示赞赏。谢谢 参考方案 假设您无权访问该库并且可以更改它(对于GUI应用程序,我有点…

    在小数点后三位显示秒。 -Java - java

    我在Java程序中使用毫秒,并将其转换为秒。我的方法执行完此操作后,它将以长格式返回秒。System.out.println("[" + threadID + "]" + " " + "SeqSum res=" + grandTotal + " secs=" …

    字符串内存分配 - java

    哪一个更好System.out.println("hello world"); 要么String s="hello world"; System.out.println(s); 参考方案 对于此简单示例,在内存分配方面没有区别。

    System.out.println-此方法是否在Java中链接? - java

    我想知道下面的Java代码:“ System.out.println”。我对此是正确的:“系统”是静态类。 “ .out”是“系统”类的方法。这是我对“ .println”有点困惑的地方-这是一个什么类/对象的方法?另外,这个概念被称为“方法链接”吗?谢谢GF 参考方案 不,这不是方法链接。您正确地认为System是一个类(只是一个常规类,不是“静态”,只有…