【问题标题】:Handle Events in wxWidgets在 wxWidgets 中处理事件
【发布时间】:2009-07-15 17:49:41
【问题描述】:

我正在使用 wxWidgets 和 OpenGL 创建一个游戏引擎。我正在尝试设置一个计时器,以便可以定期更新游戏。我不想使用 wxTimer,因为它可能不够准确,无法满足我的需要。我正在使用一段时间(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 测试员的回复。

【问题讨论】:

    标签: events wxwidgets


    【解决方案1】:

    我使用的是 EVT_IDLE,而不是使用 while (true) 循环,它运行良好。

    更新:它没有。它在 Windows 上有点生涩,在 Mac 上测试时,它非常生涩。显然 EVT_IDLE 在 Windows 上不会被一致地调用,在 Mac 上更是如此。

    UPDATE2:实际上大部分都是这样。在 Mac 上没问题;我误解了我的 Mac 测试员的回复。

    【讨论】:

    • 将此标记为解决方案。 :-)(如果允许的话……我是新来的。)
    • 您可以通过点击计票下方的大勾号来接受您自己的答案。无需注释标题。
    • 哦,对不起。不过,我必须再等 3 个小时才能这样做:P
    【解决方案2】:

    "您是否请求以最大速率生成空闲事件?您必须在该事件上调用 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->Refresh(bClearBackground) 时需要更新画布,否则不需要。为此,我需要进行修改,因为程序占用了一半的 cpu 时间(或决斗核心上 1 个 cpu 的 100%)。

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

    RequestMore() 的参数设置为false 使应用仅在需要时请求更多,即仅在调用Refresh() 时。

    【讨论】:

      【解决方案3】:
      • 您是否请求以最大速率生成空闲事件?你必须在事件上调用RequestMore(),如果你不这样做,只有在处理完其他事件后你才会得到下一个空闲事件。请注意,持续的空闲处理将导致一个内核上 100% 的 CPU 负载。
      • 即使您请求更多空闲事件,您也无法确定下一个事件需要多长时间才能到达。因此,要获得流畅的动画效果,您需要计算自上次事件以来经过的时间,并相应地更新显示。

      【讨论】:

      • 我正在使用秒表来确保以恒定的速率刷新显示。我宁愿不造成 100% 的 CPU 负载,而且实际上问题远比我最初想象的要少,所以我可能会保持原样。
      猜你喜欢
      • 2019-08-27
      • 2011-08-14
      • 2011-01-31
      • 2014-03-20
      • 2011-06-11
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多