[]贪吃蛇大作战 桢同步的问题
各位大神好,遇到个折腾了一夜的一个问题!求大神指点
目前处于学习阶段,想做个包含各类技术点的项目练手,然后选了吃蛇大作战,但是在桢同步那边遇到个问题:
跟其他玩家在同一个房间的时候,我需要绘制其他玩家的移动轨迹,跟服务器交互的时间是40毫秒,但是因为网络等其他问题导致每次接收到的时间都不一样,时间长的有300毫秒,所以我需要根据玩家上次的操作(比如转向角度,速度),去先本地计算并绘制,等到下次接收到服务器广播过来的最新数据,再去覆盖本地的数据,因为毕竟是本地计算的,跟服务器广播过来的真实数据肯定有偏差的,所以在每次真实数据过来的时候,重新绘制会导致蛇一闪一闪的,请问下这个应该怎么解决?还是我这个实现思路就有问题?
目前处于学习阶段,想做个包含各类技术点的项目练手,然后选了吃蛇大作战,但是在桢同步那边遇到个问题:
跟其他玩家在同一个房间的时候,我需要绘制其他玩家的移动轨迹,跟服务器交互的时间是40毫秒,但是因为网络等其他问题导致每次接收到的时间都不一样,时间长的有300毫秒,所以我需要根据玩家上次的操作(比如转向角度,速度),去先本地计算并绘制,等到下次接收到服务器广播过来的最新数据,再去覆盖本地的数据,因为毕竟是本地计算的,跟服务器广播过来的真实数据肯定有偏差的,所以在每次真实数据过来的时候,重新绘制会导致蛇一闪一闪的,请问下这个应该怎么解决?还是我这个实现思路就有问题?
没有找到相关结果
已邀请:
7 个回复
三包包
赞同来自:
首先取消本地预算。 完全按照服务器来
位置在A 服务器返回位置B
然后计算B和A的距离,除以一个阀值(你自己定义的移动速度 或者随便填) 这么做 主要是让它保持每帧都移动一样的距离 这样就不会闪烁了
移动过程中 再次收到服务器位置消息, 那么现在的位置就成了A 然后再次计算移动
还有 千万不要用getTimer时间差算移动 在桢不平稳的时候 也会闪烁
如果以上还不行 再留言 我告诉你用getTimer方式移动 但是这样会导致桢不平稳闪烁
流荒
赞同来自:
星星
赞同来自:
三包包
赞同来自:
服务器不返回具体位置 而是返回 移动方向
例如 服务器返回 上 下 左 右
如果返回上 你就按照你自己想的移动速度 控制蛇向上 一直到下次收到服务器消息 又同时不为上的时候 才选择转换方向
nick17189
赞同来自:
你这本地已经开始了预先计算,说明已经超出了服务器的控制,当服务器数据过来之后,难免会遇到闪烁的现象。(除非你能完美解决偏差的矫正问题,这个之前守望先锋的开发团队有一篇技术分享是关于矫正的,实现上还是比较费力的)
说到底,就是你本地的计算,不应该超出服务器通知你所能达到的最大帧。
不求赏金,能提供个思路就好。
Mr 董
赞同来自:
拉扯属于重绘.预测数据跟服务器的数据偏差太大,或者掉线,重新加入都会导致重绘.
我们的做法比较粗暴.直接把场景序列化发一个完整快照,然后跟后续的帧数据.
我司做过类似的帧同步项目.用的是Udp.类似打飞机那种.客户端把所有操作推送到服务器,服务器收到后整理成帧广播.其他玩家的行动有延迟感.数据预测位置会存在偏差.只要偏差不大就没必要来回拉.数据跟绘制是分离的,绘制总会想办法"圆滑"到数据所在的位置.
tcp的流属性以及默认的包重发参数有时候会表现很糟糕.
LIU JIAN YOU
赞同来自: