Questions tagged «synchronization»

一种在玩家和/或服务器之间维持类似游戏状态的过程,从而为所有玩家提供有关当前游戏场状态的相同信息。

4
MMO如何实现负载平衡?
我相信MMO的普遍要求是,可以在多台服务器上完成单个分片或领域的处理,以减轻负载。我很好奇如何在保持所有玩家和所有NPC都可以互动的统一一致世界的同时完成此工作。 我的问题是MMO如何实现负载平衡? 任何有关如何提高我对此主题知识的链接,书籍或一般信息也将受到赞赏。

3
MMO中与服务器的低流量客户端同步
我正在实施MMO,玩家将在其飞船上的太空中飞行,并使用箭头键控制它并与其他玩家合作。 我想实现它,以便玩家可以躲避火箭或其他东西躲避飞船,所以我试图使用与服务器使用相同的世界模拟算法来预测客户端的整个游戏状态。该游戏世界是用C#编写的,将直接在客户端内部调用(在Unity3D上编写),并通过C ++服务器上的CLR(在Linux下)调用。通过UDP连接。 问题是如何在单个地图上维护1000名玩家(不包括所有其他游戏对象,生物……):假设我将: 每秒将服务器与客户端同步50次 向每个客户发送他能够看到的游戏对象(和玩家)的状态(在一定范围内) 必须在视野范围内向每个玩家发送100个对象 每个游戏对象必须平均发送50个字节(ID,x,y坐标,旋转,状态...) 因此,它将需要具有这样的网络带宽:1000(客户端)* 50(每秒的次数)* 100(要发送给每个播放器的对象)* 50(每个对象的字节数)=每秒250000000字节!不可能! 是否可以通过某种方式降低此值?例如,让客户端完全模拟他们的游戏世界(很长一段时间),然后仅向其他客户端发送输入并同步游戏世界,比如说,每隔几秒钟,但这会由于浮动计算而导致奇怪的不同步问题。 无论如何,如何以通用方式对此类游戏进行编程?谢谢。

5
实时策略游戏联网
我正在为我修读的计算机科学课程开发实时策略游戏。它最困难的方面之一似乎是客户端-服务器网络和同步。我已经阅读了这个主题(包括1500个archer),但是我决定采用客户端-服务器方法,而不是其他模型(例如,通过LAN)。 这种实时策略游戏存在一些问题。值得庆幸的是,玩家采取的每项行动都是确定性的。但是,某些事件按计划的时间间隔发生。例如,游戏是由砖块组成的,当玩家拿下一块砖块时,“能量水平”(该砖块上的一个值)在被获取后应该每秒增加一。这是一个非常简短的解释,应该可以证明我的用例。 现在,我正在做瘦客户机,它们只是将数据包发送到服务器并等待响应。但是,有几个问题。 当玩家之间的游戏发展为残局时,每秒通常会有超过50个事件(由于已安排的事件,如前所述,堆积),然后开始显示同步错误。我最大的问题是,即使客户之间的状态偏差很小,也可能意味着客户做出不同的决定,这些决定会滚雪球变成完全独立的游戏。另一个问题(目前还不那么重要)是存在延迟,必须等待几毫秒,甚至是他们采取行动才能看到结果的几秒钟。 我想知道我可以使用什么策略和算法使最终用户更轻松,更快速,更有趣。鉴于每秒发生的事件数量很高,而且每场比赛有几个玩家,因此这特别有趣。 TL; DR以每秒> 50个事件的速度生成RTS,如何同步客户端?

5
游戏逻辑线程与渲染线程之间的同步
一个游戏逻辑和渲染如何分开?我知道这里似乎已经有问题要问,但是答案对我来说并不令人满意。 据我所知,将它们分成不同的线程的目的是使游戏逻辑可以立即开始为下一个滴答运行,而不必等待下一个vsync,在此,渲染最终从swapbuffer调用返回而一直处于阻塞状态。 但是,具体来说,使用什么数据结构来防止游戏逻辑线程和渲染线程之间的竞争状况。大概渲染线程需要访问各种变量来确定要绘制的内容,但是游戏逻辑可以更新这些相同的变量。 是否有实际的标准技术来处理此问题。就像在每次执行游戏逻辑后复制渲染线程所需的数据一样。无论采用什么解决方案,同步的开销还是比仅运行单线程的所有开销都要少?

2
如何使Quake 3等精密网络游戏的服务器-客户端时钟保持同步?
我正在研究2D自上而下的射手,并尽力复制类似Quake 3这样的网络游戏中使用的概念。 我有一个权威服务器。 服务器将快照发送到客户端。 快照包含时间戳和实体位置。 实体插值在快照位置之间,因此移动看起来很流畅。 根据需要,实体插值会稍微“过去”发生,因此我们可以在多个快照之间进行插值。 我面临的问题是“时钟同步”。 为了简单起见,让我们假设一下,在与服务器之间传输数据包时,延迟为零。 如果服务器时钟比客户端时钟早60秒,则快照时间戳将比客户端本地时间戳早60000ms。 因此,在客户端看到任何给定的实体进行移动之前,实体快照将收集并静置约60秒钟,因为客户端时钟要花很长时间才能赶上。 通过设法在每次接收快照时计算服务器时钟和客户端时钟之间的差异,我设法解决了这一问题。 // For simplicity, don't worry about latency for now... client_server_clock_delta = snapshot.server_timestamp - client_timestamp; 确定实体插入插值的距离时,我只需将差值添加到客户的当前时间即可。但是,这样做的问题是,由于快照比其他快照更快或更慢地到达,这两个时钟之间的差异将突然波动,这将导致混乱。 如何才能使时钟足够紧密地同步,以使唯一可感知的延迟是硬编码用于插值的延迟,而该延迟是由普通网络延迟引起的? 换句话说,如何在时钟严重失步时防止插值开始得太晚或太早而又不引起混乱呢? 编辑:根据Wikipedia的说法,NTP可以用于在几毫秒内将互联网上的时钟同步。但是,该协议似乎很复杂,也许在游戏中使用会显得过分杀伤力?

2
多人物理网络
我很好奇赛车游戏中如何实现具有物理功能的多人网络。我们拥有一个物理世界,其中有多个由不同人员控制的快速行驶的车辆。假设车辆拥有武器并且可以相互射击(扭曲金属,Vigilante v8) 我担心撞车和撞车。权威服务器还是更好的选择?

2
如何同步多人游戏中的跳跃等动作?
我是新手游戏开发人员,并且我一直在研究多人游戏。我观察到总会有一些延迟,玩家总是会从过去的动作中获得更新。但是,有诸如航位推测法之类的技术可以处理延迟。我可以预测运动并使运动平稳。但是我将如何使动作同步,例如跳跃,停止行走等。 假设客户A在移动,他以100m / sec的速度在10.2时处于100m并发送了此信息。客户B稍后会收到此信息,设为10.4。因此,在客户端B,我可以使用预测并将客户端A放置在120m处。但是,如果客户在10.3跳到110m,该怎么办?我无法预测,并且由于我一直在使用预测,所以无法显示客户A的过去。 我可能根本不发送跳转动作来解决此问题。但是,如果我的游戏中存在一些空隙,玩家可以跌倒并死亡。因此,如果我不同步跳跃动作,其他玩家将观察到一个玩家在跑步,然后他陷入虚无,然后再次出现在屏幕上,破坏了视觉吸引力。 跳转只是一个例子,可能在许多情况下无法进行预测。因此,如何处理它们。这样的示例之一可以是像Awesomenauts这样的多人在线战斗竞技场游戏。

1
网络客户端-服务器消息交换和时钟同步帮助
我正在做一个快节奏的物理游戏,它是桌上曲棍球。有两个槌和一个冰球。游戏运行在iPhone / iPad上,我正在通过GameCenter做多人游戏。 这就是网络系统的工作方式。带有匹配标记的客户端将作为服务器进行结算,接受匹配请求的将是客户端。 “服务器”具有物理功能,响应是即时的,客户端也具有物理功能,因此在消息交换之间看起来很流畅。我作为服务器的工作是,我将客户的冰球速度和位置发送给客户端,客户端调整与服务器有关的冰球速度/位置以使其保持同步。否则,物理场将失去同步,并且将其拧紧。 当网络延迟很好,在100毫秒以下时,效果很好,我在客户端获得了流畅的可玩游戏,并且怪异的行为降到了最低。当滞后时间约为150到200毫秒时,就会发生此问题。在那种情况下,发生了我的客户冰球已经碰到边缘和反向的情况,但是它收到了来自服务器的延迟消息,并且它后退了一点,从而引起了对球行为的怪异感觉。 我已经阅读了一些有关它的内容: 傍网示例 单击同步示例 维基百科上的时钟同步 那么,我该如何解决呢?据我所知,最好的选择是使用时间戳在服务器/客户端上进行时钟同步,这样当我收到与时钟相关的延迟消息时,我就忽略了,然后让客户端模拟执行工作。你们同意吗?而且由于我发送的数据不可靠(UDP),所以我可能会收到延迟的消息或混乱的消息。 如果那是最好的方法,我如何实现时钟同步。我已经阅读了有关如何操作的步骤,但我不太了解。 它说: 客户端在“时间请求”数据包上标记当前本地时间,然后发送给服务器。 服务器收到后,服务器会在服务器上盖章并返回 客户端收到后,客户端从发送时间中减去当前时间,然后除以2以计算延迟。它从服务器时间中减去当前时间,以确定客户端-服务器时间增量,并加上半延迟以获取正确的时钟增量。(到目前为止,此algothim与SNTP非常相似) 客户重复步骤1至3五次或更多次,每次都暂停几秒钟。在此期间可能允许其他流量,但应将其最小化,以获取最佳结果。数据包接收的结果将被累积,并以最低延迟到最高延迟的顺序进行排序。中值等待时间是通过从此有序列表中选择中点样本来确定的。 丢弃与中位数相差大约1个标准偏差的所有样本,并使用算术平均值对其余样本取平均值。 按照这个例子,我会有这个: 让我们假装游戏已经加载并且我的客户端时间现在是0,所以我向服务器发送我的时间是0。 消息需要150毫秒才能到达服务器,但是服务器的时钟已经启动,并且比客户端提前1秒。服务器收到消息后,时间将是:1.15并将该时间发送给客户端,我们还好吗?假设我们的滞后时间恒定为150ms。 现在客户端接收时间1.15,并从发送的时间中减去当前时间,然后除以2以计算延迟。Wich为:0.3-0 = 0.3 / 2-> 150ms。 它从服务器时间中减去当前时间以确定客户端-服务器时间增量,并添加半延迟以获取正确的时钟增量: 客户端时间:0.3服务器时间1.15 0.3-1.15 = .85 +等待时间(.15)= 1 如何同步?我想念什么? 这是我第一次玩多人游戏和网络游戏,所以我有点困惑。 谢谢。

3
与全状态更新相比,我如何更有效地同步多人游戏状态?
我之前已经做过一些游戏网络编码,但是主要使用TCP来实现无实时需求的游戏。我正在使用网络多人游戏开发2D Java游戏。为了学习,我想自己做,而不需要现有的网络API。 如何有效表示从服务器发送给客户端的游戏状态?有一种最明显但可能效率最低的方法,该方法是使用每个玩家的位置,动画状态等创建某种游戏状态上下文对象,并将每次更新发送给每个玩家。这似乎很难实现,但可能太大而无法实现接近实时交互的功能(当然,我的经验有限,因此我可能是错误的)。 你们中的任何人以前是否曾使用过可靠的方法来仅传输状态变化,并且在性能上是否存在足够大的差异以值得进行额外的工作?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.