进入倒计时的界面前肯定是先获取剩余的时间然后客户端做倒计时,那就有一个问题了,怎么保证客户端的倒计时一定和服务器的同步?用runAction的方式还是schedule的方式准确?
网游由于带入通信, 客户端和服务端的绝对同步时不可能的
个人建议让服务器下发开始倒计时指令, 客户端收到后开始倒计时, 这样服务器将先于客户端到计时完成, 对于多个客户端只考虑网络延迟因素也是公平的
runAction和schedule在不发生卡顿时, 效率基本一样
奥,我明白了,就是说没必要做到绝对准确吧。runAction在发生卡顿的时候会不会更准确些?
runAction本质上是schedule执行update而来的,
Director::restartDirector()可见 getScheduler()->scheduleUpdate(getActionManager(), Scheduler::PRIORITY_SYSTEM, false);
要跟准确可以用schedule
其实差不多的, 哪个方便用哪个
。。。我们游戏的做法是。。
比如你向服务器发送一个请求。。服务器除了并开始倒计时。。那么服务器返回一个绝对时间。。也就是到什么时候CD结束。
客户端用这个时间减去当前时间。。就是倒计时。。
这样做需要有两个地方注意。。
第一。客户端登陆的时候,把客户端这边的绝对时间传给服务器对比,服务器返回时间差=(服务器的绝对时间-客户端传来的绝对时间)。那么客户端写一个getTime()的函数,要把这个时间差加上去。。
第二。客户端这边到了绝对时间,向服务器再次发送请求的时候,服务器用服务器记录的CD结束时间和服务器当前时间做对比,如果不通过,纠正服务器的返回时间差。
如果客户端不去随意修改客户端时间,是不会有问题的,即使修改了,再次发送请求的时候,服务器也能纠正这个值。
恩,我想弄清楚的其实是这种情况,倒计时如果受到手机性能问题的影响,一秒超过或少于真实的一秒,到时候客户端没有改时间,时间到了点击却不通过怎么解决?
服务器发送修正值啊。。
然后会看到客户端的CD又出现了。。
然后到了再点就好了啊 。。
这种情况很极限。。很难出现的。。