我正在开发一个简单的基于OpenGL(体素)的引擎,并在每帧中对一些顶点和缓冲区数据执行大量更新。运行大约一分钟后,屏幕冻结,并将D3D12: Removing Device.
打印到控制台。
引擎相当大,但我将在下面提供一些重要的sudo代码。
# include "sim.hpp"
int main()
{
Engine *engine = new Engine();
do
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
engine->tick(voxelData);
glfwSwapBuffers(engine->getWindow());
glfwPollEvents();
} while (glfwGetKey(engine->getWindow(), GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(engine->getWindow()) == 0);
}
以上是我的主要文件。在Engine->tick()中,调用以下代码:
calculateDeltaTime();
camera->update(deltaTime);
world->setVoxelData(voxelData);
renderer->buildBuffer(*world);
renderer->render(*world, *shaderManager, *camera, glm::mat4(1));
最重要的是,在buildBuffer()
中,体素数据是从世界对象获取的,并创建了一系列缓冲区和顶点数组。
void Renderer::buildBuffer(World &world)
{
glGenVertexArrays(1, &_vertexArrayId);
glBindVertexArray(_vertexArrayId);
const GLfloat *vertices = &(world.getVertices()[0]);
const GLfloat *colors = &(world.getColors()[0]);
const GLfloat *normals = &(world.getNormals()[0]);
_numberOfVertices = static_cast<GLsizei>(world.getVertices().size());
GLsizeiptr vertexSize = _numberOfVertices * sizeof(GLfloat);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, vertexSize, vertices, GL_STATIC_DRAW);
GLsizeiptr colorSize = world.getColors().size() * sizeof(GLfloat);
glGenBuffers(1, &_colorBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _colorBuffer);
glBufferData(GL_ARRAY_BUFFER, colorSize, colors, GL_STATIC_DRAW);
GLsizeiptr normalsSize = world.getNormals().size() * sizeof(GLfloat);
glGenBuffers(1, &_normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
glBufferData(GL_ARRAY_BUFFER, normalsSize, normals, GL_STATIC_DRAW);
}
在render
函数中,为着色器提供某些参数,并绑定和绘制缓冲区。
你有什么办法解决这个问题吗?谢谢!
1条答案
按热度按时间s4n0splo1#
我想通了问题所在。我每次都调用BuildBuffeer,但从未删除以前创建的缓冲区。这导致我的电脑内存不足(OpenGL一度使用了8 GB的内存……)。通过简单的检查,我能够使用
glDeleteVertexArrays
函数删除缓冲区。