C# · 12月 27, 2021

c# – WPF keyDown响应时间精度

开发应用程序,用户可以在其中看到某些内容,并通过单击键盘上的一个键来进行反应.反应时间至关重要,越准确越好.

我写的示例应用程序inf wpf只有几行代码来测试默认设置:

namespace Test{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private Stopwatch sw; public MainWindow() { InitializeComponent(); sw = new Stopwatch(); sw.Start(); this.KeyDown += OnKeyDown; } private void OnKeyDown(object sender,KeyEventArgs keyEventArgs) { sw.Stop(); lbl.Content = sw.ElapsedMilliseconds; sw.Restart(); } }}

lbl只是简单的标签.

奇怪的是,当我按空格并保持它的值在lbl的变化范围:30-33.

所以我无法预测什么是响应的准确性?例如毫秒的精度是不可能的用户在同一时间点击空格(例如1 ms的精度)我可以处理事件处理程序吗?

主要问题是:

让我说我有一个keydown事件处理程序:

Test_KeyDown(object sender,KeyEventArgs keyEventArgs){ time = stopwatch.elapsed(); stopwatch.Restart();}

什么是可能发生的“时间”的最小值.我可以确定时间值准确到1毫秒吗?
在这种方法中,我启动秒表,但是我必须等待 – 多长时间才能刷新GUI?

解决方法 您的测试肯定是无效的,它只是衡量其他几个贡献者指出的键盘重复率.但是对于它的意想不到的好处是有用的,你可以看到键盘不会有问题.

Windows中的大多数事件都是以时钟中断速率决定的.默认情况下每秒钟为64次,每15.625毫秒.这唤醒了内核,它会寻找一些需要做的事情,寻找工作来传递给处理器核心.最通常的情况是没有什么可做,核心是使用HLT指令关闭.直到下一个中​​断发生.

所以一个问题是,您的测试永远不会比15.625毫秒更准确.你的观察比赛是偶然的,你看到的是这个数字的两倍.但事实并非如此,您可以使用程序来查看.使用控制面板键盘并调整重复速率滑块.请注意,您可以如何调整它,并将您的号码更改为不是15.625的倍数的值.

这并不完全是一个意外,键盘控制器也会产生一个中断,就像时钟一样.您有正面的证明,这个中断本身已经足够好了,让你的程序重新激活.你可以知道键盘控制器本身是足够快的扫描键盘矩阵.关于您在显示的数字中看到的噪音,键盘上的错误栏将不会大于/ – 2毫秒.如果您的键盘扫描较慢,则可以通过此测试消除它.

你所拥有的更大的关注就是视频.视频适配器通常以每秒60次更新来刷新LCD监视器.那么最糟糕的情况是,测试对象将无法在17毫秒内物理上看到图像.而液晶显示器本身也不是那么快,便宜的响应时间为16毫秒甚至更糟.水晶在液体中的副作用不能够足够快地翻转.

消除刷新率错误需要您编程与vertical blanking interval进行同步.可以使用DirectX进行操作.您可以找到响应时间约4毫秒的高档液晶显示器,受玩家欢迎.