【问题标题】:How to measure high-resolution keypress time in C++?如何在 C++ 中测量高分辨率按键时间?
【发布时间】:2021-10-15 19:20:40
【问题描述】:

我有一个采样率为 1 000 Hz 的 Millikey Response Box 和一个采样率为 10 000 Hz 的光传感器。我想测量从按下按钮到在我的 C++ 程序中按下按钮触发屏幕变化的端到端响应时间。我很难理解如何做到这一点。

我的想法是,理想情况下,我会让按钮按下创建一个按键事件,该事件包含一个以 1000 Hz 采样率创建的时间戳。我的 C++ 程序将通过记录高频时间戳并触发屏幕上的亮度变化以自己的频率处理此事件。接下来,光传感器会检测到变化并以 10 000 Hz 的采样率生成自己的按键事件。在下一个循环中,我的 C++ 程序将获取此事件并通过比较两个高分辨率时间戳来获取实际的端到端时间。

这个想法合理吗?如果是,我该如何实施?

到目前为止,我使用 GLFW 来捕获键盘事件并获取按键回调中的时间戳,但据我了解,这并不是按键被按下的确切时间。

【问题讨论】:

  • 硬件上有可用的测试点吗?
  • 桌面操作系统通常具有可怜的高精度计时能力。即使是毫秒计时也可能是狡猾的。我会从std::chrono::steady_clock 开始(avoid using std::chrono::high_resolution_clock 尽管这听起来像是适合这项工作的工具。它可能不是)然后看看结果有多好。如果不好,请完善问题。
  • @ThomasMatthews 我猜是的。请参阅page 上的“MilliKey 时序验证”。我不明白我应该如何使用它来获得准确的时间戳。你能解释一下吗?
  • 你所做的是在动作之前断言测试点,然后在动作之后取消断言测试点。将示波器探头或逻辑分析仪连接到测试点。您可能想为基准测试编写一个无限循环。您可能希望在测试点的断言转换时触发示波器。
  • 这比我想象的要复杂得多......但是谢谢!我会调查的

标签: c++ input time keypress keyboard-events


【解决方案1】:

由于链的各个部分存在未知且可能不稳定的延迟,因此尝试使用计算机和外围设备完成所有这些操作可能无济于事。

所以这是我成功用来测量延迟的一个技巧。我将光传感器连接到声音发生器。然后,我将按下按钮的声音与传感器发出的声音一起记录下来。以 96Khz 记录,这将为您提供非常准确和精确的读数。你只需要在音频编辑器中测量延迟,或者我猜你也可以有一个独立的程序来分析音频。

【讨论】:

  • 如果您有低延迟 DIO,另一个好技巧是设置和清除数字输出线并在示波器上进行测量。
【解决方案2】:

我的答案是使用LabStreamingLayer。我使用App-Input 捕获键盘事件,LabRecorder 捕获这些事件的流,然后使用 Python 导入器解析生成的 XDF 文件。以上所有操作都在后台运行并捕获事件,同时按键触发了我的 C++ 程序中由光传感器检测到的屏幕变化。

我敢肯定,其他答案和 cmets 对于何时希望自己在低级别实现此功能提出了很好的建议。由于我的理解有限,我的问题也没有细化,所以还是谢谢你的贡献!

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多