鼠标轨迹测试
在下面的区域里匀速画十几圈,看画出来的线是不是圆滑。页面会数出轨迹里有多少处孤立尖峰——相邻采样点之间的距离突然变大、而两边又都正常——以及鼠标完全静止时传感器会不会自己产生计数(静止漂移)。
- "相邻两点距离变大"不等于丢帧:传感器漏点和手甩快了在数据上是同一个样子。所以这一页数的是形状——一串均匀小步里冒出的孤立尖峰才是丢帧的嫌疑,连着一起变大的是你的手。
- 影响结果的还有鼠标垫。玻璃面、纯白纸、太光滑的桌面上,大多数鼠标都会明显变差——测出来不理想时,先换一块深色布垫再测一次。
| # | 方向 | 长度 | 轴偏离 | 最大残差 | 判定 |
|---|
怎么读这些数
| 指标 | 看什么 | 说明 |
|---|---|---|
| 孤立尖峰 | 丢帧的形状 | 自己超过门槛,而左右两个邻居都没超。在一串均匀的小步里插进一个大跨步,这正是丢帧该有的样子。首尾两步只有一侧有邻居,不参与判断。 |
| 超线间隔 | 分母,不是结论 | 超过门槛的间隔总数,把连着出现的一起算了进去。匀速甩动时正常的间距会成串超线,所以它本身说明不了任何问题——要和孤立尖峰对比着看:两者差不多,说明超线的基本都是尖峰;超线很多而孤立尖峰是 0,那就是你画快了。 |
| 中位步长 | 平滑度 | 匀速画圈时它约等于"每个采样点走多远"。这个数本身无所谓好坏,它取决于你画多快和鼠标回报率多高——它的用处是当基准,也就是上面那个门槛:判定门槛是中位步长的 5 倍且不低于 20 像素。两个条件缺一不可:光有倍数的话,慢速移动时中位步长只有零点几像素,手一抖就满屏"丢帧";光有绝对值的话,快速甩动时正常的间距也会全部超线。 |
| 最大步长 | 有没有突变 | 和门槛比一比。如果最大步长只比门槛高一点点,那基本是人手的抖动;如果高出好几倍,那一下确实不正常。 |
静止漂移:手离开鼠标单独测
轨迹测试只能看出"动的时候有没有问题"。传感器的另一个常见毛病是静不下来:鼠标明明搁在桌上没人碰,光标却自己缓慢爬动。这个必须单独测,方法就是把鼠标放着不动。
判据很干脆:鼠标不发报文,事件就不会派发,所以一只没有自激的鼠标在完全静止时,采样数应当是 0。真收到了采样,说明传感器在动——可能是自激,也可能是表面干扰(玻璃、反光、灰尘、桌面共振)。
但"0 个采样"本身是有歧义的:指针根本不在浏览器窗口里、或者鼠标没接上,页面同样一个事件都收不到,和"鼠标很安静"在数据上完全一样,而这两种情况的结论天差地别。所以流程多了一步——先让你把鼠标晃一下,确认页面真的收得到信号(这一步的采样随后会全部丢掉,不计入结果),再等你停手。走过这一步之后,"0"才真正等于静止。要是一直收不到信号,页面会直接说"没收到信号",而不是替你判成静止。
需要说明的是:手放上去就不算数了。心跳、呼吸、甚至桌子被碰一下,都会让手带着鼠标动,那测出来的是你的手,不是鼠标。所以要么把手完全拿开,要么只用一根手指轻轻搭着不施力。
轨迹测试测不到什么
- 浏览器拿不到鼠标报文的序列号——丢帧的本质是“本该有 8 个报文,只来了 7 个”,而浏览器看到的只有它收到的那些,它不知道应该有 8 个。所以“有没有丢帧”这个问题,网页在原理上就无法直接回答,只能从轨迹的形状上找线索——而线索不是证据。
- 传感器的“加速度”和“平滑处理”也测不出来——有些鼠标会在固件里对原始数据做插值、去抖或加速,让画出来的线看着更顺滑,代价是真实的微小移动被抹掉了。这两者网页都看不见,只有原始数据对比才能发现。
常见问题
不是,页面抓到的跳变有两种来源,浏览器分不出来。一是传感器漏报了几个计数——那是真的丢帧;二是你的手真的甩快了,一个采样间隔里本来就该走那么远。两者在数据上都是"相邻两个采样点之间距离特别大",没有任何字段能区分。所以本页只说"跳变",不说"丢帧"。
看形态,别看总数。丢帧是"在一串均匀的小间距里插进一个孤立的大间距",像尖峰;手甩快了会让连续一串间距一起变大,是一条整体的隆起。页面就是按这个来的:标题那个数只数"孤立尖峰"(自己超线、左右两个邻居都没超),把连着出现的一起排除在外。所以正确的用法是匀速画上十几圈——孤立尖峰反复出现,那是丢帧;超线间隔很多而孤立尖峰是 0,那是你画快了。
因为这个测试要测的是"鼠标完全不动时,传感器会不会自己产生计数"。手搭在鼠标上,心跳和呼吸带来的微动就会被算进去——那不是传感器的问题,是你的手在动。所以要么把手完全拿开,要么只用一根手指轻轻搭着不施力。
这是刻意做的渐隐,不是画丢了。鼠标在高回报率下每秒产生上千个点,画满十几秒之后整个区域会糊成一团黑,反而看不清轨迹的形状。渐隐让最近的轨迹最清楚,而分析用的数据一直在缓冲区里,不受影响。
