【问题标题】: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() 后纹理实际上不会被释放。它们不是很常见的场景,但为了完整起见应该提及:
如果纹理附加到 FBO,并且该 FBO 当前未绑定,则 FBO 的纹理引用将使纹理保持活动状态,直到纹理与 FBO 分离或 FBO 被删除。请注意,对于当前绑定的 FBO,纹理在删除时会自动分离。
如果资源在多个上下文之间共享,事情也会变得更加复杂。在这种情况下,最好查阅规范以了解确切的行为。