我正在从事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);
我想要什么?
以尽可能快的速度在红色屏幕和不可见屏幕之间切换。
我知道什么?
我的显示器是60赫兹,响应时间~7ms,这意味着,如果显示器刷新准确的时候,红色屏幕上升,它将停留在那里13毫秒。
我得到了什么?
通过拍摄屏幕,我注意到红色屏幕停留了32毫秒,这对我来说太长了。
此外,间隙在大多数时间和5-9 9ms的时间内显示出~2ms的值。
如何在最短的时间内显示红色屏幕?还要多长时间?
发布于 2017-04-24 14:56:33
您的方法无法工作--所有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);
这将闪现一个红色屏幕的确切一帧(16.7ms,一个60赫兹显示器)。
由于OpenGL的异步特性,您的时间测量也是不明智的。您应该使用OpenGL时间查询对象来测量GPU侧的时间。
https://stackoverflow.com/questions/43583698
复制相似问题