使用 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 即可。这应该会大大提高应用程序的性能。
我正在尝试使用 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 即可。这应该会大大提高应用程序的性能。