我正在使用wxWidgets和OpenGL创建游戏引擎。我正在尝试设置计时器,以便定期更新游戏。我不想使用wxTimer,因为它可能不够准确,不能满足我的需求。我正在使用while(true)和wxStopWatch:
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上也不会被调用。
UPDATE2:它实际上大部分都是。它在Mac上很好用;我误解了我的Mac测试者的回复。
答案 0 :(得分:1)
我没有使用while(true)循环,而是使用EVT_IDLE,它完美无缺。
更新:事实并非如此。它在Windows上略显生涩,在Mac上测试时,它非常生涩。显然,EVT_IDLE在Windows上不会被一致地调用,甚至在Mac上也不会被调用。
UPDATE2:它实际上大部分都是。它在Mac上很好用;我误解了我的Mac测试者的回复。
答案 1 :(得分:1)
“你是否要求以最大速率生成空闲事件?你必须在事件上调用RequestMore(),如果不这样做,只有在处理完一些其他事件后才会获得下一个空闲事件。恒定的空闲处理将导致一个核心上100%的CPU负载。“
这很有效,我在图形窗口中有以下代码: -
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
EVT_PAINT (MyCanvas::OnPaint)
EVT_IDLE(MyCanvas::OnIdle)
EVT_MOTION (MyCanvas::OnMouseMove)
END_EVENT_TABLE()
当调用my_canvas-&gt; Refresh(bClearBackground)时,需要更新画布,否则不需要更新。要做到这一点,我需要做一个修改,因为程序占用了一半的CPU时间(或决斗核心上1个cpu的100%)。
void MyCanvas::OnIdle(wxIdleEvent &event)
{
wxPaintEvent unused;
OnPaint(unused);
event.RequestMore(false);
}
将RequestMore()
的参数设置为false会使应用仅在需要时询问更多内容,即仅在调用Refresh()
时才会询问。
答案 2 :(得分:0)
RequestMore()
,否则只有在处理完其他事件后才会获得下一个空闲事件。请注意,持续空闲处理将导致一个核心上100%的CPU负载。