2013-12-12 115 views
0

基本上,我有一個實現OpenGL的wxWidget應用程序 - 後者顯示在可通過用戶輸入(點擊,拖動等),wxTimer或由外部過程。當焦點轉移到另一個窗口(無論是內部對話框還是其他應用程序)時,問題就會出現 - wxPanel會在幾秒鐘內立即停止更新,特別是如果其他窗口位於最前面(有時,被遮擋的小部分面板仍將繼續更新)。重新激活應用程序或調整窗口大小「解凍」面板,並繼續正常操作。當窗口處於非活動狀態時,wxPanel閃爍/失敗

這是我一直在wxWidgets中遇到的一個問題,無論是在這種情況下的OpenGL面板還是其他。一般來說,我可以通過在窗口重新調整窗口,調整窗口大小或類似的東西之間進行Freeze()和Thaw()之間的大量SwapBuffer()調用來解決此問題,但這些都有可能產生閃爍或其他不可忽略的視覺僞影,並且如果每幀完成(例如,當動畫需要在非活動窗口中繼續播放時),則會影響性能。

無限期的反覆試驗可能會產生一些不錯的結果,但我真的很想知道,處理這個問題的「正確」方法是什麼?提前謝謝了。

下面的代碼的參考骨架:

void MyGLCanvas::Draw(bool focus, int parentID) //This is what's called by the rest of the application 
{ 
    if (focus) { SetFocus(); } 
    SetCurrent(); 
    wxClientDC dc(this); 
    Paint(dc); 
} 
void MyGLCanvas::Paint(wxDC &dc) 
{ 
    //All OpenGL drawing code here 
    glFlush(); 
    SwapBuffers(); 
} 
void MyGLCanvas::OnPaint(wxPaintEvent& event) 
{ 
    wxPaintDC dc(this); 
    Paint(dc); 
    event.Skip(); 
} 

回答

0

你在這裏做一些奇怪的或完全錯誤的東西:

  1. 跳過事件在OnPaint()。這是Windows下wxWidgets 2.8中的一個致命錯誤,即使我們在代碼之後清理了它,如果它在3.0中執行此操作,它仍然是一個糟糕的主意。
  2. 請勿使用wxClientDC,只需撥打Refresh()並讓Windows通過調用您現有的OnPaint()處理程序重新繪製窗口。
  3. 不要致電SetFocus()Draw(),這真的不應該是必要的。
  4. 繪圖前請撥SetCurrent()。總是,不僅在Draw()

我不知道你看到的問題中有哪些結果,但你應該改變它們。有關如何正確執行此操作的示例,請參閱samples\opengl\cube\cube.cpp

相關問題