【发布时间】:2017-04-24 08:54:21
【问题描述】:
我正在开发 OpenGL 项目,我正在使用 VS15 C++。
我的代码:
timeBeginPeriod(1);
//start timer to measure the gap
GetSystemTime(&timeMiddle);
timeMiddleLong = (timeMiddle.wMinute * 60 * 1000) +
(timeMiddle.wSecond * 1000) + timeMiddle.wMilliseconds;
myfile << "middle time = " << timeMiddleLong << endl;
glClearColor(1.0f, 0, 0, 1.0f);//red screen
//update screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(hdc);
glfwPollEvents();
Sleep(1); //sleep for ~2ms
glClearColor(0, 0, 0, 0);//invisiable screen
//update screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(hdc);
glfwPollEvents();
//stop timer and print to file the result
GetSystemTime(&timeEnd);
timeEndLong = (timeEnd.wMinute * 60 * 1000) + (timeEnd.wSecond * 1000) +
timeEnd.wMilliseconds;
myfile << "gap = " << timeEndLong - timeMiddleLong << endl;
ReleaseDC(hWnd, hdc);
我想要什么?
尽快在红屏和隐形屏之间切换。
我知道什么?
我的显示器是 60Hz,响应时间约为 7 毫秒,这意味着如果显示器在红屏出现时准确刷新,它将在那里停留 13 毫秒。
我得到了什么?
通过拍摄屏幕,我注意到红色屏幕停留了约 32 毫秒,这对我来说太长了。
此外,间隙在大多数时间显示约 2 毫秒的值,有时 5-9 毫秒
如何在最短的时间内显示红屏?会持续多久?
【问题讨论】:
-
windows下sleep是不可靠的,它会一直sleep到下一个schedule,一般是20ms左右。你在移除睡眠线时遇到同样的问题吗?
-
@Adrian Maire 之前调用
timeBeginPeriod应将计时器分辨率设置为 1 毫秒,因此Sleep应该工作得相当准确。 -
@AdrianMaire 我提到睡眠准确。
-
@VTT:正确,但是,这也是不可靠的:如果处理器忙,则处理器不会重新调度,因此 1ms 仅在 CPU 忙之前有效。之后,回到 20 毫秒。
-
@AdrianMaire 是的,但根据我的计时器,睡眠工作正常。