现在的做法是 进游戏拿服务器时间,和当前客户端时间算出一个差值,每次需要服务器时间的时候再用当前客户端时间和差值计算。
但是如果玩家修改了本地时间,同样会导致算出来的服务器时间不真实,导致一些功能错误。
这个问题应该是游戏中比较常见的。想问一下各位大佬用的什么解决方法
现在的做法是 进游戏拿服务器时间,和当前客户端时间算出一个差值,每次需要服务器时间的时候再用当前客户端时间和差值计算。
但是如果玩家修改了本地时间,同样会导致算出来的服务器时间不真实,导致一些功能错误。
这个问题应该是游戏中比较常见的。想问一下各位大佬用的什么解决方法
为什么每次需要服务器时间的时候再用当前客户端时间和差值计算, 如果要用服务器时间的地方为什么不完全以服务器时间为准
不能每秒都去取服务器时间吧
我是每次过几秒去请求一下服务器更新差值,还有假如差值太大了就判断用户修改了本地时间,提醒用户系统错误,强制不能进游戏
服务端每次交互都会给一个最新的时间,客户端一直更新差值就可以了。
这样也是不准确的吧。我是做的传奇,有些功能就要在人物等级>x且开服时间>y去开启的,如果玩家修改了本地时间,服务器还没更过来最新时间的时候,玩家升级了。这个功能就会被打开 <其实是错误的>
客户端改时间之后,差值就会变大了。每次取时间的时候都是客户端本地时间+差值=服务端时间。另外,客户端控制的东西,怎么样都会打开的。你这个开启应该在服务端。
我这边的处理是,每次重新唤起游戏界面时(从其它应用切回游戏的应用),就重新获取服务器时间差。
需要留意的是重新获取服务器时间差的过程(一般其实也就300ms左右),setTimeout 之类的时间计时器回调要暂停处理。
主要就是为了防止玩家改系统时间吧?
我之前是这样做的,启动游戏的时候拉取一次网络时间,并同时获取一下当前手机系统开机的时长(安卓和ios都有对应的api)。之后获取时间就通过每次去获取当前的开机时长 - 第一次获取的开机时长 + 第一次获取的网络时间戳来计算出当前的网络时间。
好处就是只需要获取一次网络时间,之后的就一直都是用的准确的网络时间
1.客户端如果在无操作场景 有用到游戏倒计时之类的, 则每几s轮询 查询最新服务器时间 或者心跳带时间过来, 差值过大提醒用户重新登录或者什么的,。
2.如果在你说的这种场景, 升级这些操作与时间相关的接口 返回信息时都必须带服务器时间回来 检验时间, 3.就算客户端时间乱了 服务端这边也不应该会触发后续场景 4.如果客户端人员不好操作, 则全权交给服务端验证时间
你这个小游戏用不了的
并且 ios需要加权限
谢谢。相对来说1还是比较可行, 2和3改动量太大了 
重要的事情走服务器接口判定(玩家的金币等数值、游戏功能的开放、领奖等), 不重要的事情用客户端时间+时间偏移量判定(客户端的UI显示、引导提示等), 每一个与服务器的通讯接口同步一次客户端与服务器的时间偏移量
协议包头里面带上时间戳也可以
获取1次服务器时间,并记录当前game.totalTime(游戏运行时间),之后只需要拿game.totalTime做差值计算就行了
这个我觉得可行!!!
谢谢大佬,现在项目的架构已经完全成熟且已经上线,针对不同玩家开放的不同功能就是前端做的校验,1这种大改动有点不现实。每一次服务器通讯同步的话可能还是无法避免错误的现象。不过楼下说的用游戏运行时间的差值来计算我觉得比较可行,不知道有什么弊端
不行的,还是无法达到精准的实时同步
后端不做验证,那么这个就是避免不了,改系统时间,破解改包