http://gamedev.stackexchange.com/questions/6645/lag-compensation-with-networked-2d-games
————————————————————————————————————————————————————————————————————
我要做一个物理驱动的2d网络游戏,有些问题我不大懂,通过研究发现,服务器发来的更新间隔应该是100毫秒,我能想出的是它们是这样工作的:并行的进行物理模拟,通过内插来进行延迟补偿。我不理解的地方是:如何处理来自其他玩家的更新。
如果客户端每个100毫秒获得一次玩家位置更新的通知,我不能想象会发生什么因为100毫秒足够发生太多的事了,玩家在此期间可能已经改变两次方向了。我想知道是否有人已经解决了这个问题,对于射击这样的场景又是如何工作的。
谢谢!
————————————————————————————
这个问题可以解决,但需要明确的一点是如果有任何延迟,那么精确的或者完美的多人物理是不可能实现的。为什么延迟会影响物理会被解释,并提供一些建议,关于如何减少这种这种延迟对物理模拟的影响。
——
创建多人物理游戏可以充满了危险。不可能创造一个“完美”的在线多人物理的体验。有很多事情可以做,以使它更好,但目前还没有办法让完美的物理承担任何延迟。
问题是,物理必须快速响应现实,但在同一时间具有基于各种因素的共同作用,以进行计算 - 这意味着所有玩家的组合动作。而且如果有延迟,这不能被实时实现。
开发者要决定,你是否保持不同的因素在控制之下,并且要明白如何延迟过高,玩家的体验就会降低。如果你能接受(你的玩家们也可以接受),那么就那么做吧。本帖的最后会给出一些关于如何保持平滑的建议。
一个显示事情如何搞砸的例子
想象一下一个游戏中,两个玩家都连到服务器。一个消息从客户端发送到服务器需要100毫秒。当一个玩家做了一个动作,这个消息要发送到服务器并告诉服务器它所做的,然后服务器广播消息给其他玩家,以便其他玩家能够知道这个发送消息的玩家做了什么。
现在想象这样一个场景,两个玩家都看到地面上的一个箱子,玩家A在一边击中这个箱子,使其向某个方向移动;同一时间,玩家B在另一个方向击中箱子,使箱子朝另一个方向移动。
让我们来看看不同的方式来处理这个问题会有那些效果...
只在服务器端进行物理计算
假设我们只在服务器端进行物理计算,玩家A发送消息给服务器“我从这边击中了这个箱子”,100毫秒后服务器收到该消息。玩家B也发送消息“我从另一边击中了这个箱子”。服务器结合着两个动作计算物理改变,并且向两个玩家返回这样的消息“好的,这个箱子应该这样移动”。基于两个玩家的动作的组合,完美物理被执行。但问题是,每个玩家要在200毫毛后才能看到箱子的反应,玩家的消息要用100毫秒到达服务器,另外100毫秒服务器计算结果并返回给玩家。
Bottom line, laggy gameplay.
只在客户端进行物理计算
假设我们只在客户端进行物理计算,让我们以玩家A的视角来看,玩家A击中箱子,箱子立刻向一边移动。玩家A的消息被发送到服务器告诉服务器玩家A所做的动作。
同时玩家B也击中箱子,箱子向另一边移动。玩家B的消息也被发送到服务器告诉服务器玩家B所做的动作。
200毫秒后,服务器的消息到达客户端,此时A,B都知道了各自的动作。问题是,两个客户端都说:“好吧,玩家X在这一点做了个动作,但箱子已经不在那个位置了,所以他们什么都没有打中”
Bottom line is,两个游戏不同步,玩家没有共享的游戏体验。What's the point of multiplayer if they both see different things?
客户端和服务器端同时进行物理计算
在这种情况下,客户端的物理计算是玩家能看到无延迟的反应,而服务器上的物理计算告诉所有玩家这个计算是正确的。
两个玩家都击中了箱子,每个玩家都能看到箱子移动了。但是200毫秒后,服务器返回消息说:“好吧,事实上你们都错了,箱子实际上按这条路移动”,此时两个玩家看到箱子改变了方向,跳跃到新的位置。
Bottom line is, a glitchy game.
结论
当任何延迟存在时,基本上无法无法做到完美的物理模拟。你可以做一个相当不错的游戏,但过度延迟总会给玩家造成不好的物理体验。但是有些事情可以提高玩家的屋里体验。
使多人游戏运行的好可以做的事
使用简单的碰撞形状。不要对形状的物理细节建模,一个简单的立方体就够了。
仅在客户端使用小而无关紧要的对象,例如来自被打破的玻璃的碎片。你可以让每个客户端以自己的方式模拟,因为即使不同也无关紧要。
只对必要的物理对象进行建模,保持活跃的物理对象数量最少。
当模拟多人物理时,使你的游戏运行在低速运动状态,例如子弹时间。低运动游戏弥补了延迟,允许多个玩家参与物理互动。
允许玩家设置某些共同的条件,根据这些条件,为所有玩家进行物理模拟,所有玩家看到这些组合动作的共同结果。玩家不干涉模拟的步骤直到模拟完成。(Allow players to setup a situation of some kind together, and then on some cue, the physics is simulated for both players and both watch the result of their combined actions. Players may not interfere with the sequence until it is completed.)
隔离每个玩家的物理模拟,以使其不能相互影响。例如保龄球或游泳池,同一时间只有一名玩家有控制权,每个玩家都有自己的沙箱。
如果你不能打败他们,就加入他们,物理延迟是你的游戏的一部分。
附录:射击游戏如何处理
射击游戏不需要复杂的物理,它们使用客户端效果,所以玩家能够很快看到东西。但是最后服务器决定到底发生了什么事。
TODO:。。。