【问题标题】:usage of glbufferdata in OpenGLOpenGL中glbufferdata的使用
【发布时间】:2018-03-26 01:53:33
【问题描述】:

假设我将 vbo id 存储在一个 int 中,并且我想调整该缓冲区的大小;我该怎么办?
第一种选择:绑定缓冲区后使用glbufferdata函数。
第二个选择:.use gldeletebuffers 然后重新生成缓冲区并在绑定缓冲区后使用 glbufferdata 函数。

所以我的问题是glbufferdata 自己释放缓冲区还是没有?

【问题讨论】:

    标签: c++ opengl buffer opengl-3 gpu


    【解决方案1】:

    只需致电glBufferDataglDeleteBuffers / glGenBuffers 调用是不必要的。

    这样想:glBufferData 创建一个新缓冲区。 glGenBuffers 函数为缓冲区创建一个新的 name(整数)。

    您不需要自己解除分配缓冲区……并不是说 OpenGL 为您提供了这样做的方法。只要您不持有对它的引用,您的 OpenGL 实现就会在使用缓冲区中的数据完成后为您执行此操作。

    【讨论】:

    • 那么假设我从来没有在程序结束时调用过函数glDeleteBuffers,OpenGL会为我释放资源吗?
    • 是的,opengl 驱动程序将在驱动程序端声明内存并清理 gpu 内存。
    • 好的,但是当我编写 OpenGL 代码时,我正在为我编写的每个块调试代码(运行应用程序)(我没有取消分配缓冲区),但我注意到我的计算机速度变慢每次跑步后一点点,你怎么解释这个?如果不是用来清理内存,OpenGL开发者为什么要添加这样的功能?
    • "如果不用于清理内存,OpenGL 开发人员为什么要添加这样的功能?"因为该功能用于其他用途。您的 OpenGL 实现会自动清理内存,glDeleteBuffers 函数会删除对缓冲区的引用
    • glBufferSubData有什么意见吗? (我问是因为this。)
    【解决方案2】:

    OpenGL 重新分配不同大小的缓冲区对象的存储是否合法?是的。这是个好主意吗?好吧,考虑一下。

    OpenGL 有一种新的(ish)方法来为缓冲区分配存储空间:glBufferStorage。它分配“不可变”的存储。之所以这样称呼,是因为一旦分配,您不能重新分配它。

    如果 OpenGL 背后的人认为重新分配缓冲区对象的存储是个好主意,他们就不会添加这种不可变的缓冲区分配方法。

    【讨论】:

    • 您能解释一下为什么这不是一个好主意吗?并考虑是否在某些情况下我必须调整缓冲区大小以添加更多数据,在不导致内存泄漏的情况下,最好的方法是什么?
    • @O-BL:如果某物的制造者给了你第二种方法来做一件没有第一种方法的所有功能的事情,这很好地表明了它缺乏的功能可能是坏主意。
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2020-11-01
    • 2014-08-04
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多