关于dota2同步方式
Issues · ValveSoftware/Dota2-Gameplay · GitHub
同样,我不推荐使用那个脚本,让我解析Dota2中的网络模型是怎么工作的,和人们讨论的单位延时是怎么来的。
这个源引擎是一个以规律的间隔发送单位状态快照到客户端的基于UDP的网络系统。
这就是cl_updaterate,它现在的在我们服务器上的帧率是20HZ。这表示每50ms,这个游戏就传送
游戏中所有单位的位置,状态等等。(为了你们的好奇心,这个模型是在idSoftware以Quakeworld开发出来的,当时我正和John Carmack工作)。
你的客户端处理这个的方式是它在这些快照之间插值。默认的,cl_interp_ratio是2,这表明它在三个快照之间插值。让我用一个timeline解释。假设你是0延时(或者很低的延时)
Code:
Time Server Client
0.00 Snapshot A Idle
0.05 Snapshot B Gives command for the hero to move
0.10 Snapshot C Idle
0.15 Snapshot D Idle
这种情况下,你第一个获得了快照A,这时客户端什么都不做,因为它没有后续的快照。快照B来了,客户端开始在A和B之间插值。此时客户端控制英雄开始移动。服务器立即响应这个命令,并且在服务器上移动这个英雄。快照C收到后,但是客户端仍在A和C之间插值,因为cl_interp只有0.1或者10HZ。D最后来了,现在你开始看到单位完全响应于你的移动请求,因为你现在是在B和D之间插值。我们在10HZ插值而不是20HZ,所以如果你丢失了从服务器来的包,或者延迟了一些微秒,我们通过在丢失的包附近插值平缓的过渡了这个。
没有人为单位延时,它取决于快照之间的插值(它实现了客户端上的平缓移动)导致了让它看起来有一些延时。因为插值的事件是10HZ(100ms),它大概花了一半的这个时间,50ms,在一个单位开始移动或者开始响应最新的协议之前。
现在这个模型被调整为诸如Counterstrike,Left 4 Dead,Team Fortress2等具有预测行为的游戏。Dota2没有预测行为,因为你基本上是在战场上给单位下达命令。你不是像这些游戏一样直接控制玩家,并且那里没有基于瞄准扫描的需要预测和滞后补偿来瞄准的武器。你不需要在dota2中瞄准,你只需要下达命令。
通过这个,我研究了提高了快照的频率去降低插值时间到50ms。这回让可察觉的响应时间降低到平均25ms。
当然,你需要在所有这些基础上加上你的ping时间。如果你的ping是135ms,那么他就要多花费这些时间来让单位去响应。我不确定为什么ping从France到我们Luxembourg新的数据中心会这么高。我们最近收集了我们在那儿的服务器,我们还在和ISPs调整和交涉。我会和我们的网络管理者讨论这个,但是邮给我追踪路线会更好。
dota2这篇论坛上的资料透露,dota2在此基础上,去掉了客户端预测,减少了拉扯现象,不过玩家的控制信息得不到立即反馈,该文章也是为了解答玩家关于控制延迟的疑问。
总体的意思是DOTA2使用udp,快照同步的方式