最近买了一个小米便携蓝牙鼠标,在 Arch Linux 下成功连接上鼠标之后,发现鼠标的延迟特别严重,但是鼠标连接到手机上却十分顺滑,由此基本断定是在 Arch Linux 上的某些配置导致的这些问题。

解决办法

  • 断开并重新连接鼠标。(无效)
  • 断开其他的外设,如无线键盘(使用 2.4GHZ 的无线接收器),断开 wifi(包括 2.4GHZ 和 5GHZ 的频段)。(无效)
  • 修改鼠标轮询率(Mouse polling rate )。(丝般顺滑)

在系统的蓝牙设备管理器当中查看当前蓝牙鼠标的地址,地址字段类似于 D3:77:66:C8:FE:53。然后在超级用户的状态下修改 /var/lib/bluetooth/<mac-of-your-adapter>/<mac-of-your-mouse>/info,添加以下字段:

一般情况,系统上只有一个蓝牙适配器,<mac-of-your-adapter> 是可以直接使用 Tab 键来补全的,你只需要根据之前查看到的蓝牙鼠标地址替换掉 <mac-of-your-mouse> 就可以了。

1
2
3
4
5
[ConnectionParameters]
MinInterval=6
MaxInterval=9
Latency=44
Timeout=216

通常 Linux 下的蓝牙设备是不会自动连接的,可以通过在 /etc/bluetooth/main.conf[Policy] 下添加 AutoEnable=true 将蓝牙设备设置为开机自动连接。

关于轮询率和轮询间隔

设备的轮询率(单位 Hz)取决于轮询间隔,轮询间隔以毫秒为单位进行测量,等于滞后时间。

默认的轮询间隔一般为 10ms,但是 USB 控制器一般会向下取最近的 2 的整数次幂,所以 10ms 的轮询时间实际上是 8ms 的轮询时间。

下面是几个常用轮询率与轮询间隔的对应表(速率 = 1000/轮询间隔):

轮询率(Hz) 1000 500 250 125
轮询间隔(ms) 1 2 4 8

如果是进行一些精度较高的活动时,可以把轮询间隔尽可能地调得小一些,不过这么做同时也会加重 CPU 的负担。