【问题标题】:Accuracy of NSEvent timestamp for input events (keyboard/mouse)?输入事件(键盘/鼠标)的 NSEvent 时间戳的准确性?
【发布时间】:2018-01-08 15:57:44
【问题描述】:

在 Cocoa 中,NSEvents 有一个 timestamp 属性,它返回一个时间间隔,表示“事件发生的时间,以系统启动后的秒数为单位。”我正在编写一个需要这些信息的应用程序——正是当用户按键时。但我担心时间戳可能不够准确。 Timeinterval 本身具有亚毫秒级的精度,这很棒。是否有任何文档表明是否使用亚毫秒精度为代表键盘和鼠标输入的 NSEvents 提供准确的时间戳?

如果我不得不猜测苹果的实现,我希望 NSEvent 上的时间戳可能会在硬件中断后不久生成,这太棒了。但是我也可以想象一个系统,它会轮询键盘/鼠标输入,并且仅在下一个轮询间隔到来并读取输入时填充时间戳字段。

非常感谢您的任何见解。

【问题讨论】:

    标签: objective-c macos cocoa timestamp nsevent


    【解决方案1】:

    您可能会发现 Apple 的 Cocoa Event Handling Guide: Event Architecture 文档很有用。从此:

    在将事件分派给应用程序之前,窗口服务器以各种方式处理它;它为它加上时间戳,用相关的窗口和进程端口对其进行注释,并且还可能执行其他任务。

    这似乎表明位于内核和应用程序层之间的 Window Server 应用了时间戳...尽管它可能会读取在较低级别生成的元数据以执行此操作。

    我认为更好地理解这一点的最佳方法是编写一个应用程序来记录按键按下/按下事件的时间戳并在相邻事件中查找精确匹配。如果您连续看到具有(几乎)相同时间戳的多个事件,则它们更有可能在获得时间戳之前在某个缓冲区中排队。如果相邻事件之间有足够大的间隙,则更有可能在更接近硬件事件的位置被标记。

    【讨论】:

    • 非常感谢您的回答和链接。您对如何感受系统性能的建议是一个很好的建议。我希望有更多关于窗口服务器事件队列及其填充方式的详细信息。在理想情况下,您提到的元数据或文章所说的有关按键的“其他信息”包括诸如系统正常运行时间戳之类的东西,从事件记录生成并传递到窗口服务器。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2011-10-25
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多