我很好奇赛车游戏中如何实现具有物理功能的多人网络。我们拥有一个物理世界,其中有多个由不同人员控制的快速行驶的车辆。假设车辆拥有武器并且可以相互射击(扭曲金属,Vigilante v8)
我担心撞车和撞车。权威服务器还是更好的选择?
我很好奇赛车游戏中如何实现具有物理功能的多人网络。我们拥有一个物理世界,其中有多个由不同人员控制的快速行驶的车辆。假设车辆拥有武器并且可以相互射击(扭曲金属,Vigilante v8)
我担心撞车和撞车。权威服务器还是更好的选择?
Answers:
通常,使用服务器来存储与客户端定期共享的“真实”状态。冲突在客户端和服务器中独立发生,客户端的状态使用以前称为“推算”的过程从以前的状态进行估算。当服务器状态到达客户端时,如果存在差异,客户端将执行从其当前状态到主要通过插值接收的状态的转换。
但是,对于许多对象而言,冲突可能是一个现实问题,因此通常要做的是将客户端的模拟时间保持在服务器的模拟时间之后,以允许各种其他程度的灵活性。 关于Valve的Source Engine网络代码的这篇文章颇具解释性。另外,如果您仍不确定要使用哪种网络中间件/库,建议您研究RakNet及其“ ReplicaManager3”组件。
您可以做几件事。
您可以在服务器上集中所有物理对象,并将坐标与所有客户端上的玩家对象同步。这是最简单的方法,并且没有很多缺陷,但是它占用了大量资源,并且需要大量带宽。您可以通过仅将值发送到特定半径内的其他播放器的播放器来优化带宽使用。
您可以按照Neenster所说的做,并让服务器和客户端模拟物理,服务器每隔一段时间就会更正客户端。这意味着所有客户端都会为每个玩家计算自己的物理情况,并且您将在服务器上同步按键事件,以提供每个客户端上每个玩家的轨迹。可以说,服务器每隔5秒钟广播一次物理模拟,所有客户端都接受更改。这可能会产生轻微的偏移,这种偏移通常不会引起注意,但是在网络滞后和数据包丢失(高流量UDP不可避免)的情况下,您会注意到您的播放器和/或其他播放器在屏幕周围出现故障并迅速而断断续续地更改位置(是字?)。
您可以让每个客户计算自己的物理场并同步其坐标。这使得很难在客户端之间共享的对象上模拟物理。如果您想做任何令人眼花anything乱的事情,要实现它是一个相当复杂的概念,因为某些对象不一定属于任何客户端。
第一个可能是最简单的,应该可以让您拥有大约4-5名玩家,并且几乎没有滞后。它将要求每个匹配项都有自己的服务器。如果您要进行LAN匹配,这无疑是可行的方法。
第二个可能是最实用的,但是可能很难实现。在服务器上运行物理模拟也非常有用。如果您有集中式服务器,则可能需要将负载平衡到多台计算机上,也许允许一个服务器匹配10个,将新匹配项加载到具有最少匹配项的服务器上。
第三个绝对是服务器上压力最小的一个,如果您正在执行对等网络方案,则可能是最佳的解决方案。正如我提到的那样,同步播放器对象以外的对象可能很困难,因为这些对象也可以被其他客户端更改。
我无法告诉您要使用哪个游戏,因为我不知道您的游戏如何运作。我所能做的就是给你事实。如果您还有其他问题,请随时发表评论。