多人游戏客户端线性插值:Node.js与JS UTC时间不一致问题求解
解决服务器与客户端UTC时间同步问题
核心思路
不要直接依赖客户端本地系统时间,通过时间偏移量校准,让客户端计算出与服务器对齐的统一UTC时间,彻底解决两端时间不一致的问题。
具体实现步骤
计算时间偏移量
- 客户端发起时间同步请求,记录发送时的本地时间
clientSendTime(使用Date.now(),Node.js和浏览器均支持) - 服务器收到请求后,立即返回当前服务器时间
serverReceiveTime(同样用Date.now()) - 客户端收到响应时,记录本地时间
clientReceiveTime - 计算单向网络延迟:
delay = (clientReceiveTime - clientSendTime) / 2 - 计算时间偏移量:
timeOffset = serverReceiveTime - (clientSendTime + delay) - 此后客户端的统一UTC时间为:
Date.now() + timeOffset,该时间与服务器时间基本一致
- 客户端发起时间同步请求,记录发送时的本地时间
定期校准偏移量
网络延迟可能随时间波动,建议每隔5-10秒重新执行一次时间同步流程,更新timeOffset,避免长期运行后时间偏差过大。适配子弹SpawnTime的插值逻辑
- 服务器创建子弹时,记录服务器端的
serverSpawnTime(Date.now()),并将该值同步给客户端 - 客户端计算子弹已存在时长时,使用校准后的统一UTC时间:
ActiveTime = (Date.now() + timeOffset) - serverSpawnTime - 后续的
UpdateFrames、X、Y计算逻辑保持不变即可
- 服务器创建子弹时,记录服务器端的
关键注意事项
Date.now()返回的是自1970年1月1日UTC以来的毫秒数,本身就是UTC时间戳,只是客户端本地系统时间不准会导致偏差,偏移量校准就是为了修正这个问题- 绝对不要直接使用客户端本地的
Date.getTime()或Date.now()与服务器同步的时间戳计算,必须通过偏移量对齐到服务器时间 - 时间同步请求要尽量轻量化,避免携带额外数据,减少请求处理延迟对偏移量计算精度的影响
内容的提问来源于stack exchange,提问作者cs6413110
相关产品推荐
相关产品推荐

