如何尽可能快地交换缓冲区

时间:2017-04-24 08:54:21

标签: c++ opengl


我正在开发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毫秒左右
如何在最短的时间内显示红色屏幕?它将持续多长时间?

1 个答案:

答案 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端的时间。