OpenGL:如何正确加载/卸载视频内存中的纹理?

时间:2014-08-15 11:15:34

标签: 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]

运行loading&删除GPU上的纹理后,它会在一定时间后崩溃 - 与负载频率成正比。卸载,更多负载更快崩溃等。

给出的错误:intel_do_flush_locked失败:设备上没有剩余空间

在这种情况下我是:

  • 创建一个帧缓冲区,glGenFramebuffers ..
  • 创建背景纹理,glGenTextures .. glFramebufferTexture2D ..
  • 绑定&绘制到这个屏幕外的帧缓冲区..
  • 删除缓冲区,glDeleteFramebuffers
  • 保持纹理绘制到屏幕几帧
  • 删除纹理,glDeleteTextures

搜索后我发现源代码表明glDeleteTextures不保证纹理使用的VRAM的释放,只是glGenTextures返回的ID,因此可以重复使用。例如: https://gamedev.stackexchange.com/questions/63629/how-to-deallocate-release-delete-of-a-gltexstorage2d

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

总之,我在问:

  1. 我是否正确使用OpenGL命令加载&删除纹理?
  2. 是否有其他人遇到此错误的问题&发现它与设备/发行版有关吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:0)

确实存在问题,正如Reto Koradi在评论中通过他对OpenGL es 1.1 - android - does gl.glDeleteTextures free video memory?的答案所建议的那样,没有分离纹理&在删除之前从帧缓冲区渲染缓冲区将它们保留在内存中。

对于使用纹理& /或渲染缓冲区创建屏幕帧缓冲区的任何其他人,请确保先将它们分离! E.g:

  • glBindFramebuffer(GL2ES2.GL_FRAMEBUFFER,theFrameBufferID);
  • glFramebufferTexture2D(GL2ES2.GL_FRAMEBUFFER, GL2ES2.GL_COLOR_ATTACHMENT0,GL2ES2.GL_TEXTURE_2D,0,0);
  • glFramebufferRenderbuffer(GL2ES2.GL_FRAMEBUFFER, GL2ES2.GL_STENCIL_ATTACHMENT,GL2ES2.GL_RENDERBUFFER,0);
  • glDeleteFramebuffers .. theFrameBufferID ..
  • glDeleteTextures ..
  • glDeleteRenderbuffers ..
  • glBindFramebuffer(GL2ES2.GL_FRAMEBUFFER,0);