什么时候应该使用glInvalidateBufferData?

时间:2017-03-27 01:27:30

标签: opengl asynchronous optimization invalidation

OpenGL为无效缓冲区提供了函数glInvalidateBufferDataglInvalidateBufferSubData

根据OpenGL wiki,这些功能的作用是什么:

  

当缓冲区或其区域无效时,表示该缓冲区的内容现在未定义。

  

这个想法是,通过使缓冲区或其范围无效,实现将简单地获取新的内存块以用于任何后续操作。因此,虽然先前发布的GL命令仍然可以读取缓冲区的原始数据,但您可以使用新值(通过映射或glBufferSubData)填充无效缓冲区,而不会导致隐式同步。

我很难理解何时应该调用此函数以及何时不应该调用此函数。理论上,如果缓冲区的内容将被覆盖,那么如果先前的内容被删除则完全没有区别。这是否意味着应该在每次写入之前调用缓冲区?或者仅在某些情况下?

1 个答案:

答案 0 :(得分:1)

  

理论上,如果缓冲区的内容将被覆盖,那么如果先前的内容被删除则没有任何区别。

你是对的。

实质上,无论您是致电glBufferData还是glInvalidateBufferData,您实现了相同的最终目标。区别在于glBufferData你更多地说“我现在这么多内存”,这反过来意味着旧内存被丢弃了。但是对于glInvalidateBufferData,您说“我不再需要此内存”。 glInvalidateBufferSubData() vs glBufferSubData()以及所有其他glInvalidate*()函数也是如此。

这里的关键是,如果你有一个缓冲区,你现在不再需要它了,但你保留了句柄供以后使用。然后你可以调用glInvalidateBufferData来告诉内存可以被释放。

glInvalidateBufferSubData()同样如此。如果您突然不需要分配给缓冲区的内存的最后一半块,那么现在您的驱动程序知道可以重新分配这块内存。

  

什么时候应该使用glInvalidateBufferData?

所以回答你的问题。如果你有一个缓冲区,你不再需要内存了。