如何在Linux / C ++中捕获基本的系统事件(如input)

像现在的Linux / C ++一样老旧和标准化,我会想象有一种有效的方法,即使是一个库或三个库,也可以用来捕获系统事件。

我需要的事件types是:

  • GUI :窗口大小调整,移动,…
  • IRQinput(键盘/鼠标),USB,…
  • FS :节点操作,r / w,…
  • 类似的东西,关机,注销,…

我知道:

  • / dev / input / *可以被轮询
  • Udev …
  • Xorg可以被调查
  • IRQ处理程序…

其中大部分是低效的和/或需要特定的环境(Xorg,Udev等)。IRQ处理程序是高效的,但只适用于一种types的事件。

为了FPS循环,游戏引擎必须特别有效,特别是input。 如果任何人都可以提供投入的实施细节,那就够了,不胜感激。

什么是我正在寻找的有效方法? 什么是平凡的? 如果我必须自己建造,你建议我从哪里开始? 我需要什么工具?

那么,为了澄清,应用程序总是必须这样或那样做对吗? networking浏览器,游戏引擎,桌面环境等都必须有效地收集input和其他事件。 “那个怎么样?” 我问。 期望已经建立的操作系统/应用程序接口(API)是不合理的? 当然不是!

为了FPS循环,游戏引擎必须特别有效,特别是input。 如果任何人都可以提供投入的实施细节,那就够了,不胜感激。

事实上,收到你所说的事件通常远不及游戏的瓶颈。 所以我们通常不需要做任何特别的巧妙或特殊或低级的事情来处理它们。 一般来说,实际上,我们只是在任何我们正在构建的平台上使用为我们提供的任何机制。 这在Windows和macOS上相当简单,它们具有标准的GUI API,可以侦听几乎所有列出的事件types。

对于没有硬标准graphics用户界面库的Linux来说,它有点复杂,但只有可能有许多API可供select。 如果有人select了,可以直接写Xlib,尽管我想冒险猜测大多数人宁愿写Qt或GTK提供的API来代替。 由Qt之类的高级抽象提供的易用性大大地压倒了使用这种抽象的微不足道的“性能代价”,因为再次处理事件并不是大多数游戏的瓶颈。

当然,现在很多游戏都直接与IRQ或其他驱动程序中断事件有关。 这不值得入场。

什么是我正在寻找的有效方法? 什么是平凡的? 如果我必须自己建造,你建议我从哪里开始? 我需要什么工具?

从根本上说,你只需要select你要用来建立你的游戏的GUI系统。 SDL? Qt的? GTK? 有很多select可供select,并提供指导, 应该select哪个范围超出了本网站的范围。 他们都可以完成给你一个窗口的基本任务,你可以绘制你的游戏graphics(使用OpenGL或类似的东西),并挂接你可能需要的任何input事件的接收。

select一个似乎与你的工程风格一起工作的人吧。 这将覆盖你列出的大部分事件types(与窗口有关的事件和与input有关的事件)。 GUI API不一定也会提供文件系统访问API,但是很多都可以。 如果没有,您可以根据自己的需要select合适的API。 例如,如果您只需要基本文件IO,那么C ++标准库就足够了。 如果你想要的东西利用操作系统的asynchronous文件IOfunction,你将需要使用操作系统的API或一些包装。 同样,如果你需要文件系统监视事件(这不是很常见),你可能需要使用类似inotify API的东西。