【问题标题】:OpenGL es 1.1 - android - does gl.glDeleteTextures free video memory?OpenGL es 1.1 - android - gl.glDeleteTextures 是否释放视频内存?
【发布时间】:2014-08-13 12:47:35
【问题描述】:

上下文:

我使用 gl.glGenTextures 将 2 个纹理加载到大小为 2 的 int[] 中,然后将纹理绑定到 int[] 的每个插槽。 (这很好用,我可以将每个纹理绘制到我准备好的“纹理方块”上)

现在,我真正关心的是:

运行 gl.glDeleteTextures(2, int[] contains 2 texture pointers, 0) 会清除 int[] 中生成的 2 个纹理使用的内存吗?还是这只是释放“纹理名称”?

【问题讨论】:

标签: java android opengl-es


【解决方案1】:

它确实删除了纹理数据。调用时内存可能不会立即释放,但最终会被释放。或者至少可供其他分配重用。内存管理的细节高度依赖于平台和驱动程序。但作为 OpenGL API 的用户,您可以考虑在调用 glDeleteTextures() 之后释放的内存。

内存可能无法立即释放的原因是 OpenGL 异步操作。在这样的典型调用序列中:

glBindTexture(GL_TEXTURE_2D, texId);
glDrawArrays(...);
glDeleteTextures(1, &texId);

在进行glDeleteTextures() 调用时,绘图调用很可能仍在排队等待由 GPU 执行。由于绘图调用使用纹理数据,因此无法立即删除。只有在 GPU 执行完绘制调用后才能释放内存。

有几个例外情况,在调用glDeleteTextures() 后纹理实际上不会被释放。它们不是很常见的场景,但为了完整起见应该提及:

  1. 如果纹理附加到 FBO,并且该 FBO 当前未绑定,则 FBO 的纹理引用将使纹理保持活动状态,直到纹理与 FBO 分离或 FBO 被删除。请注意,对于当前绑定的 FBO,纹理在删除时会自动分离。

  2. 如果资源在多个上下文之间共享,事情也会变得更加复杂。在这种情况下,最好查阅规范以了解确切的行为。

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多