OpenGL为无效缓冲区提供了函数glInvalidateBufferData
和glInvalidateBufferSubData
。
根据OpenGL wiki,这些功能的作用是什么:
当缓冲区或其区域无效时,表示该缓冲区的内容现在未定义。
和
这个想法是,通过使缓冲区或其范围无效,实现将简单地获取新的内存块以用于任何后续操作。因此,虽然先前发布的GL命令仍然可以读取缓冲区的原始数据,但您可以使用新值(通过映射或glBufferSubData)填充无效缓冲区,而不会导致隐式同步。
我很难理解何时应该调用此函数以及何时不应该调用此函数。理论上,如果缓冲区的内容将被覆盖,那么如果先前的内容被删除则完全没有区别。这是否意味着应该在每次写入之前调用缓冲区?或者仅在某些情况下?
答案 0 :(得分:1)
理论上,如果缓冲区的内容将被覆盖,那么如果先前的内容被删除则没有任何区别。
你是对的。
实质上,无论您是致电glBufferData
还是glInvalidateBufferData
,您实现了相同的最终目标。区别在于glBufferData
你更多地说“我现在这么多内存”,这反过来意味着旧内存被丢弃了。但是对于glInvalidateBufferData
,您说“我不再需要此内存”。 glInvalidateBufferSubData()
vs glBufferSubData()
以及所有其他glInvalidate*()
函数也是如此。
这里的关键是,如果你有一个缓冲区,你现在不再需要它了,但你保留了句柄供以后使用。然后你可以调用glInvalidateBufferData
来告诉内存可以被释放。
glInvalidateBufferSubData()
同样如此。如果您突然不需要分配给缓冲区的内存的最后一半块,那么现在您的驱动程序知道可以重新分配这块内存。
什么时候应该使用glInvalidateBufferData?
所以回答你的问题。如果你有一个缓冲区,你不再需要内存了。