【问题标题】:How to correctly load/unload textures from video memory?OpenGL:如何从视频内存中正确加载/卸载纹理?
【发布时间】:2014-10-09 03:13:37
【问题描述】:

我有一个 Java OpenGL 应用程序 - 由 JOGL 提供支持,在 Linux slotaz 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 上运行加载和删除纹理时,它会在一定时间后崩溃 - 与加载和卸载的频率成正比,更多的加载会更快崩溃等等。

给出的错误:intel_do_flush_locked failed: No space left on device

在这种情况下,我是:

  • 创建帧缓冲区,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 failed: No space left on device

最后我要问的是:

  1. 我是否正确使用 OpenGL 命令加载和删除纹理?
  2. 是否有其他人遇到过此错误并发现它与设备/发行版有关?

谢谢。

【问题讨论】:

  • 你不能只重复使用纹理吗?
  • 我已经尝试为缓冲区、纹理、渲染缓冲区和帧缓冲区重新使用 ID。到目前为止,除了重复使用的帧缓冲区之外,所有的帧缓冲区都在工作,但内存仍在被消耗。我还需要调用其他什么来释放之前分配给 ID 的资源吗?
  • 你不应该看到你正在做的任何泄漏。您链接的答案是正确的,不一定会立即释放纹理内存,但是如果您阅读了整个答案,就会更清楚这意味着什么。我在这里回答了一个类似的问题:stackoverflow.com/questions/25269383/…,消息和你链接的答案是一致的。
  • Reto Koradi 是对的,应该删除 VRAM 上的纹理。创建纹理时使用的直接 NIO 缓冲区由您来管理,但我认为这不是您的罪魁祸首。
  • 现在全部整理完毕,感谢您为我指明了正确的方向,这是一个巨大的帮助。

标签: java linux memory opengl-es-2.0 jogl


【解决方案1】:

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

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

  • 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..FrameBufferID..
  • glDeleteTextures..
  • glDeleteRenderbuffers..
  • glBindFramebuffer(GL2ES2.GL_FRAMEBUFFER, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2015-12-22
    • 2017-06-11
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多