3

vsyncサードパーティのレンダリング システムの統合を容易にするために、QOpenGLContext 形式を無効にしたいと考えています。

QSurfaceFormat::swapIntervalQtで唯一の関連パラメータのようです。

これを実装するためにいくつかの方法を試しQSurfaceFormat::swapInterval(0)ましたが、初期段階 (QMainWindow構築前) に設定しても、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
)

vsync を強制的に無効にする方法はありますか?

4

1 に答える 1

3

質問のコメントで peppe が示唆しているように、作成後の QOpenGLContext インスタンスの QSurfaceFormat 形式は、残念ながら内部で使用される実際の形式と一致しません。

これは、実装したコードはおそらく機能していることを意味しますが、2 番目のデバッグ ステートメントには間違った値が表示されます。

于 2016-05-19T15:22:40.083 に答える