RakNet--Timestamping your packets

Jenkins Software

时间戳

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

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




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

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

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

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

See Also

 

Index
posted @ 2012-09-17 01:10  杂草  阅读(280)  评论(0编辑  收藏  举报