我试图强迫GLFW 3.0停止对我的CPU的破坏,然后再将其作为促进学习API的框架前进.我以http://www.glfw.org/documentation.html为例,开始寻找限制它的方法.
目前,我要做的是:
#include <iostream>
#include <chrono>
#include <thread>
#include <GLFW/glfw3.h>
int main(void)
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds milliseconds;
Clock::time_point currentTime, newTime;
milliseconds frameTime;
GLFWwindow* window;
if (!glfwInit())
return -1;
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window))
{
currentTime = Clock::now();
glfwSwapBuffers(window);
glfwPollEvents();
newTime = Clock::now();
frameTime = std::chrono::duration_cast<milliseconds>(newTime - currentTime);
if(frameTime.count() < 16)
std::this_thread::sleep_for(milliseconds(16 - frameTime.count()));
std::cout << "Frame time: " << frameTime.count() << "ms" << std::endl;
}
glfwTerminate();
return 0;
}
由于GLFW已经将自身限制为60fps,因此我认为这可能有效.而且,的确,它将主循环运行时的CPU使用率降低了一半.这可能已经足够了,但是我真正想知道的是:
一个同轴电缆GLFW如何等待信号并释放CPU,而不是仅仅在while循环中烘烤轮胎?我无法想象它完全缺少该功能.
解决方法:
一般来说,您不需要.通常,您的程序实际上在那段时间做了一些事情.如果您无事可做,那么您会花一些时间进行其他流程.如果没有其他进程可运行,则只需吞下它,直到准备就绪即可.
渲染器通常会尝试尽可能快地渲染,因为它们通常将无法超越GPU.大多数游戏就是这样工作的.他们试图尽快执行.如果CPU的速度比预期的要快得多,则它们可能具有计时器来产生一些产量,但通常,它们只是让渲染器运行.
同样,期望sleep_for
实际上以毫秒(16-frameTime.count())时间返回也是不合理的.这只是一个最低的估计,而不是要求.
最好改用yield
.