gpt4 book ai didi

c++ - 如何尽快交换缓冲区

转载 作者:行者123 更新时间:2023-11-27 23:54:33 25 4
gpt4 key购买 nike


我正在从事 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 毫秒

如何让红屏时间最短?会持续多久?

最佳答案

您的方法行不通——所有 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.7 毫秒)。

由于 OpenGL 的异步特性,您的时间测量也不明智。你应该使用 OpenGL Time Query Objects测量 GPU 端的时间。

关于c++ - 如何尽快交换缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43583698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com