就我而言,当用c ++等语言在堆内存中声明变量时,需要删除它。当它在堆栈中声明时,垃圾收集器在变量超出范围时释放内存。程序终止时,操作系统会声明泄漏的内存。
GPU上是否有类似的垃圾收集器?
比如说我在OpenGL中创建一个VBO,这个缓冲区会无限期地保留在vram上吗?是否存在堆/堆栈vram的概念?
另一个例子是,如果我要使用glCreateProgram
在gpu上创建一个程序并随后附加一个着色器,我该如何(如果我需要)释放为该程序分配的内存?
答案 0 :(得分:3)
与OpenGL很多东西一样,它取决于实现。该规范为不同的驱动程序实现提供了很大的空间。
例如,glDeleteTextures
表示:
删除纹理后,它没有内容或维度,其名称可以重复使用(例如glGenTextures)。
唯一可以立即保证的是名称(glGenTextures
返回的整数值)再次可用。它没有说明该内存是否实际已被清理过。
如果驱动程序想要实现一个垃圾收集器,它可以清除已经删除的缓冲区后面的实际内存,那么它们就可以了。一个更简单的实现只会在返回之前清理所有内容。
也无法保证数据在VRAM中结束。根据许多因素,某些缓冲区可能最终会出现在常规RAM中。
更直接地回答你的问题: