首页 > 代码库 > 网络游戏前后端时间同步

网络游戏前后端时间同步

网络游戏中会涉及到多个终端,各个终端以及服务器的系统时间都会存在一定的差异。
如何在在游戏中处理好这种差异呢?


一 使用前端时间
直接获取终端的时间,用来计时,这种方式是很多单机游戏使用的方式。
这种方式时存在漏洞的,例如我们记录进入关卡的时间(客户端时间),然后开始计时,每10分钟恢复1点体力。
当我修改了我的客户端时间之后,体力的值也随之变化了。
即使在后端做了校验,前端显示也会有问题,体验并不好。
或者如果我前端的时间更快,前端显示我已经恢复了体力,但是发送到后端校验时缺失败了。


二 使用后端时间
另外一种方式时都使用后端时间,这又会有什么问题呢?
最明显的就是当前后端不在同一个时区的时,获取的时间并不一致。
另外就是后端的时间每次都去更新比较麻烦。
比如说我要显示倒计时,每次打开界面的时候都需要请求一次系统时间,
然后需要另外在开一个定时器,每秒做一次减一操作。


三 兼顾前后端时间
这是我们游戏最终才有的一种方法。
就是在登录的时候,请求一次系统时间,然后计算前后端时间的差值,
然后再获取前端时间的时候,加上这个差值。


这样就可以完美的解决一二中提到的问题。
但是这又会有另一个问题,当我登录游戏之后,然后将游戏进入后台,然后修改终端时间,
这又会出现一中提到的问题。


我们的解决方法是在从后台进入前台时,重新请求一次后台时间,计算时间差。


lua的代码如下:


-- 保存服务器对时间差
local timeDelta = 0 


-- 根据从服务器请求带的时间serverTime和本地时间os.time()计算出时间差serverTime
function setServerTime(serverTime)
    timeDelta = serverTime - os.time()
end


-- 返回本地时间加上时间差之后的时间
function getTime()
    return os.time() + timeDelta
end




网络游戏前后端时间同步