上下文:
我使用 gl.glGenTextures 将 2 个纹理加载到大小为 2 的 int[] 中,然后将纹理绑定(bind)到 int[] 的每个槽。 (这很好用,我可以将每个纹理绘制到我准备好的“纹理方 block ”上)
现在,我真正关心的是:
运行 gl.glDeleteTextures(2, int[] contains 2 个纹理指针, 0) 会清除生成到我的 int[] 中的 2 个纹理所使用的内存吗?或者这只是释放“纹理名称”?
最佳答案
它确实删除了纹理数据。当您进行调用时,内存可能不会立即释放,但最终会被释放。或者至少可供其他分配重用。内存管理的细节是高度特定于平台和驱动程序的。但作为 OpenGL API 的用户,您可以考虑调用 glDeleteTextures()
后释放的内存。
内存可能无法立即释放的原因是 OpenGL 是异步操作的。在像这样的典型调用序列中:
glBindTexture(GL_TEXTURE_2D, texId);
glDrawArrays(...);
glDeleteTextures(1, &texId);
当进行 glDeleteTextures()
调用时,绘制调用很可能仍在排队等待 GPU 执行。由于绘制调用使用纹理数据,因此无法立即删除它。只有在 GPU 执行完绘制调用后才能释放内存。
有一些异常(exception)情况,在调用 glDeleteTextures()
后,纹理实际上不会被释放。它们不是很常见的场景,但为了完整起见应该提及:
如果纹理附加到 FBO,并且该 FBO 当前未绑定(bind),则 FBO 的纹理引用将使纹理保持 Activity 状态,直到纹理与 FBO 分离或 FBO 被删除。请注意,对于当前绑定(bind)的 FBO,删除纹理时会自动分离。
如果资源在多个上下文之间共享,事情也会变得更加复杂。最好查阅有关这种情况下确切行为的规范。
关于java - OpenGL es 1.1 - android - gl.glDeleteTextures 是否释放视频内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269383/