Subtick的移动判定办法以及如何变成CSGO的手感

本专栏的参考是两个在10月4日与10月5日的reddit的帖子:

1) r/GlobalOffensive/comments/17042c8/why_movement_in_cs2_might_feel_different_for_you/

2) r/GlobalOffensive/comments/170nzzj/analysis_of_movement_in_cs2_subtick_and_more/


在这里关联两个视频,一个是Fiveso很早前就做了的(我也翻译了的),另一个是帖1对应的视频。贴1人是Faceit 10级+kz玩家。本专栏以概括帖子2为主,并把帖子1的玩家提出来的解决方案放在文章最后。帖子2是基于帖子1的想法给出的实验证明贴。


两个关联的视频:

Fiveso的熟肉:

https://www.bilibili.com/video/BV1HX4y1i7iG/

10级玩家的视频:

https://www.youtube.com/watch?v=-El_3dibyu0


相关内容概括:

  1. subtick目前的机制是1/64秒完成一次传输。所以是64tick。但是CS2会记录你按下操作的准确时间点,然后相应地计算到达下一个tick时的初速度。在两个tick之间你不会动。大概一个被subtick记录的移动指令像下面这个样子。你可以看到它被视为"subtick_moves"。

    subtick_moves

    {

    button: 8

    pressed: true

    when: 0.0173373781

    }

  2. subtick里你按下后的初速度是变动的,根据你具体按下时间而定的;而CSGO 64tick在下一个tick到来时,结算的初速度值永远是21.484375u/s(作为参考,人物模型高度为72u)。计算的该速度值的办法如下:

    Calculating 5.5 * (1 / 64) * 250 * 1 gives a value of 21.484375.


  3. 其中这里面的数字对应的是

    sv_accelerate = 5.5

    tickrate = 64

    maxspeed (持刀最高移速) = 250

    friction (阻力值)= 1

  4. 帖1给出了去除subtick影响的移动办法(de-subtick)。那就是使用alias指令。V社之前想过要抹除alias并且不允许多个动作被绑定到同一个键位上(多重动作效果与alias相同),但是在玩家们都反对的结果下又允许搞alias和多重动作了。使用alias会使下一个tick结算时速度为21.484375u/s。请注意,由于subtick本质上还是使用的64tick,你的旋转加速(strafing)是与64tick一致的,这跟128tick会有区别。

  5. 移除subtick影响的初速度问题办法如下。这也只是其中一种办法。bhop玩家里也有人提出过+jump的初速不同的解决办法,那就是把跳跃绑定为两个连续的操作"+jump;-jump"。

  6. 帖子2通过改变服务器timescale来进行验证。如果你使用alias来改变wasd的移动的话,首个移动tick的速度顶峰永远会是前面说的21.x的速度值。


alias "_checkw" "-forward; alias checkw"

alias "+w" "+forward; alias checkw _checkw"

alias "-w" "checkw"

bind "w" "+w"


alias "_checks" "-back; alias checks"

alias "+s" "+back; alias checks _checks"

alias "-s" "checks"

bind "s" "+s"


alias "_checka" "-left; alias checka"

alias "+a" "+left; alias checka _checka"

alias "-a" "checka"

bind "a" "+a"


alias "_checkd" "-right; alias checkd"

alias "+d" "+right; alias checkd _checkd"

alias "-d" "checkd"

bind "d" "+d"


alias "_checkcrouch" "-duck; alias checkcrouch"

alias "+crouch" "+duck; alias checkcrouch _checkcrouch"

alias "-crouch" "checkcrouch"

bind "ctrl" "+crouch"


alias "_checkwalk" "-sprint; alias checkwalk"

alias "+walk" "+sprint; alias checkwalk _checkwalk"

alias "-walk" "checkwalk"

bind "shift" "+walk"


host_writeconfig