OpenGL:如何正确解除绑定和删除缓冲区

OpenGL:如何正确解除绑定和删除缓冲区,opengl,memory-management,opentk,Opengl,Memory Management,Opentk,我正在学习opengl,并编写了一个简单的程序,使用缓冲区对象(颜色、位置、法线、元素索引)绘制如下形状。即使在删除和解除绑定的情况下,GPU监视器程序也会在每次单击按钮后显示内存使用量的增加。只有在我关闭应用程序时才会释放内存。若我多次单击该按钮,GPU ram将填充到2GB,并开始溢出到主机ram。如何正确释放资源/缓冲区 程序流程如下所示: When I click a button, the below program is executed: glControl1.MakeCu

我正在学习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();

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

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


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

那么,GeBuffs+DeleTeBuffes和NeX+C++的删除不一样吗?你可以考虑它们。但即使在C++中,在重新调用之前,必须先删除。将新值分配给已保存动态分配内存的变量不会取消分配以前的内存,这与glGenBuffers不会取消分配以前的缓冲区的意义相同。但是在按钮1\u click方法的末尾有一个
deletebuffers
,该方法在下一次单击事件之前执行。“只有当我关闭应用程序时才会释放内存”,这似乎有点矛盾?我是说内存使用量没有减少:)