Events 在wxWidgets中处理事件
我正在使用wxWidgets和OpenGL创建一个游戏引擎。我正在尝试设置一个计时器,以便游戏可以定期更新。我不想使用wxTimer,因为它可能不够精确,无法满足我的需要。我正在使用while(true)和wxStopWatch:Events 在wxWidgets中处理事件,events,wxwidgets,Events,Wxwidgets,我正在使用wxWidgets和OpenGL创建一个游戏引擎。我正在尝试设置一个计时器,以便游戏可以定期更新。我不想使用wxTimer,因为它可能不够精确,无法满足我的需要。我正在使用while(true)和wxStopWatch: while (true) { stopWatch.Start(); <handle events> // I need a function for this game->OnUpdate(); game->Re
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());
}
while(true){
秒表。开始();
//我需要一个函数
游戏->更新();
游戏->刷新();
如果(秒表时间()<1000/60)
WxMillSleep(1000/60-stopWatch.Time());
}
我需要的是一个处理所有wxWidgets事件的函数,因为现在我的应用程序只是冻结
更新:没有。它在Windows上有点不稳定,在Mac上测试时,非常不稳定。显然,EVT_IDLE在Windows上的调用并不一致,在Mac上更是如此
更新2:事实上大部分都是这样。在Mac电脑上很好;我误解了Mac测试人员的回答。我没有使用while(true)循环,而是使用EVT_IDLE,它工作得非常好
更新:没有。它在Windows上有点不稳定,在Mac上测试时,非常不稳定。显然,EVT_IDLE在Windows上的调用并不一致,在Mac上更是如此
更新2:事实上大部分都是这样。在Mac电脑上很好;我误解了Mac测试人员的回答。- 您是否已请求以最大速率生成空闲事件?您必须对事件调用
,如果不调用,则只有在处理了其他事件之后,您才会获得下一个空闲事件。请注意,持续的空闲处理将导致一个内核上100%的CPU负载RequestMore()
- 即使您请求更多空闲事件,您也无法确定下一个事件需要多长时间才能到达。因此,要获得平滑动画,需要计算自上次事件以来经过的时间,并相应地更新显示
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
EVT_PAINT (MyCanvas::OnPaint)
EVT_IDLE(MyCanvas::OnIdle)
EVT_MOTION (MyCanvas::OnMouseMove)
END_EVENT_TABLE()
当调用my_canvas->Refresh(bClearBackground)时,画布需要更新,否则不需要更新。要做到这一点,我需要进行修改,因为程序占用了一半的cpu时间(或双核上100%的1个cpu)
将
RequestMore()
的参数设置为false将使应用程序仅在需要时请求更多,即仅在调用Refresh()
时请求更多。将此标记为解决方案。:-)(如果允许的话……我是新来的。)点击计票下面的大复选标记,你可以接受自己的答案。不需要注释标题。哦,对不起。不过,我还得再等3个小时才能这样做:我正在使用秒表来确保显示屏以恒定的速度刷新。我不希望造成100%的CPU负载,事实上,问题远没有我原来想象的那么严重,所以我可能会保持现状。
void MyCanvas::OnIdle(wxIdleEvent &event)
{
wxPaintEvent unused;
OnPaint(unused);
event.RequestMore(false);
}