将此类视为 3D 模型。我可以有该类的多个实例。我可以在场景中添加和删除 3D 模型。
class My3DModel
{
int VertexArrayObject;
int VertexBufferObject;
int ShaderProgram;
int UniformLocationColor;
public My3DModel()
{
VertexArrayObject = GL.GenVertexArray();
VertexBufferObject = GL.GenBuffer();
ShaderProgram = BuildShaders();
UniformLocationColor = GL.GetUniformLocation(ShaderProgram, "uniColor");
}
~My3DModel()
{
// [1] In destructor, I'm deleting the VAO, VBO, and Shader program.
// This is all I'm using, no textures, no extra buffer objects used.
GL.DeleteBuffer(VertexBufferObject);
GL.DeleteVertexArray(VertexArrayObject);
GL.DeleteProgram(ShaderProgram);
}
// Render function, etc. Shaders and rendering work fine
}
我如何构建我的着色器:
int BuildShaders()
{
int iPgm = GL.CreateProgram();
int VertexShader = CreateAndCompileVS();
int FragmentShader = CreateAndCompileFS();
GL.AttachShader(iPgm, VertexShader);
GL.AttachShader(iPgm, FragmentShader);
GL.LinkProgram(iPgm);
// [2] After linking program, we detach the two shaders and delete them
GL.DetachShader(iPgm, VertexShader);
GL.DeleteShader(VertexShader);
GL.DetachShader(iPgm, FragmentShader);
GL.DeleteShader(FragmentShader);
return iPgm;
}
为了测试内存泄漏,我使用了一个循环,在其中创建该类的新实例,渲染它,然后立即将其分配为 null,但是我的 RAM 使用量增加了。只有这样做时才会发生这种情况,这就是我得出这个结论的原因。这可能不是 OpenTK 的特定情况,但我目前确信确实如此,因为当我从类的 Buffer 对象和着色器中剥离类并定期使用其成员时,我不会遇到内存问题。
void RenderLoop()
{
My3DModel temp_model = new My3DModel();
// Note that I'm not pushing any data to the vertex buffer, I'm only calling the render func for the sake of it. Despite this, RAM still goes up!
temp_model.Render();
temp_model = null; // Even without doing this, my RAM goes up.
}
到底是什么导致了这个问题,如果我遗漏了什么,我在析构函数中遗漏了什么?
我正在使用
OpenTK 3.3.1
,这是 WinForms using .NET Framework 4.7.2
最新支持的 OpenTK,并且我不打算将我的项目迁移到 WPF
,以供记录。