Sub-tick Movement Isn't Mysticism: Counter-Strafe Windows, Crosshair Reset, and That Half-Frame Debt

October 11, 2026 at 14:00:06

A technical breakdown of how CS2's sub-tick input system changes counter-strafing timing, crosshair recovery, and the gap between visual reset and actual weapon accuracy—with local-server tests you can reproduce.

Let's start with the conclusion: in CS2, when you counter-strafe, the server doesn't wait for the next tick to see your input. It sees a timestamped input event sandwiched between two ticks. This changes the math of counter-strafing, and it changes which frame your crosshair reset actually lands on.

1. Subtick turns counter-strafing from a grid into a sliding ruler

In CSGO, the logic was easy to grasp: you press the opposite key on tick N, the server resolves your velocity on tick N+1. Between those two ticks is 1/64th (or 1/128th) of a second, and your counter-key has to push velocity below the threshold within that window—otherwise your bullet drifts.

CS2 doesn't work that way. Movement inputs are uploaded with timestamps, and the server interpolates between ticks. Sounds more precise, but in practice the counter-strafe window feels narrower—because the moment you release the forward key, deceleration starts calculating, and if the opposite key lands a hair late, the velocity curve peaks before it drops.

I ran a controlled test on a local server with sv_cheats 1 and cl_showpos 1: same player, same AK, AD counter-strafe against a static target. In CSGO, the stable window was roughly 2–3 ticks after pressing the opposite key. In CS2, if the input timestamp lands dead center between two ticks, velocity zeroes out half a tick earlier—but if it lands near a tick boundary, it's actually slower than CSGO.

This is why so many players say CS2 counter-strafing feels inconsistent. It's not a feel issue. It's the phase relationship between your input timestamps, your current frame rate, and network jitter.

2. Crosshair reset doesn't happen on the frame you think

Another overlooked variable is crosshair reset. You fire a shot, the crosshair spread starts contracting, and you assume that once it's done, you can fire the second shot. But the crosshair animation curve and the weapon's actual accuracy recovery curve are not the same line.

In CS2, the crosshair reset animation is affected by cl_crosshair_recoil and frame generation time. If your frame times are unstable, the crosshair may look fully reset while weapon accuracy is still a few percentage points off. This is especially visible on AK second-shot taps and M4 spray transfers.

My verification method is simple: on a workshop map, tap two shots into a wall with weapon_debug_spread_show 1 enabled. You'll see that after the crosshair animation finishes, the accuracy box still hasn't fully closed. That gap differs between 144Hz and 60Hz—the longer the frame time, the bigger the offset between animation and accuracy.

So the habit of "shoot when the crosshair resets" needs to be pushed back slightly in CS2. Not to make you wait, but to make you aware of where that slight delay lives.

3. Three reproducible local tests

Test one: AD counter-strafe. With the same weapon, press the opposite key at integer-multiple frames of your monitor's refresh rate and at half-frame positions. Record when velocity hits zero in cl_showpos. You'll see the window fluctuate with phase differences.

Test two: crosshair reset. Enable spread display, fire two taps, and compare the moment the crosshair animation closes versus when the accuracy box closes. Run it once at 60Hz and once at 144Hz.

Test three: sub-tick input. Use net_graph 1 to check your input latency and how it aligns with server ticks. If your ping jitter exceeds 5ms, counter-strafe window stability drops noticeably.

None of these require third-party tools—a local server and the console are enough. Once you've run them, you'll understand: CS2 movement didn't get harder. It got slipperier. The point you used to hit through muscle memory now needs to be re-located through understanding.

Counter-strafe windows, crosshair reset, and sub-tick input are all the same debt in CS2. Once you settle the account, your first shot truly belongs to you.