From 8f14f3190e13043f6bfa021a6a9fb33cddafd5c5 Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Mon, 25 May 2026 11:44:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(metronome):=20=E4=BF=AE=E5=A4=8D=E7=AC=AC?= =?UTF-8?q?=E4=BA=8C=E6=8B=8D=E5=BB=B6=E8=BF=9F=E4=B8=A4=E5=80=8D=E9=97=B4?= =?UTF-8?q?=E9=9A=94=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit drift correction 逻辑写反了: drift = now - nextTickAt (此时为负数,下一拍还在未来) nextDelay = intervalMs - drift ❌ = 2 × intervalMs 正确做法直接计算"目标时刻距现在还有多久": nextDelay = nextTickAt - now ✅ 现象:点击开始,第一拍立即响,但第二拍要等两倍拍间隔才响。 现在第一拍响完就立刻按 BPM 节奏进入第二拍。 Co-authored-by: Cursor --- TUICallKit-Vue3/hooks/useMetronome.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TUICallKit-Vue3/hooks/useMetronome.ts b/TUICallKit-Vue3/hooks/useMetronome.ts index 8bbaa905..34b24199 100644 --- a/TUICallKit-Vue3/hooks/useMetronome.ts +++ b/TUICallKit-Vue3/hooks/useMetronome.ts @@ -142,8 +142,7 @@ export function useMetronome(options: MetronomeOptions = {}) { beatIndex.value++ nextTickAt += intervalMs.value - const drift = Date.now() - nextTickAt - const nextDelay = Math.max(0, intervalMs.value - drift) + const nextDelay = Math.max(0, nextTickAt - Date.now()) timer = setTimeout(tick, nextDelay) }