为什么 QOpenGLWidget 的 frameSwapped 和 aboutToCompose 信号几乎同时发出?

Why are the frameSwapped and aboutToCompose signals of QOpenGLWidget emitted almost simultaneously?

提问人:qssh 提问时间:4/25/2023 更新时间:4/25/2023 访问量:62

问:

从理论上讲,如果我使用 setSwapInterval(1) 启用垂直同步选项,则这两个信号的发射之间的时间间隔应至少为显示器的刷新周期。然而,在实践中,我发现在我的环境中,这两个信号发出的时刻几乎是同时发出的。为什么会这样?我是否忽略了任何设置选项?这让我觉得好像交换缓冲区的步骤没有发生。

这是我的选择:

QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setVersion(3, 3);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
format.setSwapInterval(1);
QSurfaceFormat::setDefaultFormat(format);
......

质量:5.12.10 Windows10 SDK

C++ qt opengl opengl-3

评论

0赞 Yakov Galka 4/25/2023
为什么你认为它“至少应该是显示器的刷新期”?通过垂直同步,我希望系统能够尽可能地安排交换和合成的时间,以减少延迟。
0赞 Yakov Galka 4/25/2023
哦,你希望你的应用和合成器都与显示器同步吗?我很确定情况并非如此。我不知道血腥的细节,但我希望合成器与显示器同步;但是,你的应用呈现到合成器从中读取的屏幕外缓冲区,而不是监视器,因此它与合成器而不是监视器同步。基本上,实现比你想象的更聪明,以减少那一帧延迟。
0赞 qssh 4/26/2023
实际上,我想计算一帧的实际渲染时间。我看到QT有类似的信号,我从文档中读到的信息使我相信它确实是这样工作的。如果是这样的话,这两个信号之间的时间差似乎是实际的渲染时间。@Yakov加尔卡
0赞 Yakov Galka 4/26/2023
我不认为它会给你任何有意义的衡量标准。你只是对实现假设太多了。若要测量渲染帧所需的时间,应使用 GL_TIME_ELAPSED 查询

答: 暂无答案