这期暂时不打算出视频,因为存在争议,但其实最主要问题还是能找到的相关资料太少,包括外网,兴许是我暂时没找对方法?
最早注意到这个问题我是想测机械键盘的轮询率,但是找了许久,没找到能够测试的好办法。
原因很简单,目前机械键盘最多的才多少个按键?104、108,对吧?而对于一个轮询率1000Hz及其以上的键盘,你不太可能拥有能够测试出它上限手速……除非你能在1秒钟内按键次数达到1000次以上(这速度恐怕也只有张口就来的键盘侠能够胜任)。
综上,想要测试键盘的轮询率,并没有什么好办法!但我还是很奇怪,按理说我按住键盘的一个键不动,一直是触发状态,不应该能测出轮询率吗?为啥不行?难不成大家都是菜鸡?写不出来测试程序?所以我说这玩意儿是有争议的!也许姿势不对?
那为什么鼠标和手柄能非常轻松的测出来?好吧,我们还是先把这个放在一边,从轮询率的定义开始解释吧。
轮询率也叫回报率,它其实指的是输入设备与主机之间的传输数据的频率。
注:输入设备包括鼠标、手柄、键盘等等,如果我没记错,小学、初中、高中的信息技术课本上就有讲,大学计算机基础也有讲这些东西。
或者换句话来讲,轮询率就是输入设备与主机之间的沟通频率,比如1000Hz的轮询率,那就是输入设备每间隔1毫秒和主机通信一次,1秒通信1000次。
所以这个时候,如果我们忽略其他因素,输入设备和主机之间的通信最大延迟 ≈ 1毫秒。因为传输数据是周期性的,指令要么落在上个1毫秒的区间内,要么落在下个1毫秒的区间内,之后被传送走(指令会落在1毫秒的区间内,然后在这个区间结束下个区间开始的时间点上被传送走)。
也就是说,在1000Hz轮询率的基础上,不考虑其他因素,最大延迟会无限接近于1ms,而最小延迟则是会无限趋近于0。这就是轮询率周期造成的延迟,我们称之为 “传输延迟” 。(不考虑其他因素的影响下,此时, “最大延迟” = “传输延迟” )
那针对于鼠标、手柄,我们是怎么测出来它们轮询率的?这就不得不提另一个东西了,这是我想测试键盘轮询率,偶然间发现的一个东西—— “扫描频率”
原文如下:
The scan rate of a keyboard measures how frequently the keyboard updates (internally) the state of its key matrix. Normally, the scan rate is limited by the bounce time of the key switches used and the debounce algorithm used. For example, the debounce time of Cherry MX mechanical switches is rated at ≤5ms. So assuming a simple algorithm is used that waits 5ms for a switch signal to stabilize, then the scan rate would be limited to 200Hz.
The idea used here is that the scan rate of the keyboard effectively determines the shortest delay between a key press and a key release. Using this information we estimate the scan rate as: . ScanRate = 1 / ShortestKeyHold
Note that scan rate is not the same as poll rate. On a USB device, poll rate refers to how often the OS will check the USB device for updates. The poll rate together with the scan rate determines the maximum input latency. For example, take the example above were the scan interval is 5ms. If our poll rate is 1000Hz, then the keyboard is polled every 1ms and so the maximal input latency is 1+5=6ms. However, if the scan rate were 100Hz, then the maximal input latency would be 10+5=15ms. Note: It is possible to look up the poll rate of a USB device using software.
Take these calculations with a grain of salt.
摘自:https://blog.seethis.link/scan-rate-estimator/
看不懂没关系,我来翻译一下,原文的大致意思就是除了轮询率之外,设备本身还存在一个 扫描频率 !最大延迟和它有着相当大的关系。(其实叫采样率也勉强说得过去hhhhh)
我们的鼠标、手柄,亦或是键盘,内部都有个微控制器(MCU,Microcontroller Unit,又叫单片微型计算机,Single Chip Microcomputer ,或者单片机),其本质上是个微型计算机,它负责传感器数据的记录与传输。
对于鼠标,微控制器主要负责的传感器就是鼠标底部的光学引擎,光学引擎所接触的平面,反馈的数据可以是趋近于无限的(光学引擎采集的数据肯定是有限的),所以会达到微控制器支持的最大扫描频率。
对于手柄,微控制器主要负责的传感器就是摇杆,摇杆所接触的平面,也可以看成是无限的(摇杆本身采集的数据肯定是有限的),所以会达到微控制器支持的最大扫描频率。
也就是说,对于一台正常的设备,它一定是 “扫描频率>轮询率” 的,这就是为什么我们能够测出鼠标或者手柄轮询率的原因。
所以这个时候,随着 “扫描频率” 这个参数的引入,最大延迟又变了, 最大延迟=扫描延迟+传输延迟 。假设扫描频率是2000Hz,轮询率是1000Hz,那最大延迟=0.5ms+1ms,最小延迟保持不变,还是无限趋近于0。
所以问题来了:
Q:为什么键盘轮询率测不出来?
A:我也不知道啊,我也很绝望啊!为啥没法测?我按住一个键不松开,这不就是个连续的过程吗?应该能测才对啊!可就是找不到测试软件!可能就像鼠标按住左键或者右键不动、手柄只按键不动摇杆,没法测轮询率一样的道理吧,具体原因我暂时不清楚,只能这样强行解释hhhh。
抬杠:蓝牙就是差,延迟高!哪怕轮询率一致也不行!
正解:当蓝牙和其他连接方式轮询率保持一致时,延迟是一样的,不存在蓝牙延迟高!正视自己很重要,摘掉有色眼镜,先从拒绝歧视做起!你们所谓的延迟高、卡顿,那实际上是因为蓝牙的抗干扰能力不行导致的异常。
Q:最大延迟只和那两个参数有关吗?
A:显然不是,我们这是排除人为等诸多因素造成影响之后的数据,只考虑了硬件本身素质。如果较真,人类本身有反应时间,按下键盘,键程本身也需要消耗时间等等……想要深入研究我推荐你看看这个:
https://www.zfrontier.com/app/flow/enxgmQEXo9RO
Q:扫描频率>轮询率是正常的,但如果小于呢?
A:举个极端例子,如果扫描延迟是10秒,传输延迟是1ms,当你使用鼠标移动时,前10秒鼠标会在电脑屏幕上保持不动,最后1ms鼠标指针会突然跳到你鼠标第10秒停止移动的位置上,俗称卡顿!
Q:扫描频率>轮询率是正常的,但如果轮询率过低呢?
A:同样会卡顿,鼠标指针在电脑屏幕上断断续续的,不够丝滑顺畅,就像高刷屏和60Hz普通屏幕的区别,所以理论上轮询率越高越好。(但轮询率肯定存在边际效应,达到人类无法感知的水平,再提升就没啥意义了)
抬杠:高轮询率没用,你懂个**!你知不知道顶级电竞选手的反应速度大于90ms,奥运会短跑运动员的起跑反应在100ms附近……(此圣经摘自我投稿的八位堂手柄推广视频评论区)
正解:那我只能送您两个字,**!我当然知道人的反应时间是有限的,不过不好意思,高轮询率还真有用!因为运动是个连续的过程,现实世界没有帧率这个概念!现实世界无时不刻都以无限的帧率运行!难不成您运动起来能在现实世界实现抽帧? 失敬失敬!阁下真是不一般!所以设备的轮询率必然是越高越好,越高越接近现实,直到人类无法感知!
全文完!
拓展链接汇总:
https://blog.seethis.link/scan-rate-estimator/
https://www.zfrontier.com/app/flow/enxgmQEXo9RO
https://www.zfrontier.com/app/flow/eMbZVvoXG5BW