私はX11でOpenGLウィンドウを作成しており、ダブルバッファーにはglxswapbuffers
を使用しています。X11ウィンドウサイズ変更スタッター
問題は次のとおりです。レンダリングはうまく見えますが、サイズ変更時にウィンドウ境界がぼやける、OpenGLのコンテンツがバウンドしてしまいます。
ConfigureNotifyイベントをフィルタリングして遅延させて、vsyncをglXSwapInterval
でオフに設定しました...何も機能しませんでした。
これは、私はこれは私がXCheckTypedWindowEvent
を通じて解決this previous postとは異なる問題(厳密にリサイズにリンクされている)であることを
void Window::redraw() { // Called by any control which needs redrawing
XEvent event;
memset(&event, 0, sizeof(event));
event.type = Expose;
event.xexpose.display = display;
XSendEvent(display, window, False, ExposureMask, &event);
}
void Window::resize(int width, int height) {
this->Width = width;
this->Height = height;
}
bool Window::wndProc(XEvent *evt) {
switch (evt->type) {
case Expose: {
if (evt->xexpose.count == 0) { // handle last one only
while (XCheckTypedWindowEvent(display, window, Expose, evt));
if (Width != oldWidth || Height != oldHeight)
resizeViewportAndUpdateDimensions();
Renderer.drawGLStuff();
this->redraw();
}
return true;
} break;
case ConfigureNotify: {
this->resize(evt->xconfigure.width, evt->xconfigure.height);
this->redraw();
return true;
} break;
}
}
お知らせを使用しているコードです。私は変更が完了したときにConfigureNotifyが発生し、これらの二つのリンクから読み取ることができるものから、
これは他のウィンドウシステムでも同様に起こります(Win32やQuartzなど)。フレームバッファのサイズ変更は破損しており、その内容は不明です。リサイズメッセージを同時に処理しながらも、直感的にはうまく動作しない場合があります。 –
例えば、Win32では、ユーザーがフレームをドラッグしている間にWindowsがイベントの送信を停止するため、プレゼンテーションをポンピングするセカンダリスレッドを実際にセットアップしなければなりません。 –
@ AndonM.Colemanに感謝しますが、どのように「被害に対応する」?どういう意味ですか? – Dean