我正在开发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,响应时间约为7ms,这意味着如果显示器正好在红色屏幕启动时刷新,它将在那里停留13ms。
我得到了什么?
通过拍摄屏幕,我注意到红色屏幕停留了大约32毫秒,这对我来说太长了。
另外,间隙在大多数时间内显示约2毫秒的值,在某些时候显示5-9毫秒左右
如何在最短的时间内显示红色屏幕?它将持续多长时间?
答案 0 :(得分:3)
您的方法不起作用 - 所有OpenGL函数(包括SwapBuffers)都可以在代码片段完成后很久就在GPU上排队并执行。
相反,请确保VSync已启用(通常是默认情况下),并执行所有这些命令而不会在中间休眠:
glClearColor(1.0f, 0, 0, 1.0f);//red screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(hdc);
glClearColor(0, 0, 0, 0); //invisiable screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(hdc);
这将为一帧闪烁一个红色屏幕(60Hz显示器为16.7ms)。
由于OpenGL的异步特性,您的时间测量也不合理。您应该使用OpenGL Time Query Objects来测量GPU端的时间。