因为我认为这是假设分配缓冲区,如果你调用它两次,旧的是否被删除,或是否有内存泄漏?
我正在尝试根据需要决定频繁更改缓冲区大小的最佳选项。是使用glBufferData的最佳选择吗?我想是的,只要没有泄漏。
答案 0 :(得分:13)
OGL文档说: “glBufferData创建并初始化一个新的数据存储。任何绑定到目标缓冲区的预先存在的数据存储都将被删除。” 请参阅:http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml
因此,多次调用glBufferData时不会发生内存泄漏。 当然,零298是正确的,你必须调用glDeleteBuffer来最终释放为目标分配的内存。
答案 1 :(得分:5)
glBufferData (...)
将创建一个新的数据存储,并且在使用旧数据存储的管道中排队的任何命令都是由GL保护的 隐式 。也就是说,在完成使用VBO旧数据的所有命令之前,不允许GL删除旧数据存储。这是一个重要的概念,因为它对于称为"buffer orphaning"的技术很有用,在发送新数据时重新分配VBO,以便在更新当前VBO中的数据时减少GL的同步开销用于绘画。
没有什么会泄漏,并且在某些特殊情况下(例如缓冲流),为正在使用的VBO重新分配数据存储可能比更新它更有效。在较新版本的GL中映射和使缓冲区范围无效的能力在很大程度上减轻了这种优化策略,但它仍然需要考虑。
答案 2 :(得分:2)
致电glDeleteBuffers
glDeleteBuffers API
但是,我真的不建议经常更改缓冲区的大小。相反,如果您必须更改缓冲区中的数据,只需分配一个大缓冲区,将其与您需要的数据打包在一起,并记录您可以安全地在缓冲区中取消引用的内容,并仅使用缓冲区中的那些部分。
不断分配和删除OpenGL缓冲区很慢。我认为这比仅仅重新缓冲数据慢得多,因为你必须从GPU到CPU的往返行程为你提供一个指向GPU上缓冲区的新指针,然后你必须将数据发送回GPU和那么你必须发送另一个往返调用来删除缓冲区。那3次旅行!
我的意思是,无论何时在C ++中分配数组,每次填充数组时,您是否经常new
和delete
数组?还是回收它?