I4.01.2throttle at a fixed rate设计

节流按固定频率执行

别名: 节流 · throttle · 频率上限 · leading throttle

概念解释

滚动、拖动、指针移动会在一秒里涌出几十上百个事件,过程本身就是任务,不能等它停。节流(throttle)给执行加上频率上限:事件持续到来时,至多每隔一个间隔跑一次,用当时的取样代表这一小段。它保证过程中一直有更新,同时把工作量钉在可预算的速率上。

和「停稳了再做一次」不是同一件事。节流要的是运动途中的规则取样,不要最后一次才亮相。

机制

连续输入没有可靠的结束标志。滚动可能持续数秒,拖一条滑轨可能一直按着。如果工作绑在每一个原生事件上,主线程和网络会被事件装置打满,帧时间被自己的处理吃掉,跟手反而变差。节流把「事件流」改写成「节拍器」:一个间隔里只承认一次执行。常见的 leading 做法是间隔的第一拍立刻跑,让手指刚动的那一帧就有位置;后面的事件要等下一格。trailing 则保证松手时的最后位置也会落到,避免停在中间取样。

节流保留的是时间上均匀的样本,不是事件的全集。对滚动位置、窗口宽度、拖动坐标,均匀样本够用;对「每一个字符都必须处理」的串,均匀样本会丢掉中间字符。

边界

任务的语义在「停下来的那一拍」而不在途中(搜完整词、校验完整邮箱),节流会在中途不断拿半成品去跑,既浪费又用错值。按钮的重复点击不该靠节流吞掉——该禁用或做成明确的步进,否则人不知道哪一次算数。跟手绘制、乐器类控制需要接近帧率的取样,节流间隔一旦明显大于一帧,轨迹会呈台阶。电池和后台标签页上,固定频率仍可能过高,需要和页面可见性、设备帧率对齐,而不是写死一个毫秒数。

怎么落地

  • 用在滚动监听、拖动预览、窗口 resize 的实时预览、指针移动的采样上报;不要用在「输入停稳后搜一次」或「提交一次」。
  • 过程中要跟手,选 leading,让第一拍立刻有位置;松手后的最终值也要落地时,加 trailing 补最后一次。
  • 间隔对齐显示刷新或业务可承受的请求速率,而不是对齐原生事件有多密。
  • 验证:按住滚动若干秒,处理次数应接近「秒数 × 频率」,而不是原生事件数。松手后最终位置必须正确。把同一套频率接到搜索框上作为反例:中途每个节拍都拿半个词去查,即用错了策略。

延伸

  • 同组I4.01.1 防抖延后执行直到输入停止 · I4.01.3 参数选择直接影响响应感与请求量
  • 相邻I1.04 输入延迟与跟手性 · I4.09 节奏与操作韵律
  • 站内检索throttle · leading edge · rate limiting input

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I4.01.2