使用 OpenGL 绘制更多对象时性能降低

Performance reduce when draw more object with OpenGL

我正在尝试使用 OpenGL 和 C++ 编写 FPS,移动视点时第一个对象(带纹理的立方体)是正常的,但是当我尝试绘制静态十字准线时,程序开始落后。这是主循环伪代码:

while (running) {
    glBufferData(GL_ARRAY_BUFFER, cubeVertices.size(), GL_STATIC_DRAW);
    textureLoad("sample.png");
    enableAttribute();

    glm::mat4 proj = glm::perspective(glm::radians(45.0), 600 / 600.0, 1.0, 10.0);
    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "proj"), 1, GL_FALSE, glm::value_ptr(proj));
    glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraLook, glm::vec3(0, 0, 1));
    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    glBufferData(GL_ARRAY_BUFFER, crossVertices.size(), 0, GL_STATIC_DRAW);
    textureLoad("crosshair.png");
    enableAttribute();

    proj = glm::perspective(glm::radians(45.0), 600 / 600.0, 1.0, 10.0);
    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "proj"), 1, GL_FALSE, glm::value_ptr(proj));

    view = glm::lookAt(glm::vec3(0, 0, 2), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
    glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    app.display();
}

我猜 glBufferData 是原因。那么有没有不同的方法可以让它更快,即使有多个对象?

有些 OpenGL 函数调用不适合 main-loop。 glBufferData 就是其中之一。它的目的是向 GPU 上传一些数据缓冲区。这是一项代价高昂的手术。上传数据缓冲区后,您可以在 GPU 上多次 re-use。

因此,您应该在主循环之外创建并填充新缓冲区:glGenBuffers, glBindBuffer, glBufferData

然后,当您准备好准备多维数据集时,在主循环中,您只需使用 glBindBuffer re-bind 即可。这应该会大大提高应用程序的性能。