2009-07-15 72 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()被调用。