子弹同步问题

对战游戏,对于子弹的处理是这样的
1.服务器判断产生子弹时机 转发给客户端 A和客户端B 客户端根据方向发射子弹
2.但是两个客户端貌似会因为运行的差异 ,导致两边会有一些不同步。
请问各位大佬。这个情况应该怎么解决。

1赞

随机数种子

你是指收到发射子弹的时机以及子弹运动的速度等不一致吗?

发射子弹时机一样 但是速度不一样。就是结合delta也会有差异

大佬 细说呢。

delta 不一致, 代表 两机帧率不一
两种方法

  1. 指定逻辑帧, 由服务端推送帧, 按服务端帧执行子弹行动, 类似帧同步, 只是简化
  2. 指定秒数, 如使用tween, 服务端告知前端子弹要跑多少秒, 如果要时间上精确, 可以在游戏初始化时同步服务端时间戳, 类似客户端把自己时间, 时区发给服务端, 服务端计算(请求延迟)值, 然后回应时服务端回应自身时间戳与请求延迟给客户端, 客户端整个请求回应时间都记下后扣去请求延迟 + 服务端时间戳就能取得当前服务端精确时间(st), 同时建立本地时间戳(lt), 之后不需要再问服务端时间, 只需要把当前本地时间(ct)- (lt) + (st)就能推算出服务端当前时间。 那麽服务端就可以説子弹起点与终点, 起始时间戳与结束时间戳, 客户端收到后计算延迟等因素后就能得出子弹位置, 并且继续向某位置飞行
1赞

服务器在广播的【子弹时机】的数据中,添加玩家此时的位置和角度的字段,客户端生成子弹可以根据服务器广播的位置和角度来演算,这个时候位置、角度和时机都是以服务端为准的,也就是一致的。

帧率不一致的问题,常见的解决方案是用update中的deltaTime对飞行的速度进行补偿
比如

lerp(0,45,deltaTime * 10);

对于服务器延迟问题,参考楼上的公式,有两种方式:

1.需要对动画效果进行延迟补偿,这种情况下需要有一个服务器端计步器,并通过服务的延迟和计步器数,对子弹动画的值进行预测,举个例子,服务器延迟为1秒,那么创建动画的起始位置应该为时间轴1秒后的动画效果,具体表现为,对于高延迟的玩家,你可能会看到子弹是从半空产生的(玩家的前面),而非从玩家的坐标创建动画。这会有一个瞬移的效果。
2.(我推荐)通常来说子弹动画可能不需要做很精准的预测,但是可以对其命中的判断做以上预测即可。这会简单许多。

好的 感谢

好的 感谢回复