就不可能做到客户端时间和服务器时间一致。你在错误的方向上努力,有什么用?
功能开启要依赖服务端时间。即使你客户端时间到了,你也要请求服务端来确认这个时间。要不然你做什么都扯淡。
你一个功能开启,请求一下服务端时间很困难吗?
传奇项目跟时间挂钩功能开启会很多很多,检测会很频繁,本来是拿前端算出来的时间直接比较的,按照你说的一直请求也不合适。而且现在已经上线稳定运行两年了,只是偶尔会有玩家恶意修改时间,也不想去大改。我现在保底做法是检测到恶意修改时间的直接给踢下线其实也不会有问题,就看有没有更好的办法,比如楼上说的用游戏运行时间计算
我们做法是开始游戏的时候读取服务器时间,然后有个地方一直跑时间,在update里更新这个时间就好了,提供接口获取当前时间这种
运行时间一样不靠谱的, 有一个东西叫做变速齿轮
服务器时间不是每次心跳更新嘛
感谢回复,我刚才看了一下cocos的底层代码,游戏运行时间用的是performance.now计算的,查阅了一下相关资料。理论上主流浏览器不会受到变速齿轮影响
假如是web端游戏,我直接跟你讲会受到变速齿轮的效果,反正update是会被加速的,setTimeout也会被加速。
你直接3秒钟去请求一下服务器时间,假如两次返回的时间差小于3000ms那么就是绝对用了变速齿轮,直接踢了就行了。
对,现在就是这样做的。每三秒取一下本地时间,和上次取的时间做对比,要是差值大于10秒了直接给踢了。 想看看有没有其他更好的处理方式
既然要的是服务器时间,就应该以服务器为准,为什么非要在客户端计算服务器时间?客户端的数据经过服务器的时候不判断时间吗
我想知道是什么游戏,我想去恶意修改时间 
跟你一样迷惑,不过我在意的不只是变速齿轮的影响,还在意游戏界面APP被挂起时会不会暂停计数(导致切回游戏界面的时候不准确)。
综上考虑还是继续用我旧方案了
就是限时活动呗,哪个游戏没有个限时活动,就算改时间了,客户端强制开启,但是你们服务器不检测么?进了活动场景又如何?客户端本来就应该做未开启状态和开启状态,只要服务器返回未开启,那就是未开启状态,以服务器返回结果为准,而且同步时间 心跳每次返回服务器时间不就完事了?至于那么麻烦么?
那你这游戏的客户端允许脱机吗?断线重连怎么处理
不是活动相关,活动确实是服务端控制的。我说的是针对个人的系统功能,一开始可能因为系统太多了,为了分担服务器压力才把这个放在前端检测。心跳包有间隔延迟,不是每秒同步的,现在最省事的做法就是每次心跳返回时间,和上次差值过大直接给踢了
断线重连会重新取服务器和客户端时间计算差值
感谢大佬们回复,感觉这个问题如果检测不放在服务端就是个死局
只能间隔几秒去和上次取的客户端时间做对比,差值太大直接踢下线
刚看到这个帖子的时候,有点震惊,确实第一次听说这种需求,既然要时间同步,那么理论上肯定是以某一个时间为准就行了,网络游戏我的理解所有效验肯定以服务器时间为准,为啥还存在本地时间的概念。如果是新项目,数据协议应该自带当前服务器时间,如果是老项目,老接口,那也应该通过在心跳中同步时间或者其他方式同步服务器时间,网络游戏还存在本地时间,这个方向就已经完全错了。
功能按钮的显示在前端做的验证(ps.可能是因为功能太多检测太频繁),里面真正的操作玩法其实是服务器有做校验,会给玩家提示数据异常。心跳同步不是每秒检测,所以修改本地时间可能会在两次心跳之间触发某个按钮显示,我现在想优化的是看能不能前端计算时间给按钮都不让显示出来 


