這是一個非常簡單的測試程序。當禁用vsync時,該程序以100FPS運行,幾乎佔用CPU的0%。當我啓用vsync時,我得到60FPS和25%(4核系統上的一個核心的100%)CPU利用率。這是使用Nvidia GPU。在線搜索引導我建議在Nvidia控制面板中禁用「多線程優化」。這確實會降低CPU使用率,但只能降低到10%。此外,如果我在SwapBuffers之後刪除呼叫,即使禁用多線程優化,我也會再次獲得25%的使用率。任何人都可以對此有所瞭解嗎?難道我做錯了什麼? Nvidia的OpenGL實現只是無可救藥的缺陷?使用vsync(OpenGL)時CPU利用率達到100%
#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);
}
不是很確定,但肯定有幫助。我找到了這個帖子(http://forum.openscenegraph.org/viewtopic.php?t=3653#18283),其中有人從驅動程序開發人員那裏得到了一些反饋。根據他們的迴應,司機屈服。爲了測試我自己,我加載了我選擇的3D渲染套件,並在我運行OpenGL程序的同時,最大化了所有四個CPU內核。其CPU利用率從25%降至0%。它似乎雖然最大化了一個核心,但它實際上並不*它。 –
@Chis_F謝謝,這是很好的知道(也有些鼓舞)。但我主要關心CPU佔用率高的問題,它不利於筆記本電腦進入低功耗模式;我不確定用法是否「人爲」會在那裏產生差異。也許移動驅動程序設置不同 - 我沒有一個測試。 –
這當然是一個問題。就功耗而言,屈服不會產生任何影響,但也許他們的移動GPU的驅動程序運行方式不同。 –