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

问题描述 投票:0回答:0

将此类视为 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
,以供记录。

c# opentk
© www.soinside.com 2019 - 2024. All rights reserved.