Java OpenGL:如何正确地从视频内存加载/卸载纹理?

Java OpenGL:如何正确地从视频内存加载/卸载纹理?,java,linux,memory,opengl-es-2.0,jogl,Java,Linux,Memory,Opengl Es 2.0,Jogl,我有一个Java OpenGL应用程序,由JOGL支持,运行在Linux slitaz 3.2.53-slitaz#4 SMP Europe 2014 i686 GNU/Linux上 OpenGL详细信息: 供应商:英特尔开源技术中心 渲染器:Mesa DRI 英特尔(R)Ivybridge Mobile x86/MMX/SSE2 版本:2.1 Mesa 9.1.3 GL 简介:GLProfile[GL2/GL2.hw] 当在GPU上运行加载和删除纹理时,它会在一定时间后崩溃-与加载和卸载的

我有一个Java OpenGL应用程序,由JOGL支持,运行在Linux slitaz 3.2.53-slitaz#4 SMP Europe 2014 i686 GNU/Linux上

OpenGL详细信息:

  • 供应商:英特尔开源技术中心
  • 渲染器:Mesa DRI
  • 英特尔(R)Ivybridge Mobile x86/MMX/SSE2
  • 版本:2.1 Mesa 9.1.3 GL
  • 简介:GLProfile[GL2/GL2.hw]
当在GPU上运行加载和删除纹理时,它会在一定时间后崩溃-与加载和卸载的频率成比例,加载越多,崩溃越快,等等

给出的错误:英特尔刷新锁定失败:设备上没有剩余空间

在这种情况下,我:

  • 正在创建帧缓冲区,glGenFramebuffers
  • 创建背衬纹理,glGenTextures。。glFramebufferTexture2D
  • 绑定并绘制到此屏幕外帧缓冲区
  • 正在删除缓冲区,glDeleteFramebuffers
  • 保持纹理在屏幕上绘制几帧
  • 删除纹理,glDeleteTextures
在四处搜索后,我发现有消息表明,glDeleteTextures不能保证该纹理使用的VRAM是免费的,只有glGenTextures返回的ID可以重用。例如:

但我也发现了一些文章报告了Mesa驱动程序中的潜在/错误&Lunix版本报告了相同的异常:intel_do_flush_locked failed:设备上没有剩余空间

最后,我要问:

  • 我是否正确地使用OpenGL命令加载和删除纹理
  • 是否有其他人对此错误有问题并发现它与设备/发行版相关

  • 谢谢。

    问题确实如Reto Koradi在评论中所建议的那样,在删除之前不将纹理和渲染缓冲区与帧缓冲区分离会将它们保留在内存中

    对于正在使用纹理和/或渲染缓冲区创建屏幕外帧缓冲区的任何其他人,请确保先分离它们!例如:

    • glBindFramebuffer(GL2ES2.GL_FRAMEBUFFER,theFrameBufferID)
    • glFramebufferTexture2D(GL2ES2.GL_帧缓冲区, GL2ES2.GL_颜色_附件0,GL2ES2.GL_纹理_2D,0,0)
    • glFramebufferRenderbuffer(GL2ES2.GL_帧缓冲区, GL2ES2.GL_模板附件,GL2ES2.GL_渲染缓冲,0)
    • glDeleteFramebuffers。。帧缓冲ID
    • glDeleteTextures
    • glDeleteRenderbuffers
    • glBindFramebuffer(GL2ES2.GL_帧缓冲区,0)
    你不能仅仅重复使用纹理吗?我已经尝试对缓冲区、纹理、渲染缓冲区和帧缓冲区重新使用ID。到目前为止,除了重新使用帧缓冲区外,所有的功能都在工作,但内存仍在被消耗。。我还需要调用其他东西来释放之前分配给IDs的资源吗?您不应该看到您所做的任何泄漏。您链接的关于纹理内存的答案是正确的,不一定会立即释放,但如果您阅读整个答案,它将更清楚这意味着什么。我在这里回答了一个类似的问题:,并且消息与您链接的答案一致。Reto Koradi是对的,纹理应该在VRAM上删除。创建纹理时使用的直接NIO缓冲区由您来管理,但我认为这不是您的问题的罪魁祸首。