鼠标轮询率与 DPI 测试

画几圈估算上报频率,再用银行卡量一段距离标定 DPI,顺带看看鼠标有没有做直线修正。

  • 浏览器会把高频采样合并掉。这是测轮询率最大的障碍。浏览器为了省电,会把同一帧内收到的多个鼠标采样合成一个事件交给网页。所以默认读到的频率会被显示器刷新率卡住。本工具在支持的浏览器(Chrome、Firefox)上会自动改用 getCoalescedEvents() 把没合并的原始采样取出来,Safari 没有这个接口,只能看合并后的结果。
  • 系统指针速度会等比放大 DPI 结果。DPI 标定依赖「鼠标走一英寸,光标走多少个像素」这个映射。系统指针速度每调高一档,同一个鼠标算出来的 DPI 就等比例变大。测之前请把 Windows 的指针速度放回第 6 档(共 11 档的正中间)、关掉「提高指针精确度」,macOS 则把「跟踪速度」调到中间。

为什么这里的数字都只能算估算

浏览器会把高频采样合并掉,这是最大的障碍。为了省电,浏览器会把同一帧内收到的多个鼠标采样合成一个 pointermove 事件交给网页。只看事件间隔的话,120Hz 鼠标和 1000Hz 鼠标喂给页面的东西可能一模一样——都被压成了「每帧一个」。所以直接拿事件间隔算频率,得到的往往是显示器的刷新节奏。唯一的破口是 getCoalescedEvents(),它会把这一帧里被合并掉的原始采样全部交出来,把它们的数量累加再除以时间,才接近硬件的真实上报节奏。

就算拆开了,也还是下限。事件要经过浏览器的事件循环和渲染管线,显示器只有 60Hz 时,指针在屏幕上的移动本来就是按帧更新的,高频鼠标的优势在「指针移动」这件事上体现不出来——它的意义主要在于游戏里采样更密、瞄准更平滑。所以这里报出的频率加上了「约」字,它是从浏览器视角能看到的上报节奏,不是鼠标规格书上的那个数字。

DPI 标定测的是「有效 DPI」。依据是这样一条映射关系:在指针速度为默认档、指针加速关闭的情况下,鼠标每上报一次计数就移动一个屏幕像素,所以在桌面上走一英寸,光标在屏幕上就走「有效 DPI」个像素。这也解释了为什么这个测试不需要知道屏幕的物理尺寸。但反过来说,任何偏离默认档的指针速度都会等比例改变结果——把速度调高一档,算出来的 DPI 就跟着变大。所以标定之前一定要把速度调回中间档。

标定过程中最容易出错的三件事。一是光标撞到屏幕边缘,位移被截断,算出的值明显偏小;二是拖得不直,所以页面上同时显示「轨迹总长」和「直线位移」,两者差得越多说明越弯;三是没把指针速度归位。另外参照物要选准,银行卡和身份证的长边 85.60 毫米是 ISO/IEC 7810 ID-1 规定的,全球统一,比硬币可靠得多——硬币边缘有磨损,而 85.6 这个数字本身精确到小数点后两位。

角度捕捉必须靠斜线才能测出来。检测办法是统计所有线段的方向角有多少落在 45 度的整数倍附近。如果你画的是水平线,所有线段天然都在 0 度附近,这个比例一定是满的,判断就失效了。所以页面上要求故意画一条约 30 度的斜线——没有修正的鼠标方向会一直贴在 30 度附近,开了修正的会跳到 45 度。另外要留意:抖动和修正是一对矛盾的现象,抖动大说明传感器或垫子有问题,而抖动极小、轨迹呈规则锯齿状,反而更可能是修正算法在起作用。