2016-04-04 26 views
3

私は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が発生し、これらの二つのリンクから読み取ることができるものから、

+1

これは他のウィンドウシステムでも同様に起こります(Win32やQuartzなど)。フレームバッファのサイズ変更は破損しており、その内容は不明です。リサイズメッセージを同時に処理しながらも、直感的にはうまく動作しない場合があります。 –

+2

例えば、Win32では、ユーザーがフレームをドラッグしている間にWindowsがイベントの送信を停止するため、プレゼンテーションをポンピングするセカンダリスレッドを実際にセットアップしなければなりません。 –

+0

@ AndonM.Colemanに感謝しますが、どのように「被害に対応する」?どういう意味ですか? – Dean

答えて

0

https://tronche.com/gui/x/xlib/events/window-state-change/configure.html

https://tronche.com/gui/x/xlib/events/structure-control/resize.html

。 ResizeRequestは、サイズ変更が試行されたときに発生します。具体的に:

Xサーバは ウィンドウのサイズを変更するには、別のクライアントの試行に関する 情報を希望するクライアントにResizeRequestイベントを報告することができます。

私は「CANレポート」の音が嫌いですが、あなたはそれを打つべきだと思います。リンクの指示どおりに適切なイベントビットを設定するのを忘れないでください。イベントをキャプチャするときに何をすべきかについては、私はあまり確信していません...私はフロントバッファをクリアし、完了するためにサイズ変更を待つでしょう。

関連する問題