一日一点RakNet(19)--Timestamping your packets

 

时间戳

 

如何在不同的计算机上相同的时间帧内相应同一个事件

       时间戳与本地系统时间并无关系。很不幸,每个系统都有不同的本地系统时间。如果仅仅通过网络发送获得的本地系统时间,你得到的时间是其他机器上得时间,这条消息除了告诉你发生了什么之外,没有其他有价值的信息了,因为你仅仅知道你自己的系统时间,其他人的系统时间都是不知道的,因此你不知道这个事件在你本机要什么时候触发。RakNet的时间戳功能可以让你读取其他人系统相对于你系统的时间值,使得你将精力投入到游戏设计中,而不是考虑其他系统的系统时间。插件自动透明实现了这个功能,即使是存在ping波动,也可以获得十分精确的准确度。

 

       假设在客户端即将发生一个事件,它的本地系统时间是2000,服务器上的系统时间为12000,另外一个远端系统的时间是8000.如果数据包没有打时间戳调整时间,服务器会获得时间2000,或者说是10000ms以前的事件。同样,另外的客户端会得到2000,这样比他自己的本地时间要提前6000ms。

       幸运得是,RakNet为你处理了这种情况,补偿了系统时间和ping。使用相对时间,服务器会看到这个事件是大概在ping/2ms前发生(相对于每一个客户端)。简言之,你仅仅需要使用timestamps,你要做的就是正确地编码数据包,不需要额外考虑其他的任何事情。

       参见Creating Packet中的例子,学习如何在你的数据包中打入时间戳。

       注意:推荐使用GetTime.h中的时间函数来获取系统的时间。这是一个高精度的定时器。你可以使用Windows的函数timeGetTime(),但是这个函数的时间值不准确。时间戳也依赖于自动的pinging,因此你需要调用SetOccasionalPing()方法来保证这个时间的准确性。

 

By 北洋小郭

转载请注明出处,切勿用于商业。谢谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值