【问题标题】:OpenGL: how to unbind and delete buffers properlyOpenGL:如何正确解除绑定和删除缓冲区
【发布时间】:2013-08-13 13:25:44
【问题描述】:

我正在学习 opengl 并编写了一个简单的程序,该程序使用缓冲区对象(颜色、位置、法线、元素索引)来绘制如下所示的形状。即使删除和解除绑定,GPU 监控程序显示每次按钮单击后内存使用量都在增加。仅当我关闭应用程序时才会释放内存。如果我多次单击按钮,GPU ram 会填充到 2GB 并开始溢出到主机 ram。如何正确释放资源/缓冲区?

程序流程如下:

 When I click a button, the below program is executed:

 glControl1.MakeCurrent();
 GL.GenBuffers(4,buf)
 GL.BindBuffer(BufferTarget.ArrayBuffer,buf[0])
 GL.BufferData(BufferTarget.ArrayBuffer,......)

 same for buf[1]   buf[2] and buf[3](this one ElementArrayBuffer)
 Console.WriteLine(GL.GetError()); // no error 
 GL.Finish();

 [iteration loop]
 glControl1.MakeCurrent();
 GL.BindBuffer(BufferTarget.ArrayBuffer,buf[0])
 GL.ColorBuffer(....)

 GL.BindBuffer(BufferTarget.ArrayBuffer,buf[1])
 GL.VertexBuffer(....)

 GL.BindBuffer(BufferTarget.ArrayBuffer,buf[2])
 GL.NormalBuffer(....)

 GL.BindBuffer(BufferTarget.ElementArrayBuffer,buf[3])

 GL.EnableClientStates(.....)
 GL.DrawElements(.....) //draws the thing
 GL.DisableClientStates(.....)

 GL.BindBuffer(BufferTarget.ElementArrayBuffer,0) //is this unbinding?
 GL.BindBuffer(BufferTarget.ArrayBuffer,0)
 GL.BindBuffer(BufferTarget.ArrayBuffer,0)
 GL.BindBuffer(BufferTarget.ArrayBuffer,0) 
 GL.Finish();
 [loop end]

 //deleting buffers
 glControl1.MakeCurrent()
 GL.DeleteBuffers(4,buf)
 Console.WriteLine(GL.GetError()); // no error comes
 GL.Finish();

【问题讨论】:

    标签: opengl memory-management opentk


    【解决方案1】:

    据我所知,您在单击时生成并填充了一个新缓冲区,而不是删除它们。最后,您只删除最后创建的 4 个缓冲区。

    当您调用glGenBuffers 时,它只会生成一个新缓冲区并返回句柄,它不会检测给定句柄是否已在使用或类似的东西。因此,当您提供与以前相同的句柄时,它会生成新的句柄,覆盖您当前正在跟踪的句柄,从而有效地删除对旧缓冲区的任何引用。但它不会释放这些缓冲区。因此,您会不断填充更多内存。

    现在,如果您只想将新数据写入现有缓冲区,您只需调用glBufferSubData。如果您还想调整缓冲区大小,请调用glBufferData,它会删除以前的数据。但是您不必生成新的缓冲区,因为您已经有了缓冲区的句柄。

    【讨论】:

    • 那么genBuffers+deleteBuffers和C++的new+delete不一样?
    • 你可以认为它们是一样的。但即使在 C++ 中,您也必须先删除,然后再调用 new。为已经拥有动态分配内存的变量分配一个新值,不会释放以前的内存,就像 glGenBuffers 不会释放以前的缓冲区一样。
    • 但是在 button1_click 方法的末尾有一个deletebuffers 在下一次点击事件之前执行。
    • “内存只有在我关闭应用的时候才会释放”,看起来有点矛盾?
    • 我是说内存使用量没有减少 :)
    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多