2009-07-15 71 views
2

我使用wxWidgets和OpenGL創建遊戲引擎。我正在嘗試設置一個計時器,以便定期更新遊戲。我不想使用wxTimer,因爲它可能對我所需要的不夠準確。我使用了一段時間(真)和wxStopWatch:在wxWidgets中處理事件

while (true) { 
    stopWatch.Start(); 
    <handle events> // I need a function for this 
    game->OnUpdate(); 
    game->Refresh(); 
    if (stopWatch.Time() < 1000/60) 
     wxMilliSleep(1000/60 - stopWatch.Time()); 
} 

我需要的是將處理所有的wxWidgets的事件,因爲現在我的應用程序只是凍結功能。

更新:它沒有。它在Windows上稍微不穩定,並且在Mac上測試時,它非常不穩定。顯然,EVT_IDLE在Windows上不會一致調用,在Mac上甚至更少。

更新2:它實際上主要是。在Mac上沒問題;我誤解了我的Mac測試人員的回覆。

回答

1

而不是使用while(true)循環,我使用EVT_IDLE,它完美地工作。

更新:它沒有。它在Windows上稍微不穩定,並且在Mac上測試時,它非常不穩定。顯然,EVT_IDLE在Windows上不會一致調用,在Mac上甚至更少。

更新2:它實際上主要是。在Mac上沒問題;我誤解了我的Mac測試人員的回覆。

+0

將此標記爲解決方案。 :-)(如果這是允許的......我是新來的。) – exclsr 2009-07-15 19:40:59

+1

您可以通過點擊投票計數下的大選標記來接受自己的答案。不需要註釋標題。 – 2009-07-15 19:42:53

0
  • 您是否要求以最大速率生成空閒事件?您必須在活動中致電RequestMore(),否則只有在處理完其他活動後纔會收到下一個空閒活動。請注意,恆定空閒處理將導致一個內核上的CPU負載100%負載。
  • 即使您要求更多空閒事件,您也無法確定下一次到達需要多長時間。因此,要獲得流暢的動畫,您需要計算自上次事件以來的經過時間,並相應地更新顯示。
1

「您是否要求以最大速率生成空閒事件?您必須在事件上調用RequestMore(),如果不是,只有在發生其他事件後纔會獲得下一個空閒事件請注意,恆定的空閒處理將導致一個核心的CPU負載100%。「

這工作,我有一個圖形窗口下面的代碼: -

BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) 
    EVT_PAINT (MyCanvas::OnPaint) 
    EVT_IDLE(MyCanvas::OnIdle) 
    EVT_MOTION (MyCanvas::OnMouseMove) 
END_EVENT_TABLE() 

畫布需要時my_canvas->刷新(bClearBackground)被調用,而不是其他更新。要做到這一點,我需要做一個修改,因爲該程序佔用了一半的CPU時間(或者在雙核心上1個CPU的100%)。

void MyCanvas::OnIdle(wxIdleEvent &event) 
{ 
    wxPaintEvent unused; 
    OnPaint(unused); 
    event.RequestMore(false); 
} 

設置的RequestMore()爲false參數使得其在需要時應用程序只要求更多,即只有當Refresh()被調用。