gpt4 book ai didi

c++ - 事件驱动编程 : callback vs message polling

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:08 25 4
gpt4 key购买 nike

作为一名 C++ 程序员,我一直在研究 OpenGL 编程,并且看到了处理事件驱动编程的两种主要方式:消息轮询或回调函数。

  • 我看到原生 Win32API 使用了一个回调函数,它是由 DispatchMessage 函数触发的。

  • SDL(基于教程)也使用某种回调或类似回调的编程。

  • GLFW 也使用回调。

  • SFML 允许程序员轮询代码中任何位置的单个消息,通常在一个循环中,形成消息循环。

  • 根据我所见,X Window 系统也使用消息轮询。

显然,由于事件系统存在于突出的环境中,因此每个系统都必须具有优势。我希望有人能告诉我每个的优点和缺点。我正在考虑编写一些严重依赖于事件驱动编程的程序,并希望就采用哪条路径做出最佳决定。

最佳答案

这不会是完整的,但我想到了一些事情......

我只在 3D 中使用过 GL,并没有真正在 GUI 方面做太多事情。轮询事件很常见。更准确地说,在主渲染循环中进行轮询,该循环处理队列中的所有事件,然后继续进行渲染。这是因为在收集所有事件并使用它们更新场景的 3D 状态后,您从头开始重新渲染每一帧的所有内容。由于屏幕只能以有限的帧速率显示图像,因此在轮询期间休眠也很常见,因为即使它们的事件更早触发,任何状态更新也不会在稍后显示。

  • 如果您要完全按照事件的发生来处理事件,例如在绘图的中途,那么您就会遇到竞争条件。处理这个可能是不必要的麻烦。

  • 如果你有任何动画,那么你已经有一个循环,相比之下,轮询是一个微不足道的成本。

  • 如果您的事件非常不频繁,那么您不需要经常重新绘制,因此让线程处于事件状态和轮询效率有点低。

  • 如果事件堆积起来并且您要为每个事件重新绘制,那将是非常糟糕的。您可能会发现与使用循环处理所有事件并渲染一次相比,您重新绘制的频率更高。

我认为轮询的主要问题是针对未聚焦的非事件窗口。假设您最小化了 GL 应用程序。您知道它不会收到任何事件,因此轮询是无用的。绘画也是如此。

另一个问题是响应延迟。这对于捕获游戏中的鼠标移动之类的东西非常重要。只要您以正确的顺序(输入→更新→显示)轮询事件,这通常就可以了。但是,vsync 会延迟显示帧,从而扰乱时序。

关于c++ - 事件驱动编程 : callback vs message polling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com