顶点缓冲对象 (删除流程) OpenGL

3

我什么时候应该调用glDeleteBuffersARB?应用程序结束时应该这样做吗?我能否自动化删除顶点缓冲对象的过程?例如,类似于smart_ptr的东西。


删除不再使用的内容。 - nullpotent
嗯,我可以为VBO创建一个带有析构函数的类来删除VBO对象吗?然后创建智能指针对象以自动化所有操作? - fex
1个回答

9
永远不要调用glDeleteBuffersARB。缓冲区对象已经成为核心GL功能超过十年了;如果你仍在使用ARB后缀的扩展函数,请停止。如果你遵循使用它们的教程,请再次停止;它显然太旧而无用。
现在,什么时候应该使用glDeleteBuffers?当您完成操作对象时,即没有更多用途并想要摆脱它时,应使用它,与普通C++对象的delete一样。
您可以创建一个VBO类,其中包含将删除VBO对象的析构函数,然后创建对象作为智能指针来自动管理一切。但这不会带来太多好处。此外,您有非常真实的风险等待直到删除对象时为时已晚。
在创建OpenGL上下文(并使之当前)之前或在GL上下文不是当前上下文时(例如,在销毁GL上下文后),调用任何OpenGL函数都是非法的。尝试这样做并不好。
如果使用shared_ptr来管理这些资源,则理论上可能使它们超过实际的OpenGL上下文的生存期。那是不好的。个人而言,我更喜欢更严格的管理方案,将GL对象的生命周期与上下文的生命周期紧密联系起来。

1
你可以将上下文封装在一个独立的类实例中,并将shared_ptr或weak_ptr作为初始化参数传递给任何OpenGL对象类。实际上,我认为为了正确地将OpenGL封装到C++类中,OpenGL对象类实例应该只由上下文类的工厂函数返回。 - datenwolf
我仍然认为shared_ptr对于OpenGL资源管理是很好的。它仍然可以用于'间接'地管理它们-这样删除资源包装类就不会调用glDelete*,而是将此资源标记为“已释放”,因此它们可以在适当时候(例如,当尊重的上下文变为当前时)被glDeleted。即使这些资源没有被提到的包装类标记为“空闲”,上下文管理器类也可以在上下文被销毁之前删除(glDelete)这些资源。 - kerim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接