c# - 垃圾收集不适用于 OpenTK,或者我是否缺少足够的处理?

标签 c# opentk

考虑将此类用于 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 ,供记录。

最佳答案

如果您有终结器~My3DModel(),这并不意味着该对象将立即被删除。

此外,最终确定尚未确定,这会在释放内存的时间方面造成一些缺陷。

请考虑改用IDisposable

关于c# - 垃圾收集不适用于 OpenTK,或者我是否缺少足够的处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76798333/

相关文章:

c# - Crystal Reports 可以缩放以适合页面吗

c# - 使用内连接和左外连接将 6 个表连接在一起 - LINQ

c# - 如何在三个 IEnumerables 上使用 Zip

opengl - 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

c# - GL 项目无法正常工作

c# - OpenTK 纹理仅在未绑定(bind)时才有效

c# - Windows 与 Linux 上的图形库

dll - OpenTK 错误,无法加载 DLL 'libGLES.dll

c# - SaveFileDialog问题(C#)(VS2008)

c# - 如果参数是 T,转换为 T 会失败吗?