java - OpenGL es 1.1 - android - gl.glDeleteTextures 是否释放视频内存?

标签 java android opengl-es

上下文:

我使用 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() 后,纹理实际上不会被释放。它们不是很常见的场景,但为了完整起见应该提及:

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

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

关于java - OpenGL es 1.1 - android - gl.glDeleteTextures 是否释放视频内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269383/

相关文章:

java - Hibernate命名查询及其性能优势?

java - JAX-WS 客户端 : maintain session/cookies across multiple services

java - 用 Java 创建星形图案。

java - 不断变化的数据

ios - 每一帧都设置视口(viewport)是个好主意吗?

java - RxJava : How to handle events in multiple threads

android - 如何设计具有圆角和阴影的弹出窗口

android - 如何在 Ubuntu 上安装 Android Studio?

android - 如何将 2D 显示坐标映射到 3D OpenGL 空间

iOS - GPU 加速矩阵转置、乘法和特征分解困境