细谈网络同步在游戏历史中的发展变化(下)

终于完结啦!《细谈网络同步在游戏历史中的发展变化》系列文章已至尾篇。首篇细谈网络同步在游戏历史中的发展变化(上)我们讨论了网络同步的基本概念以及锁步同步(帧同步)的发展历史。上一篇文章细谈网络同步在游戏历史中的发展变化(中)我们分析了状态同步的发展历史以及相关优化手段,这篇主要是针对物理同步网络协议以及优化技术三个方面做分析和总结。本文作者依旧是网易游戏雷火的游戏开发工程师@Jerish ,欢迎大家在评论区提问以及和我们互动!

前段时间,@韦易笑 老师阐述了有关“帧同步”一词在国内的发展历史也解释清了该名词乱用的原因。总的来说,国内“帧同步”与国外“Lockstep”的核心思想是一致的,为了方便描述,这篇文章会使用“帧同步”替代“LockStep”。

目录(下篇):

五:物理同步

1.概念与理解

2.问题与解决方案

六.TCP VS UDP

七.常见同步优化技术

1.表现优化

2.延迟对抗

3.丢包对抗

4.带宽优化

5.帧率优化

八.总结

五、物理同步

1.概念与理解

所谓“物理同步”,字面上讲就是“带有物理状态对象的网络同步”,严格上来说它并不是一个标准的技术名词,而是大家约定俗成的一个概念。按照我的个人理解,可以进一步解释为“在较为复杂的物理模拟环境或有物理引擎参与计算的游戏里,如何对持有物理状态信息的对象做网络同步”。在英文中,我们可以使用Replicate physics-simulated objects 或者Networked physics来表示类似的概念。

不过,考虑到并不是所有物理现象都交给物理引擎处理,而且有物理引擎参与的网游也并不一定需要对同步做任何处理,所以我们常说的物理同步更多的是指“在网络游戏中,如果玩家的位置或者与玩家交互对象的位置需要经过物理引擎的模拟处理来得到结果,那么其中涉及到网络同步技术就可以称为物理同步”。(这里的物理模拟一般指整个对象完全交给物理引擎去计算碰撞、位置、约束等,很多情况下可以等价为对Ragdoll的模拟)

备注:物理一词涉及的范围非常广,在游戏里面应用的场景也很多,但是并不一定需要进行网络同步,比如简单的抛物线运动,射线检测,与玩法无关的场景破碎等。

早在上世纪70年代,就诞生了许多围绕物理特性产生玩法的游戏,不过由于当时计算机系统算力有限,涉及到的物理计算都非常简单(比如乒乓球游戏中小球的移动模拟[1])。随着计算机性能的飞速提升,开发者们考虑将环境中的所有对象都交由统一的物理模块驱动,由此慢慢的催生出了通用的物理引擎[2]。很快的,各个游戏开发商逐渐将物理引擎集成进来,将更多更复杂的物理模拟过程应用到游戏中,制作出了诸如极品飞车、FIFA、NBA、愤怒的小鸟等围绕物理特性进行玩法设计的游戏。另一方面,随着计算机网络的发展,游戏中的网络同步技术愈加成熟,网络游戏的品质也不断向单机游戏靠拢,我们也得以将传统的单机游戏拓展成多人游戏。物理模拟作为提升游戏趣味性的一大技术也自然逐渐被纳入其中,物理同步变得重要起来。

RFC 2581中增加)。

在21世纪早期,我们因特网上的数据包有大约95%的包都使用了TCP协议,包括HTTP/HTTPS,SMTP/POP3/IMAP、FTP等。当然,也包括一大部分网络游戏。我们如此偏爱于TCP就是因为他从协议层面上提供了许多非常重要的特性,如数据的可靠性、拥塞控制、流量控制等。这些可以让软件应用的开发者们无需担心数据丢失、重传等细节问题。

然而在游戏开发中,这些特性却可能是网络同步中的负担。在FPS游戏中,玩家每帧都在移动,我们期望这些数据在几毫秒内就能送达,否则就会对玩家产生干扰、影响游戏体验。因此对于FPS、RTS这种要求及时响应的游戏,TCP协议那些复杂的机制看起来确实有点华而不实。

考虑到TCP协议非常复杂,这里只从几个关键的点来谈谈他的问题[17]。

1.在TCP中,数据是通过字节流的方式发送的,但由于建立在IP协议上必须将字节流拆分成不同的包,默认情况下协议会将你的数据包缓冲,到达一定值才会发送。这样可能会出现在游戏某个阶段你最后几个包明明已经执行了发送逻辑,但是由于缓冲机制被限制而无法到达。不过好在我们可以通过TCP_NODELAY来设置TCP立即刷新写入它的所有数据。

2.其次,TCP的可靠数据传输响应并不及时。一旦数据包发生丢失或乱序,那么接收方就会一直等待这个数据的到来,其他新收到的数据只会被缓存在协议层,你在应用层根本获取不到任何数据也无法做任何处理。这个时候你可能要等超时重传机制响应后才能拿到重发的数据包,这时候可能已经过了几十毫秒。即使TCP拥有快速重传机制,仍然达不到理想的延迟效果。

3.拥塞控制和流量控制不可控。TCP在网络环境比较差的条件下,会通过调整拥塞控制窗口大小来减少包的发送来降低吞吐量,这对于延迟敏感的游戏完全是无法接受的。同样,我们在应用层上面也无能为力。

4.其他的还有一些的小问题,比如每个TCP的报头都需要包含序列号、确认号、窗口等数据结构,无形中增加了流量大小;TCP需要在端系统中维护连接状态,包括接收与发送缓存、拥塞控制参数等,在处理大量连接的消息时也更为繁琐和耗时。

RFC 768中。顾名思义,UDP设计之初就是为了让用户可以自由的定义和传输数据,不需要建立链接、没有流量控制也没有拥塞控制,但是会尽可能快的将数据传输到目的IP和端口。

https://en.wikipedia.org/wiki/Pong [Accessed:2020-12-12]

[2] Tony Wang, “游戏物理模拟简史”, 知乎, 2020.Available:https://zhuanlan.zhihu.com/p/106977617 [Accessed:2020-12-12]

[3] Theraot, “How can I perform a deterministic physics simulation?”,Gamedev Stackexchange, 2019.https://gamedev.stackexchange.com/questions/174320/how-can-i-perform-a-deterministic-physics-simulation [Accessed:2020-12-12]

[4] Yossi Kreinin, “Consistency: how to defeat the purpose of IEEE floating point”, Personal Blog , 2008. Available:http://yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html [Accessed:2020-12-12]

[5] Glenn Fiedler, “Floating Point Determinism”, Personal Blog , 2010. Available:https://gafferongames.com/post/floating_point_determinism/ [Accessed:2020-12-12]

[6] NVIDIA, “NVIDIA PhysX SDK 3.4.0 Documentation Determinism”, NVIDIA , 2020. Available:https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/BestPractices.html [Accessed:2020-12-12]

[7] MelvMay, “How much deterministic is Physics from Unity3d In 2019?”,Unity Forum,2020.Available:

https://forum.unity.com/threads/how-much-deterministic-is-physics-from-unity3d-in-2019.711311/ [Accessed:2020-12-12]

[8] Unity, “Burst User Guide”,Unity Manual, 2020.Available:https://docs.unity3d.com/Packages/com.unity.burst@1.0/manual/index.html?_ga=2.60059693.1096806956.1607653832-2097754989.1600740353[Accessed:2020-12-12]

[9] Glenn Fiedler, “Introduction to Networked Physics”, Personal Blog,2014. Available: https://gafferongames.com/post/introduction_to_networked_physics/[Accessed:2020-12-12]

[10] Glenn Fiedler,”Physics for Game Programmers : Networking for Physics Programmers”, 2018.Available: https://www.gdcvault.com/play/1022195/Physics-for-Game-Programmers-Networking[Accessed:2020-12-12]

[11] Glenn Fiedler,”UnityDemo: Networked Physics in Virtual Reality: Networking a stack of cubes with Unity and PhysX” , 2018. Available: https://github.com/fbsamples/oculus-networked-physics-sample/ [Accessed:2020-12-12]

[12] Matt Delbosc, “Replicating Chaos Vehicle Replication in Watch Dogs 2”, GDC, 2017. Available: https://www.bilibili.com/video/BV1KA41187jk [Accessed:2020-12-12]

[13] Ned,”手游中载具物理同步的实现方案”, 腾讯游戏学院, 2018. Available: https://gameinstitute.qq.com/knowledge/100044 [Accessed:2020-12-12]

[14] Funny David, “看门狗2的载具同步(翻译)”, 知乎, 2019. Available: https://zhuanlan.zhihu.com/p/95560180 [Accessed:2020-12-12]

[15] Jared Cone, “It IS Rocket Science! The Physics of ‘Rocket League’ Detailed”, GDC, 2018. Available: https://www.bilibili.com/video/av44416219 [Accessed:2020-12-12]

[16] Glenn Fiedler, UDP vs. TCP https://gafferongames.com/post/udp_vs_tcp/ [Accessed:2020-12-12]

[17] WIKI, “Transmission Control Protocol”, WIKI, 2020. Available: https://en.wikipedia.org/wiki/Transmission_Control_Protocol [Accessed:2020-12-12]

[18] Draveness, “为什么 TCP 协议有性能问题”, Personal Blog, 2020. Available: https://draveness.me/whys-the-design-tcp-performance/ [Accessed:2020-12-12]

[19] WIKI, “User Datagram Protocol”, WIKI, 2020. Available: https://en.wikipedia.org/wiki/User_Datagram_Protocol [Accessed:2020-12-12]

[20] 小玩童,”Reliable UDP一览:那些能替代TCP的RUDP方案”, Personal Blog, 2020. Available: https://juejin.cn/post/6844904089218711559[Accessed:2020-12-12]

[21] WIKI, “HTTP/3”, WIKI, 2020. Available: https://en.wikipedia.org/wiki/HTTP/3 [Accessed:2020-12-12]

[22] 哈库纳, “聊一聊游戏服务器架构设计-聊天功能的那些事” ,Personal Blog,2016.Available: https://my.oschina.net/ta8210/blog/709075[Accessed:2020-12-12]

[23] 云风, “AOI服务的设计与实现”,Personal Blog,2012. Available: https://blog.codingnow.com/2012/03/dev_note_13.html[Accessed:2020-12-12]

[24] Jerry, “大世界同步方案ReplicationGraph”,知乎,2019. Available: https://zhuanlan.zhihu.com/p/56922476[Accessed:2020-12-12]

[25] 王杰, “揭秘重度MMORPG手游后台性能优化方案”,知乎,2018. Available: https://zhuanlan.zhihu.com/p/49787350[Accessed:2020-12-12]