当前位置: 首页 > 知识库问答 >
问题:

将epoll与设备(/dev/event/…)一起使用是否有效?

盖晋
2023-03-14

我正在开发一个单线程进程小程序,它可以创建一个代理虚拟设备(更确切地说是一个虚拟Xbox 360 pad);我确实使用uinput接口创建了它,我正确地设置了它,它工作得很好。

为了将命令馈送到此虚拟设备,我从另一个真实接口(在本例中为PS3 pad)读取事件,并使用以下标志打开真实设备文件:

fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad

主循环类似于(减去错误检查):

while(run) {
    input_event ev = {0};
    read(fd, &ev, sizeof(struct input_event));
    // convert from PS3 --> Xbox 360
    convert(ev);
    // write to the new virtual pad
    write(fd_virtual, &ev, sizeof(struct input_event));
}

正如您所想象的,读取(fd,

出于这些原因,我正在考虑将读取(fd…调用封装在一个epoll循环中,这样我也可以有一个超时。

问题是,这样做是否有效?通过使用epoll\u wait,我是否给当前循环引入了额外的延迟,从而延迟了虚拟pad的响应?

共有1个答案

伍皓
2023-03-14

通过使用epoll_wait,我是否向当前循环引入了额外的延迟,从而延迟了虚拟垫的响应能力?

是的,你当然知道。

这样做是否有效?

我肯定是的,但这在很大程度上取决于你对“效率”的定义。

我们在这里讨论的是一个人工输入设备。在处理HID时,我们最关心的是延迟,它不应该滞后,按键时的反应应该是即时的。什么是人类的“瞬间”?这里有一个很好的讨论,但我最喜欢的一个论点是,在高水平的田径比赛中,你在接到信号后不到100毫秒就会被取消比赛资格。

但是100毫秒是对输入信号进行整个处理的时间预算,从按键到游戏中的一些可感知的变化。维基百科关于输入延迟的页面有一些关于该预算通常如何使用的数字。

无论如何,我认为1毫秒是绝对安全的开销,您可以使用代理添加,没有人会注意到,假设这是我们最大延迟的目标(如“高效”的定义)。

所以,让我们假设您对当前代码的响应时间感到满意。当您添加eball()调用时会发生什么变化?基本上,您正在为另一个系统调用添加一些时间,因为现在不是一个系统调用来获取您正在生成的值,而是两个。因此,它可能比您的原始代码慢两倍(让我们暂时忘记不同系统调用的流转时长差异)。但它真的那么糟糕吗?

为了回答这个问题,我们需要对系统调用开销进行一些估计。如果我们懒得自己来衡量,我们可以使用20年前的一些数字,一些来自关心系统调用的人的数字,一些来自微核人员(他们总是关心)的IPC数字,一些来自StackOverflow的随机数字,或者只是问问Rich,然后在微秒级左右结算,作为一个安全的假设。

因此,问题归根结底是,在毫秒(如1000µs)的时间预算内,是否可以注意到添加一些(甚至可以说10)微秒。我想不是。

只有一个可能的小问题,当您要从“只是添加电子投票()”到

循环遍历循环并检查其他事件/执行其他代码。

对于这些循环和检查,您需要小心地保持在您的时间预算范围内。但话说回来,1毫秒对您来说可能已经足够了。

 类似资料:
  • 问题内容: IE8发布后,以下代码是否可以添加条件样式表? 我已经阅读了有关此功能是否适用于Beta的矛盾报告。我希望有人可以分享他们的经验。谢谢。 问题答案: 它对我有用-无论是在怪癖模式下还是在标准合规性模式下。但是,它并 没有 切换到IE8兼容模式下工作。

  • 我想让flume代理位于hadoop集群之外,并想知道是否有可能使用flume通过WebHDFS向hadoop集群发送消息。 如果没有,是否有使用WebHDFS的替代方案?使用多层水槽层仍然需要我在hadoop集群中运行水槽代理。

  • 是否可以在AWS Lambda中构建一个函数来创建websocket并将数据发送到订阅的应用程序? 类似这样: John在他的手机中打开了应用程序SuperPhotoApp,但决定使用桌面浏览器将照片上传到SuperPhotoApp服务(S3 Bucket),此事件执行创建套接字的Lambda函数。io服务器并将更新推送到所有订户,他的手机打开了应用程序,因此应用程序会自动更新新照片。 这可以通过

  • 问题内容: 我对正则表达式很糟糕,但是我想知道是否可以将ng-pattern与变量一起使用 例如, 其中validationCode是控制器中附加到$ scope的变量 如果 则ng-pattern将是 但这不起作用,似乎我需要创建一个我真的不想要的自定义指令 问题答案: 需要一个正则表达式。 从Angular的文档中有关: 如果该值与模式表达式不匹配,则设置模式验证错误键。期望值用于内联模式或定

  • 我对Spring webflux和protobuf都是新手。我一直在读一些东西,我发现它们之间有一些相似之处。喜欢 Spring webflow可以部署在netty上,gRPC也是如此。 两者都适用于流数据。 这两个框架都在某种程度上基于观察者设计模式,支持基于均匀的数据处理方法。 然而,我仍然找不到任何结合webflux(反应式编程)、gRPC(更快的数据编码和解码)和Spring(依赖注入)功

  • 问题内容: 我偶然发现了HAML,这是一种标记内容和编写HTML模板的有趣而精美的方法。 因为我使用Python和Django来满足我的Web开发需求,所以我想看看是否有HAML的Python实现(或一些类似的概念-不必完全相同)可以用来替代Django模板引擎。 问题答案: 它基本上是适用于Python的Haml,并且大多数语法都是相同的(并且在Django中有效)。这里有一些GHRML只是为了