Qt 5:禁用垂直同步
Qt 5: disable vsync
我想从 QOpenGLContext 格式中禁用 vsync
以便于集成第三方渲染系统。
QSurfaceFormat::swapInterval
似乎是Qt中唯一相关的参数。
我尝试了几种方法来实现它,但即使我在早期阶段(在 QMainWindow
构造之前)设置了 QSurfaceFormat::swapInterval(0)
,然后 QOpenGLContext::create()
调用正在恢复它.
// at application startup, before creating the Qt windows (or in MyQWindow constructor)
QSurfaceFormat format;
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
format.setRedBufferSize(8);
format.setGreenBufferSize(8);
format.setBlueBufferSize(8);
format.setAlphaBufferSize(8);
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSwapInterval(0);
QSurfaceFormat::setDefaultFormat(format);
QMainWindow *w = new QMainWindow;
w->show();
// at QWindow with QOpenGLContext creation, at the first frame update (or at the constructor)
MyQWindow::initialization() {
WbOpenGLContext *c = new WbOpenGLContext(this);
c->setFormat(requestedFormat());
qDebug() << "requested format:" << c->format();
c->create();
qDebug() << "actual format:" << c->format();
}
# output
requested format: QSurfaceFormat(
version 2.0,
options QFlags(),
depthBufferSize 24,
redBufferSize 8,
greenBufferSize 8,
blueBufferSize 8,
alphaBufferSize 8,
stencilBufferSize 8,
samples -1,
swapBehavior 2,
swapInterval 0,
profile 0
)
context format: QSurfaceFormat(
version 3.0,
options QFlags(0x4),
depthBufferSize 24,
redBufferSize 8,
greenBufferSize 8,
blueBufferSize 8,
alphaBufferSize 8,
stencilBufferSize 8,
samples 0,
swapBehavior 2,
swapInterval 1, # Not what I asked
profile 0
)
有没有办法强制禁用垂直同步?
正如 peppe 在问题的评论中所建议的,不幸的是,QOpenGLContext 实例在创建后的 QSurfaceFormat 格式与内部使用的实际格式不匹配。
这意味着我实现的代码可能有效,但第二个调试语句显示错误的值。
我想从 QOpenGLContext 格式中禁用 vsync
以便于集成第三方渲染系统。
QSurfaceFormat::swapInterval
似乎是Qt中唯一相关的参数。
我尝试了几种方法来实现它,但即使我在早期阶段(在 QMainWindow
构造之前)设置了 QSurfaceFormat::swapInterval(0)
,然后 QOpenGLContext::create()
调用正在恢复它.
// at application startup, before creating the Qt windows (or in MyQWindow constructor)
QSurfaceFormat format;
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
format.setRedBufferSize(8);
format.setGreenBufferSize(8);
format.setBlueBufferSize(8);
format.setAlphaBufferSize(8);
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSwapInterval(0);
QSurfaceFormat::setDefaultFormat(format);
QMainWindow *w = new QMainWindow;
w->show();
// at QWindow with QOpenGLContext creation, at the first frame update (or at the constructor)
MyQWindow::initialization() {
WbOpenGLContext *c = new WbOpenGLContext(this);
c->setFormat(requestedFormat());
qDebug() << "requested format:" << c->format();
c->create();
qDebug() << "actual format:" << c->format();
}
# output
requested format: QSurfaceFormat(
version 2.0,
options QFlags(),
depthBufferSize 24,
redBufferSize 8,
greenBufferSize 8,
blueBufferSize 8,
alphaBufferSize 8,
stencilBufferSize 8,
samples -1,
swapBehavior 2,
swapInterval 0,
profile 0
)
context format: QSurfaceFormat(
version 3.0,
options QFlags(0x4),
depthBufferSize 24,
redBufferSize 8,
greenBufferSize 8,
blueBufferSize 8,
alphaBufferSize 8,
stencilBufferSize 8,
samples 0,
swapBehavior 2,
swapInterval 1, # Not what I asked
profile 0
)
有没有办法强制禁用垂直同步?
正如 peppe 在问题的评论中所建议的,不幸的是,QOpenGLContext 实例在创建后的 QSurfaceFormat 格式与内部使用的实际格式不匹配。
这意味着我实现的代码可能有效,但第二个调试语句显示错误的值。