OpenGL es 1.1 – android – 做gl.glDeleteTextures免费video内存吗?

语境:

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

现在,我的实际关注点:

运行gl.glDeleteTextures(2,包含2个纹理指针的int [],0)是否清除了生成到我的int []中的2个纹理所使用的内存? 或者这只是释放“纹理名称”?

它确实删除了纹理数据。 您拨打电话时可能不会立即释放内存,但最终会释放内存。 或至少可供其他分配重用。 内存管理的细节是高度平台和驱动程序特定的。 但作为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. 如果资源在多个上下文之间共享,事情也会变得更加复杂。 在这种情况下,最好参考有关确切行为的规范。