先热个身——关于usb芯片延迟的测量,以及会给游戏带来的影响
首先明确一点,先把自己能力提升到对延迟有高要求的地步,再去提升相关设施才有更大的意义。
游戏延迟以及显示延迟才是大头,过于纠结芯片提升十分有限
文章比较枯燥,想看哪部分请手动跳转
虽然大家都知道,延迟确实是对几乎所有的游戏都有不良的影响,但是,这玩意对于我们有多大的直观影响,可能大部分人的认识其实都稍微有点偏颇。我想应该是有不少人觉得,只要延迟低于一帧,就不会有实质影响,问题是真的是这样吗?
Part1 usb轮询机制说明
Part2 手柄延迟测试之对点测试
Part3 手柄延迟测试之arduino
Part4 手柄延迟对我们究竟有什么影响
Part1 usb轮询机制说明
要解释这个问题,最起码我们要了解一下usb的运转机制。
假设我们有这么一个场景:
——————————————————————
刚插上手柄
主机:你谁啊
手柄:我usb手柄
主机:啊,报一下姓名
手柄:xxxxxx,一会每几毫秒碰个头
——————————————————————
之后每过几毫秒
主机:阿柄,汇报一下工作
手柄:xxxx键在按着,资道吧
主机:资道了
——————————————————————
整个对话会固定每隔几毫秒做一次,这件事一秒做多少次,就叫usb的轮询率。另外有些主机会有加密或者是隔三差五会改暗号,暗号对不上直接让手柄滚蛋(ps4)
我们关注的usb延迟实际上是,从我按键按下去,到最终usb发出按键信号的结果这中间会间隔多久。那么从这个机制上看,首先至少可以感觉的是,usb的轮询率高的话至少比低要好一点,理论上如果你轮询率是60的整数倍的话还不错,但是正常来讲轮询的时间是其他的时间,比如1,2,4ms。。。。所以说,还是尽量高一点吧,毕竟电竞的各项要求还是非常高的,现在的电竞键盘和鼠标都打着1ms的旗号,好处是,够快,坏处是,费电。
那么整个过程,延迟产生的重大因素,就是芯片的单片机本身的处理速度,以及代码的优化。如果说手柄太笨的话,那么芯片每轮告诉主机的按键信息可能就是几轮之前自己记录下来的信息。

Part2 手柄延迟测试之对点测试
那么,我们如何测量手柄的延迟?这个可以好好说一下
一个比较著名的方法是游戏对点测试,找一个比较稳定的格斗游戏,接上两个手柄,把接地接到一起,一个按钮同时接到两个芯片上

按下按钮会同时触发两个芯片的按钮,看角色发招是否是同时,通过统计有多少发招是不同步的来得出一个统计值,再根据高中生都学过的几何概型来大致确定一个延迟的值,就像这样

这个方案确实是比较容易理解而且确实有人去做,网上流传最广的几张表就是这个操作的结果,虽然测出来的是相对值,但是对于想要选择高性能摇杆的人来说已经很有意义了,就像学习,你考多少分是一方面,另一方面你不也想看排名嘛,所以这张表也被大多数人使用和参考。
但是方案的缺陷也是比较明显,首先是这个测试过程必须至少有两个摇杆,而且如果你遇到了不共地的摇杆,还得改电路(我就见过,hori那个虫杆,各种反人类的设计,用脚设计出来的),再有,如果其他人手里的两个手柄都不在之前的表里的话,那么也没办法给这个表补充数据,另外,测试的时候必须一个按钮一个按钮去点,而且要盯着屏幕去计数,自己按了多少次,有多少次发招是不同步的,做多了会吐的。所以说那个表是怎么肝出来的
Part3 手柄延迟测试之arduino
那么,有没有一个装置,能够识别usb手柄,能自动给按钮释放高低电平并且自己统计从自己释放信号到最终接收从usb过来的信号这之间过了多久?
答案是,有!
作为核心的arduino和usb host shield已经足够成熟了,兼容性极强,国内外爱好者用这些玩意做出了很多usb手柄相关的东西,比如之前发过的https://www.bilibili.com/read/cv11000216这个是把usb手柄信号转化成电平信号的装置,可以用usb手柄来控制jamma街机。
https://inputlag.science/controller/methodology这个是这个测试方案所对应的项目的来源,开源就意味着谁都可以做,当然首先是你要有一定的arduino的基础,装置上只要是arduino兼容的硬件都没问题,我用的是arduino nano以及usb host shield mini,因为nano有3.3v和5v供电,而且有usb可以直接与电脑通信,最重要的是,手头就有。然后画个外围电路,打个板,就可以测试了,当然你可以用面包板,但是有点乱,反正打板不花钱。


这个方案基本上解决了对点测试里遇到的大部分问题,每个人都可以测试,测试的结果可以提交给网站,网站还提供了统计表格模板,把你采集的数据往表格里贴,就能够得出结果。
另外这个值是绝对延迟,后续可以解释一个问题,就是延迟会对游戏产生什么实质影响。
问题:整个系统会有延迟吗,这个结果可靠吗,会不会这上面测试的结果与插到电脑上以及主机的结果有较大出入?
答案:arduino这种单片机的频率还是够高的,就算是信号处理和演算也是us级别,精度够了
老外用某一个手柄和ps4做了一个测试结果,与这个装置测试结果的曲线高度重合,几乎可以说明没有大的问题。相关文章可以在这里看到https://medium.com/@WydD/controller-input-lag-how-to-measure-it-1ebfd2c9d60
而且usb通讯协议没有那么复杂,现有的协议都是标准协议。再有这里也只是讨论手柄本身的延迟,至于到主机内部之后延迟会是多少,那是主机以及显示自身的问题了,像妹往生那种离谱的游戏。。。
另外,之前文章里提到的mister,也是一个兼容大部分手柄的硬件,相关团队也用这个硬件做了类似的测试,测试方法大概几乎是差不多(没找到相关文章),而且统计方法也是几乎相同,差别也就是mister测试的手柄更多。https://rpubs.com/misteraddons/inputlatency
Part4 手柄延迟对我们究竟有什么影响
之前说过,可能有不少人认为,只要你延迟不超过1帧就不会有影响,事实真的是这样吗?在上一part的最后说道老外给了一个表格
https://medium.com/@WydD/controller-input-lag-how-to-measure-it-1ebfd2c9d60
研究了老外的统计公式之后,理解了一下意图,这里解释一下,看一下图

绿色是你按下物理按钮的时间,蓝色是主机识别到信号的时间,这里简化了一下模型,也就是说主机识别到信号之后到游戏程序之间以及最后输出的延迟是不考虑的,都在同一环境下考虑也是比较公平(像妹往生那种游戏,算了吧)
由于usb的轮询远比游戏帧率密集,所以我们这里粗糙的认为usb会在一帧内的任何地方触发,老外的表格是做了一个离散处理,把一帧分成了50份,统计每一份时间延迟对应的概率。
那么这就很有意思了。仔细想一下,就算是延迟是2ms,主机也可能会在游戏的2F才收到usb的信号,那么游戏在3F做出动作,那么延迟就是一帧;就算是延迟是10ms,主机也可能在当前帧1F收到手柄信号,在2F做出动作。那么,最大的差异,就是两者的跳帧概率是多少了。这才是最直观的影响。表格内的计算公式核心是条件概率和全概率公式,感兴趣的可以自己推一下233333.
所以说,结论是,延迟低而且稳定的芯片不是不会延迟,而是跳帧的概率会比延迟高的芯片低得多,我们追求的不就是希望我们的设备能够按时的做出回应嘛。
结语:
追求芯片低延迟是没什么问题,这里也是讲一下需要关注什么,以及讨论一下芯片延迟带来的影响,用数据解释和反映一些事情,这就是数据的美,就像我之前跟学生说的一样,如果你未来只能掌握一样数学工具,那么就是四则运算,如果你还能再掌握一样,那就是概率统计了(笑)
不过就像最开始说的那样,先把自己水平提高到一定高度再纠结这种事情。
那么为什么我想写这个?是因为之后想搞一些事情,to be continue