Почему OpenGL в C++ вызывает утечку памяти? [закрыто]C++

Программы на C++. Форум разработчиков
Anonymous
Почему OpenGL в C++ вызывает утечку памяти? [закрыто]

Сообщение Anonymous »

В настоящее время я разрабатываю собственный клон Minecraft на C++ для изучения OpenGL, но столкнулся с неожиданной утечкой памяти в своем коде при загрузке данных в графический процессор. Я заверил, что UploadData() вызывается только один раз для каждой сетки, и когда я не вызываю UploadData(), утечка памяти устраняется. Но тогда, конечно, данные сетки не загружаются в графический процессор.
Мой ноутбук использует графику Intel(R) UHD Graphics с общей памятью, но я не думаю, что это проблема. потому что я тестировал его на своем стационарном ПК с RTX 3060 и получил те же результаты.
Вот мои функции:

Код: Выделить всё

void Mesh::LinkAttrib(GLuint layout, GLuint numComponents, GLenum type, GLsizeiptr stride, void* offset, bool integer)
{
if (integer) glVertexAttribIPointer(layout, numComponents, type, stride, offset);
else glVertexAttribPointer(layout, numComponents, type, GL_FALSE, stride, offset);
glEnableVertexAttribArray(layout);
}

Mesh::~Mesh()
{
// If nIndices is less than 0, we know that we have not uploaded any arrays.
if (nIndices < 0) return;

glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
}

void Mesh::UploadData()
{
// Delete previous data
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);

// Generate new arrays
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);

LinkAttrib(0, 3, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(0 * sizeof(glm::u8)), true);
LinkAttrib(1, 1, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(3 * sizeof(glm::u8)), true);
LinkAttrib(2, 2, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(4 * sizeof(glm::u8)), true);
LinkAttrib(3, 1, GL_UNSIGNED_SHORT, sizeof(Vertex), (void*)(6 * sizeof(glm::u8)), true);

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

nIndices = indices.size();
}
Если вам понадобится дополнительная информация о моем проекте, я ее предоставлю.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-memory

Вернуться в «C++»