[]贪吃蛇大作战 桢同步的问题

各位大神好,遇到个折腾了一夜的一个问题!求大神指点

目前处于学习阶段,想做个包含各类技术点的项目练手,然后选了吃蛇大作战,但是在桢同步那边遇到个问题:
 
跟其他玩家在同一个房间的时候,我需要绘制其他玩家的移动轨迹,跟服务器交互的时间是40毫秒,但是因为网络等其他问题导致每次接收到的时间都不一样,时间长的有300毫秒,所以我需要根据玩家上次的操作(比如转向角度,速度),去先本地计算并绘制,等到下次接收到服务器广播过来的最新数据,再去覆盖本地的数据,因为毕竟是本地计算的,跟服务器广播过来的真实数据肯定有偏差的,所以在每次真实数据过来的时候,重新绘制会导致蛇一闪一闪的,请问下这个应该怎么解决?还是我这个实现思路就有问题? 
已邀请:

三包包

赞同来自:

这么做闪烁是肯定的。 
 
首先取消本地预算。    完全按照服务器来 
 
位置在A 服务器返回位置B   
 
然后计算B和A的距离,除以一个阀值(你自己定义的移动速度 或者随便填)  这么做 主要是让它保持每帧都移动一样的距离  这样就不会闪烁了
 
移动过程中 再次收到服务器位置消息, 那么现在的位置就成了A  然后再次计算移动       
 
还有 千万不要用getTimer时间差算移动 在桢不平稳的时候 也会闪烁    
 
如果以上还不行  再留言 我告诉你用getTimer方式移动  但是这样会导致桢不平稳闪烁

流荒

赞同来自:

折腾一夜确实挺纠结的,在线等!问题解决项目开发完成后,愿意把代码共享出来,求指点

星星

赞同来自:

本地预算位置A,服务器返回位置B,试试A Tween B

三包包

赞同来自:

我上面说的是传统做法 再改装成阀值  如果觉得不好实现 还有一个更简单的。
 
服务器不返回具体位置  而是返回 移动方向 
 
例如 服务器返回 上 下 左 右     
 
如果返回上  你就按照你自己想的移动速度 控制蛇向上  一直到下次收到服务器消息 又同时不为上的时候 才选择转换方向

nick17189

赞同来自:

大兄弟,传统帧同步的核心理念就是服务器进行帧调度,客户端根据帧进行计算和渲染。
 
你这本地已经开始了预先计算,说明已经超出了服务器的控制,当服务器数据过来之后,难免会遇到闪烁的现象。(除非你能完美解决偏差的矫正问题,这个之前守望先锋的开发团队有一篇技术分享是关于矫正的,实现上还是比较费力的)
 
说到底,就是你本地的计算,不应该超出服务器通知你所能达到的最大帧。
 
不求赏金,能提供个思路就好。

Mr 董

赞同来自:

数据跟绘制分离.相当于两层.第二层就是想办法造假,然后就看各自的神通了
拉扯属于重绘.预测数据跟服务器的数据偏差太大,或者掉线,重新加入都会导致重绘.
我们的做法比较粗暴.直接把场景序列化发一个完整快照,然后跟后续的帧数据.
我司做过类似的帧同步项目.用的是Udp.类似打飞机那种.客户端把所有操作推送到服务器,服务器收到后整理成帧广播.其他玩家的行动有延迟感.数据预测位置会存在偏差.只要偏差不大就没必要来回拉.数据跟绘制是分离的,绘制总会想办法"圆滑"到数据所在的位置.
tcp的流属性以及默认的包重发参数有时候会表现很糟糕.

LIU JIAN YOU

赞同来自:

前后端的位置计算都用时间差乘以速度 这样同步后的误差就小;时间t = Laya.Brower.now();  例如开始帧时间点是t0,那么第2帧第3帧的位置就是  S1 = (t1-t0)*v;   S2 = (t2-t0)*v; ..........   反正所有操作点都要取时间点计算;你可以用客服端的时间也可用服务端时间,做好时间同步

该问题目前已经被锁定, 无法添加新回复

商务合作
商务合作