大约一分钟后,我的OpenGL应用程序死机了,然后“D3D12:删除设备,”打印到控制台

7hiiyaii  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(246)

我正在开发一个简单的基于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函数中,为着色器提供某些参数,并绑定和绘制缓冲区。

你有什么办法解决这个问题吗?谢谢!

s4n0splo

s4n0splo1#

我想通了问题所在。我每次都调用BuildBuffeer,但从未删除以前创建的缓冲区。这导致我的电脑内存不足(OpenGL一度使用了8 GB的内存……)。通过简单的检查,我能够使用glDeleteVertexArrays函数删除缓冲区。

相关问题