这是【游戏开发那些事】的第43篇原创
点击关注加“星标”获取更多游戏开发知识与科普文章
五:物理同步
1.概念与理解
- 什么是物理同步
2.问题与解决方案
- 物理引擎的确定性问题
- 同步误差如何被物理模拟放大
- 物理同步Demo案例介绍
- 《看门狗》的载具同步
- 《火箭联盟》的物理同步策略
网络同步是游戏开发中比较重要且复杂的一项技术,但是由于网上资料参差不齐导致很多朋友对部分概念和原理理解有误。作者耗费近一年的时间,参考了大量的论文与资料(不下100篇),最终整理出来“网络同步在游戏历史中的发展变化”系列文章,希望能够帮到大家(求关注与分享)。上一篇文章我们分析了状态同步的发展历史以及相关优化手段,这篇主要是针对物理同步技术做分析和总结。
前段时间,@知乎韦易笑老师 阐述了有关“帧同步”一词在国内的发展历史也解释清了该名词被乱用的原因。总的来说,国内“帧同步”与国外“Lockstep”的核心思想是一致的,为了方便描述,这篇文章会使用“帧同步”替代“LockStep”。
五、物理同步
1.概念与理解
所谓“物理同步”,字面上讲就是“带有物理状态对象的网络同步”,严格上来说它并不是一个标准的技术名词,而是大家约定俗成的一个概念。按照我的个人理解,可以进一步解释为“在较为复杂的物理模拟环境或有物理引擎参与计算的游戏里,如何对持有物理状态信息的对象做网络同步”。在英文中,我们可以使用Replicate physics simulated objects 或者Networked physics来表示类似的概念。
▷▶网络游戏《火箭联盟》
不过,考虑到并不是所有物理现象都交给物理引擎处理,而且有物理引擎参与的网游也并不一定需要对同步做任何处理,所以我们常说的物理同步更多的是指“在网络游戏中,如果玩家的位置或者与玩家交互对象的位置需要经过物理引擎的模拟处理来得到结果,那么其中涉及到网络同步技术就可以称为物理同步”。(这里的物理模拟一般指整个对象完全交给物理引擎去计算碰撞、位置、约束等,很多情况下可以等价为对Ragdoll的模拟)
备注:物理一词涉及的范围非常广,在游戏里面应用的场景也很多,但是并不一定需要进行网络同步,比如简单的抛物线运动,射线检测,与玩法无关的场景破碎等。
早在上世纪70年代,就诞生了许多围绕物理特性产生玩法的游戏,不过由于当时计算机系统算力有限,涉及到的物理计算都非常简单(比如乒乓球游戏中小球的移动模拟[1])。随着计算机性能的飞速提升,开发者们考虑将环境中的所有对象都交由统一的物理模块驱动,由此慢慢的催生出了通用的物理引擎[2]。很快的,各个游戏开发商逐渐将物理引擎集成进来,将更多更复杂的物理模拟过程应用到游戏中,制作出了诸如极品飞车、FIFA、NBA、愤怒的小鸟等围绕物理特性进行玩法设计的游戏。另一方面,随着计算机网络的发展,游戏中的网络同步技术愈加成熟,网络游戏的品质也不断向单机游戏靠拢,我们也得以将传统的单机游戏拓展成多人游戏。物理模拟作为提升游戏趣味性的一大技术也自然逐渐被纳入其中,物理同步变得重要起来。
▷▶游戏《Pong》
2.面临的问题与解决方案
正如所前面解释的那样,物理同步并不是一种特殊的同步方式,而是在物理引擎和网络同步技术共同发展的条件下而诞生的一种综合行性解决方案,其核心手段还然是我们熟悉的帧同步或者状态同步。使用帧同步技术我们需要每帧把玩家的Input信息发送出去,然后让另一端的物理引擎根据输入去模拟结果。如果使用状态同步我们则需要本地模拟好数据并把物理位置、旋转等关键信息发送到其他的客户端,然后其他客户端可以根据情况决定是否再执行本地的物理模拟(如果是快照同步,由于拿到的就是最终的结果,那么就不需要本地再进行模拟了)。
这样看来,物理同步好像与常规的同步也没什么本质上的区别,那么为什么他却是一个难题呢