翻页卡顿是从哪来的
候选栏第一页给几个词,按翻页键看后面的。多数时候翻页是瞬时的,按下去候选栏就换了。偶尔能感觉到一个短暂的停顿,按了之后候选栏要过一小会儿才刷新。
这个停顿来自两个环节。候选生成:输入法要算出下一页的候选词。如果候选池是懒加载的,第一页之后的条目还没有算好,翻页时要即时生成。窗口渲染:候选窗口要重绘,把新的候选文本、序号、选中状态画出来。
两个环节里,多数情况渲染更快,候选生成是主要耗时源。候选生成慢的原因往往是候选池还没算完,翻页键先到了。输入法要么等候选算完再渲染,要么先渲染一个不完整的列表。等候选算完是更稳的选择,用户看到的就是短暂的停顿。
理解这一点,就能预判什么情况下翻页会慢:候选池大、生成慢、翻页急。下面逐一拆开。
翻页的本质:候选词是分批生成的
候选词不是一次性全部算完的。输入法通常只算前若干条,后续按需生成。这个设计的原因是成本:把整串拼音对应的所有候选都算完,代价太高,而多数用户根本不会翻到第三页以后。
分批生成有两种形态。懒加载:候选排序已经完成,翻页只是把后续条目取出来渲染,快到用户感知不到。即时生成:翻页时还要继续搜索更多候选,这个搜索就是停顿的来源。
两种形态什么时候用哪种,取决于实现。多数情况下第一页是即时生成的,后续页是懒加载的。用户翻到第二页,多数时候是懒加载,感觉不到停顿。翻到第五页以后,如果候选池里还没有那么多条目,就可能触发即时生成,用户能感觉到慢。
候选池的大小跟输入类型有关。全拼的候选池相对小,简拼的候选池大得多。简拼输入一个字母,可能对应几百个候选。翻页到后面的候选,就是在大的候选池里找,耗时更长。
候选词窗口怎么渲染:每翻一页重绘什么
候选窗口是一个独立的窗口,跟应用窗口分离,位置跟随光标。每翻一页,这个窗口要重绘。
重绘的内容包括:候选文本本身、选中状态、候选序号、窗口尺寸。其中窗口尺寸是最容易出问题的一项。候选长短不一,窗口要按最长的那条调整宽度。候选里出现特别长的词,窗口宽度就要变大,重排整个布局。
渲染成本跟候选的数量和长度正相关。候选数量多、字长差异大,渲染就慢。候选窗口的背景、边框、圆角这些视觉元素也会参与渲染,但通常不是瓶颈。
系统层面还有一层开销。候选窗口要跟随光标位置,光标坐标由应用通过系统接口提供。如果应用没有及时提供光标坐标,窗口要等。这个等的时间用户感觉不到,但如果应用和输入法之间的接口调用慢,累积起来也能感知。
一个容易观察到的现象:在远程桌面、虚拟机里翻页,比在本地机器上慢。不是输入法的代码变了,是渲染和接口调用走了一层远程通道,成本更高。
影响翻页速度的四个因素
把翻页耗时拆开,可以归结到四个因素。
候选总量。候选池越大,翻页时要跳过的条目越多,排序和查找的耗时越长。简拼和长串输入的候选池比全拼大得多,翻页更容易感觉到慢。
候选词长度。长候选的渲染成本更高。窗口需要为最长的候选预留宽度,短候选也被迫在同一宽度里排版。候选里混有长短差异大的词,渲染要做更多的布局调整。
翻页距离。从第一页翻到第十页,中间要跳过大量候选。如果每次翻页都即时生成,距离越远,累积耗时越多。连续快速翻页比单次翻页更容易触发性能问题。
系统渲染能力。老机器、集成显卡、远程桌面、虚拟机,渲染能力弱。候选窗口的重绘本身不复杂,但在这些环境下会被放大。同样一次翻页,在本地新机器上可能感知不到,在老机器上可能明显。
翻页方式的差异
翻页不只是按键一种方式。不同方式对性能的影响不一样。
| 翻页方式 | 操作 | 翻页耗时 | 适用场景 |
|---|---|---|---|
| 按键翻页 | + / - 或 , / . | 中等,触发即时生成概率高 | 连续翻页查找 |
| 数字选词 | 输入候选序号 | 低,不触发翻页 | 目标在第一页时最快 |
| 鼠标点击 | 点候选或翻页箭头 | 中等,含鼠标移动 | 鼠标已在手边时 |
| 滚轮/触摸板 | 滚动候选栏 | 取决于实现,部分版本不支持 | 触摸板用户 |
数字选词是这几种方式里最省性能的。用户直接选候选,不需要翻页,不触发后续条目的生成。代价是只能选第一页的候选,第二页以后的词用不上。第一页候选命中率高的时候,数字选词比翻页快得多。
按键翻页的耗时中位数不高,但方差大。单次翻页可能几十毫秒,连续快速翻页可能累积到几百毫秒。用户感受到的「翻页卡」通常出现在连续翻页的场景。
鼠标和触摸板的方式跟实现有关。部分版本的候选窗口支持鼠标点击,部分版本只支持按键。支持鼠标点击的版本,点击跟按键的性能特征接近。
实测:候选数量与翻页耗时
下面的数据为人工构造,测试环境为 Windows 11 24H2、16.8 正式版、默认词库、关闭云输入、本地固态硬盘。测量方式是录屏逐帧比对按键到候选栏刷新,每次测试重复 20 次取中位数。样本量小,数据仅供量级参考。
| 候选池规模 | 单次翻页耗时 | 耗时示意 | 可感知程度 |
|---|---|---|---|
| 约 10 个候选 | 12 ms | 感知不到 | |
| 约 30 个候选 | 28 ms | 临界,多数人感知不到 | |
| 约 50 个候选 | 45 ms | 快节奏输入时能感觉到 | |
| 约 100 个候选 | 82 ms | 明显停顿 |
用户能调的四个设置
翻页优化里,用户侧可调的空间有限,但有四项值得试。
每页候选数量。设置里可以调每页显示 5、7、9 个候选。每页数量多,一页能看到更多候选,翻页频率降低,但单页渲染成本上升。多数场景下 5 到 7 是平衡点。
翻页键。多数版本支持把翻页键改成逗号句号、加减号、方括号、PageUp/PageDown 等几种。改动不影响翻页速度,只影响操作习惯。选一个跟自己其他输入法一致的键位,可以减少误操作。
云输入开关。弱网环境下,云输入要向服务器请求候选,网络延迟会拖慢候选池的生成。关闭后只走本地候选,翻页耗时更稳定。稳定网络下改善有限。
词库精简。用户词库积累太多低频词,候选池会变大,排序耗时增加。定期清理不需要的词,可以间接改善翻页速度。清理的收益在候选池几百条以上时比较明显。
翻页优化做不到什么
不能消除候选生成的耗时。候选是按需生成的,翻页要触发生成,生成就需要时间。优化只能降低耗时,不能让它变成零。候选池越大,这个下限越高。
不能预测用户要翻到第几页。输入法无法提前知道用户会翻到第几页,只能按需生成。如果提前把后面几页都算好,第一页的响应会变慢。这是个取舍,没有两全的方案。
不能在翻页时保证候选顺序不变。同一串输入,翻页时的候选顺序不会变。但如果用户在翻页过程中继续输入字母,输入法会重新排序,之前看到的位置可能不再对应同一个词。这是重新计算,不是顺序变化。
不能在候选很多时保持体验一致。候选池到上百条时,翻页耗时进入可感知区间。这是结构性的,不是某个版本的问题。减少候选数量是唯一直接的办法,代价是候选覆盖下降。
不能解决应用侧的接口延迟。如果应用没有及时提供光标坐标,或者接口调用慢,候选窗口的定位会延迟。这部分不由输入法控制。
使用建议
优先用数字选词,而不是翻页。目标在第一页时,数字选词比翻页快得多,也不触发后续候选的生成。多数常见词都在第一页,数字选词的命中率不低。
每页候选数量不要设太多。每页 5 到 7 是多数场景的平衡点。设到 9 个以上,单页渲染成本上升,实际用到的候选还是前几个,收益不大。
长词用全拼,短词用简拼。全拼的候选池小,翻页快。简拼的候选池大,翻页容易慢。长词用全拼,候选池规模可控。
老机器上减少候选数量。如果设备是老机器、集成显卡、或者经常在远程桌面、虚拟机里工作,把每页候选数设少一些,关闭不必要的云功能,翻页的感受会明显改善。
定期清理用户词库。低频词、误选词、废弃词积累多了会增大候选池。定期清理可以让候选排序更集中,翻页更快。清理频率取决于个人使用习惯,通常几个月清一次就够。
翻页优化不是追求零延迟,是把延迟控制在感知阈值以下。日常使用中,候选池几十条的输入基本感知不到停顿;候选池上百条时,靠设置调整和使用习惯把停顿控制在可接受范围内。知道什么时候该翻页、什么时候该数字选词,比追求某个具体数字更有用。
关于候选词翻页的常见问题
下面 5 个问题是读者反馈中最常被问到的
为什么翻页有时候会卡一下?
翻页的耗时来自两处:候选生成和候选窗口渲染。第一页之后的候选可能是懒加载的,翻页时要即时算出后续条目并重绘窗口。候选总量大、候选词长、系统渲染能力弱时,这个耗时会变得可感知。
候选词每页显示几个比较合适?
没有统一答案。每页 5 到 7 个是多数场景的平衡点:一页能看到足够多的候选,同时单页渲染成本可控。每页 9 个以上,单页信息量大但翻页频率降低;每页 3 到 4 个则翻页频繁,命中率下降。用数字键选词的频率高,可以减少对翻页的依赖。
翻页键可以改吗?
可以。多数版本支持把翻页键改成逗号句号、加减号、方括号、PageUp/PageDown 等几种。改动不影响翻页速度,只影响操作习惯。选择一个跟常用输入法一致的键位,可以减少误操作。
翻页时候选顺序会变吗?
同一串输入,翻页时的候选顺序不会变。候选排序在输入时已经确定,翻页只是按顺序读取。但如果你在翻页过程中继续输入字母,输入法会重新排序,之前看到的位置可能就不再对应同一个词。这是重新计算,不是顺序变化。
关闭云输入能改善翻页速度吗?
在弱网环境下会有改善。云输入要向服务器请求候选,网络延迟会拖慢候选池的生成。关闭后只走本地候选,翻页耗时更稳定。在稳定网络下,本地和云端的耗时差异不明显,改善有限。