Как правильно очищать 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;
}
}
}