fix(actionbars): the cast kick must re-open the rate gates it re-arms the wave for - #1171
Merged
EllesmereGaming merged 1 commit intoAug 3, 2026
Conversation
… the wave for Cooldown swipes started visibly late on 8.7.4, and worse while spamming a keybind. UNIT_SPELLCAST_SUCCEEDED zeroes both rate gates so the cast's own repaint cannot be throttled, and schedules the kick as the guaranteed post-cascade pass. But a cooldown event arriving in the cast's OWN frame consumes that opening: it runs a pass off state read inside the cooldown API's transient window, then re-arms the storm cap to +0.15s and the slow tier to +0.5s. The kick already re-armed the cast wave to survive exactly that theft, but left the gates re-armed, so the corrective pass it exists to perform was capped out of the walk, and the slow tier -- every utility spell, item and macro, which is most of the bar -- kept whatever the transient push painted until its 0.5s gate expired, or until the ~1/sec heartbeat if no event landed on the gate. Measured with a repaint-latency harness across two captures before and one after, roughly 8-11k frames each: swipe start a mean of 304ms and 231ms late over ~240 samples each, max 616ms, falling to a mean of 85ms with nothing past 208ms and the entire 500ms-plus band empty. What named the cause was the shape rather than the mean: both pre-fix captures showed an identical 51 sub-frame paints, a fixed subset always prompt while the rest were always late, which is a tier split and not a throttle. The worst offender in every capture was a utility spell, that is, slow tier. Reopening is self-limiting: the kick runs once per cast behind its pending guard, and when the wave was not stolen both values are already 0, so the common path is unchanged.
dfrisone
force-pushed
the
ab-castkick-gate-reopen
branch
from
August 3, 2026 13:28
bcf68a5 to
0536a09
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Symptom
Cooldown swipes started visibly late on 8.7.4, and worse while spamming a keybind. Reported with video, and the delay was put at "0.5s or more".
Cause
The cooldown walk runs in two cadence tiers:
fastis the curated Essential rotation kit, andslowis every other spell plus items and macros, riding a 0.5s gate.A cast is meant to bypass both gates.
UNIT_SPELLCAST_SUCCEEDEDzeroes_cdWalkNextand_cdSlowNext, then schedules_cdCastKickas the guaranteed post-cascade pass. But a cooldown event arriving in the cast's own frame consumes that opening: it runs a pass on state read inside the cooldown API's transient-disagreement window, and in doing so re-arms the storm cap to +0.15s and the slow tier to +0.5s.The kick already re-armed
_cdCastWaveto survive exactly that theft. It did not re-arm the gates. So the corrective pass the kick exists to perform was capped out of the walk entirely, and the slow tier kept whatever the transient push painted until its gate expired, or until the ~1/sec heartbeat when no event landed on the gate.Fix
Two lines in
_cdCastKick, reopening both gates alongside the wave it already re-arms, for the same documented reason.It is self-limiting: the kick runs once per cast behind its existing pending guard, and when the wave was not stolen both values are already 0, so the common path is unchanged.
Measurement
Found and verified with a repaint-latency harness that times the gap between the engine reporting a button as on cooldown and the button actually being painted. Three captures on the reporter's machine, roughly 8-11k frames each:
The entire half-second-plus tail is gone, which is the slow-tier gate disappearing.
What named the cause was the shape of the distribution rather than the mean: both pre-fix captures showed an identical 51 sub-frame paints, a fixed subset always prompt while the rest were always late, which is a tier split and not a throttle. The worst offender in every capture was a utility spell, i.e. slow tier.
Notes