GPU上有垃圾收集吗?

时间:2016-09-30 05:08:47

标签: opengl garbage-collection glsl gpu

就我而言,当用c ++等语言在堆内存中声明变量时,需要删除它。当它在堆栈中声明时,垃圾收集器在变量超出范围时释放内存。程序终止时,操作系统会声明泄漏的内存。

GPU上是否有类似的垃圾收集器?

比如说我在OpenGL中创建一个VBO,这个缓冲区会无限期地保留在vram上吗?是否存在堆/堆栈vram的概念?

另一个例子是,如果我要使用glCreateProgram在gpu上创建一个程序并随后附加一个着色器,我该如何(如果我需要)释放为该程序分配的内存?

1 个答案:

答案 0 :(得分:3)

与OpenGL很多东西一样,它取决于实现。该规范为不同的驱动程序实现提供了很大的空间。

例如,glDeleteTextures表示:

  

删除纹理后,它没有内容或维度,其名称可以重复使用(例如glGenTextures)。

唯一可以立即保证的是名称(glGenTextures返回的整数值)再次可用。它没有说明该内存是否实际已被清理过。

如果驱动程序想要实现一个垃圾收集器,它可以清除已经删除的缓冲区后面的实际内存,那么它们就可以了。一个更简单的实现只会在返回之前清理所有内容。

也无法保证数据在VRAM中结束。根据许多因素,某些缓冲区可能最终会出现在常规RAM中。

更直接地回答你的问题:

  1. 上面大致说明,这取决于司机。
  2. 是的,直到创建VBO的上下文被删除。
  3. 再次,取决于司机。传统意义上没有真正的堆栈,你有数千个内核在不同时间进行浮点数学运算。着色器操作可能以某种指令高速缓存/堆栈格式加载,这对于不同的核心组是不同的。大多数VRAM只是用于纹理/顶点/其他数据blob的堆
  4. 您应该在创建程序后分离/删除着色器。我刚才在gamedev.stackexchange上回答了这个问题:https://gamedev.stackexchange.com/a/47912/12191