这是一个非常简单的测试程序。当 vsync 被禁用时,该程序以 100FPS 运行,几乎占用了 0% 的 CPU。当我启用 vsync 时,我得到 60FPS 和 25%(100% 的一个核心在 4 核系统上)的 CPU 利用率。这是使用 Nvidia GPU。在线搜索导致我建议在 Nvidia 控制面板中禁用“多线程优化”。这确实降低了 CPU 利用率,但仅降低了 10%。此外,如果我在 SwapBuffers 之后删除睡眠调用,即使禁用了多线程优化,我也会再次获得 25% 的利用率。任何人都可以对此有所了解吗?难道我做错了什么?Nvidia 的 OpenGL 实现是否存在无可救药的缺陷?
#include <GLFW/glfw3.h>
#include <thread>
#include <cstdlib>
#include <cstdio>
int main(int argc, char *argv[])
{
if(!glfwInit())
exit(EXIT_FAILURE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Vsync Test", nullptr, nullptr);
if(!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
#ifdef USE_VSYNC
glfwSwapInterval(1);
#else
glfwSwapInterval(0);
#endif
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
double lastTime = glfwGetTime();
double nbFrames = 0;
while(!glfwWindowShouldClose(window))
{
double currentTime = glfwGetTime();
nbFrames++;
if (currentTime - lastTime >= 1.0)
{
char cbuffer[50];
snprintf(cbuffer, sizeof(cbuffer), "OpenGL Vsync Test [%.1f fps, %.3f ms]", nbFrames, 1000.0 / nbFrames);
glfwSetWindowTitle(window, cbuffer);
nbFrames = 0;
lastTime++;
}
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
//limit to 100FPS for when vsync is disabled
std::chrono::milliseconds dura(10);
std::this_thread::sleep_for(dura);
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}