对战游戏,对于子弹的处理是这样的
1.服务器判断产生子弹时机 转发给客户端 A和客户端B 客户端根据方向发射子弹
2.但是两个客户端貌似会因为运行的差异 ,导致两边会有一些不同步。
请问各位大佬。这个情况应该怎么解决。
1赞
随机数种子
你是指收到发射子弹的时机以及子弹运动的速度等不一致吗?
发射子弹时机一样 但是速度不一样。就是结合delta也会有差异
大佬 细说呢。
delta 不一致, 代表 两机帧率不一
两种方法
- 指定逻辑帧, 由服务端推送帧, 按服务端帧执行子弹行动, 类似帧同步, 只是简化
- 指定秒数, 如使用tween, 服务端告知前端子弹要跑多少秒, 如果要时间上精确, 可以在游戏初始化时同步服务端时间戳, 类似客户端把自己时间, 时区发给服务端, 服务端计算(请求延迟)值, 然后回应时服务端回应自身时间戳与请求延迟给客户端, 客户端整个请求回应时间都记下后扣去请求延迟 + 服务端时间戳就能取得当前服务端精确时间(st), 同时建立本地时间戳(lt), 之后不需要再问服务端时间, 只需要把当前本地时间(ct)- (lt) + (st)就能推算出服务端当前时间。 那麽服务端就可以説子弹起点与终点, 起始时间戳与结束时间戳, 客户端收到后计算延迟等因素后就能得出子弹位置, 并且继续向某位置飞行
1赞
服务器在广播的【子弹时机】的数据中,添加玩家此时的位置和角度的字段,客户端生成子弹可以根据服务器广播的位置和角度来演算,这个时候位置、角度和时机都是以服务端为准的,也就是一致的。
帧率不一致的问题,常见的解决方案是用update中的deltaTime对飞行的速度进行补偿
比如
lerp(0,45,deltaTime * 10);
对于服务器延迟问题,参考楼上的公式,有两种方式:
1.需要对动画效果进行延迟补偿,这种情况下需要有一个服务器端计步器,并通过服务的延迟和计步器数,对子弹动画的值进行预测,举个例子,服务器延迟为1秒,那么创建动画的起始位置应该为时间轴1秒后的动画效果,具体表现为,对于高延迟的玩家,你可能会看到子弹是从半空产生的(玩家的前面),而非从玩家的坐标创建动画。这会有一个瞬移的效果。
2.(我推荐)通常来说子弹动画可能不需要做很精准的预测,但是可以对其命中的判断做以上预测即可。这会简单许多。
好的 感谢
好的 感谢回复