Как правильно очищать OpenGL буферы?

У меня проблемы с использованием памяти в классе Mesh. Если я пересоздаю обьект класса каждый фрейм, быстро растет потребление оперативной памяти.

Работаю с ноутбука, поэтому видеопамять выделяется из оперативной.

Я предполагаю, что проблема вызвана тем, что я не очищаю OpenGL буферы при удалении обьекта Mesh.

Я пытался сделать это в деструкторе класса, но при каждом вызове OpenGL функции в нем окно просто закрывается. Как правильно очищать буферы, чтобы это работало автоматически при удалении обьекта Mesh?

Пробовал использовать IDisposable, результат тот же

using System;
using System.IO;
using OpenTK.Graphics.OpenGL4;

namespace VoxelGame.Graphics
{
    public class Mesh
    {
        public readonly float[] vertices;
        public readonly uint[] indices;

        public int EBO;
        public int VBO;
        public int VAO;

        public bool buffersLoaded = false;

        public Mesh(float[] vertices, uint[] indices)
        {
            this.vertices = vertices;
            this.indices = indices;
        }
        ~Mesh()
        {
            GL.BindVertexArray(0);
            if (buffersLoaded)
            {
                GL.DeleteVertexArray(VAO);
                GL.DeleteBuffer(VBO);
                GL.DeleteBuffer(EBO);
            }
        }

        public void draw()
        {
            if (!buffersLoaded) loadBuffers();
            GL.BindVertexArray(VAO);
            GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);
            GL.BindVertexArray(0);
        }

        private void loadBuffers()
        {
            VAO = GL.GenVertexArray();
            GL.BindVertexArray(VAO);

            VBO = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
            GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);

            EBO = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
            GL.BufferData(BufferTarget.ElementArrayBuffer, indices.Length * sizeof(uint), indices, BufferUsageHint.StaticDraw);

            var vertexLocation = 0;
            GL.EnableVertexAttribArray(vertexLocation);
            GL.VertexAttribPointer(vertexLocation, 3, VertexAttribPointerType.Float, false, 5 * sizeof(float), 0);

            var texCoordLocation = 1;
            GL.EnableVertexAttribArray(texCoordLocation);
            GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
            buffersLoaded = true;
        }
    }
}

Ответы (0 шт):