我正在開發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。
我得到了什麼?
通過拍攝屏幕,我注意到紅色屏幕停留時間爲〜32ms,這對我來說太長了。
此外,間隙在大多數時間和有時5-9ms顯示值爲〜2ms
如何顯示最短時間的紅色屏幕?這將是多久?
睡眠在Windows下是不可靠的,它會睡眠到下一個時間表,通常約20ms。你是否在去除睡眠線方面遇到同樣的問題? –
@Adrian Maire之前調用'timeBeginPeriod'應該將計時器分辨率設置爲1 ms,所以'睡眠'應該工作得相當準確。 – VTT
@AdrianMaire我提到睡眠準確。 – Hido