首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何尽可能快地交换缓冲区

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

Stack Overflow用户
提问于 2017-04-24 08:54:21
回答 1查看 1.2K关注 0票数 0

我正在从事OpenGL项目,我正在使用VS15 C++。

我的代码:

代码语言:javascript
运行
复制
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的值。

如何在最短的时间内显示红色屏幕?还要多长时间?

EN

回答 1

Stack Overflow用户

发布于 2017-04-24 14:56:33

您的方法无法工作--所有OpenGL函数(包括SwapBuffers )都可以在代码片段完成后很长时间在GPU上排队和执行。

相反,确保VSync是打开的(通常是默认的),并执行所有这些命令,而不需要在中间睡觉:

代码语言:javascript
运行
复制
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侧的时间。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43583698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档