问题标签 [multiplayer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3023 浏览

networking - 多人 UDP 网络策略,需要建议

我正在尝试为实时 3D 游戏创建 C++ 插件。虽然我相信对 UDP 的理论、它是如何工作的、它的优点和缺点有什么牢牢把握,但我主要关心的是性能、可扩展性和可能的​​统计数据。我知道,在 UDP 甚至 TCP 方面,我可能只知道沧海一粟。

问题:

给定一个特定的场景,一个典型的专用服务器可以在任何时候处理多少玩家。

现在的场景...

假设我们有一个 MMORPG 游戏,所有玩家都可以在“游戏世界”的任何地方。每个人都向同一个服务器/服务器集线器发送和接收数据,因为每个人都必须能够......看到其他人并与之交互,当他们的路径最终交叉时。这是一个实时的第一人称游戏,所以玩家位置必须是最新的,非常及时。

假设我们有 1000 名(甚至 10000 名)在线玩家......

这里需要发生三件主要的事情:

  1. 每个玩家通过 UDP 将他们的数据流式传输到游戏服务器,例如每秒发送 14 次。简而言之,这些数据包括每个玩家是谁、在哪里以及是什么。发送的数据已针对大小和速度进行了规范化和优化,以鼓励最小的带宽使用。

  2. 例如,服务器每秒接收多达 1000 个(用于演示目的的非虚构数字)这些数据包 14 次,因此每秒处理 14 000 个数据包。此处理阶段通常涉及更新中央存储器数据结构,其中玩家的旧 x、y、z 位置数据将使用他的新位置和时间戳进行更新。服务器上的这个数据结构包含整个游戏世界中所有玩家的所有数据。

  3. 服务器(可能是一个单独的线程,甚至可能是一台单独的机器)现在需要将数据包广播给所有其他玩家,以便他们可以更新屏幕以在地图上显示其他玩家。这也每秒发生 14 次。(其中 14 通常可能是一个动态数字,根据正在使用的 CPU 容量、繁忙的 CPU、较低的帧速率而变化,反之亦然)。

重要的是:对于玩家 X,只有在其位置可视范围内的其他玩家的数据才会发送给各自的玩家。因此,如果玩家 Y 在 2 英里之外,则需要将他的数据发送给 X,但如果玩家 Z 在地球的另一端,则不会将他的数据发送给 X,以节省带宽。这当然涉及更多处理,因为必须使用最有效的索引解决方案对数据进行迭代和过滤。

现在我担心的是,从客户端机器发送数据包,将其放入服务器 RAM,进行一点点处理更新数据,并有选择地将信息广播给其他玩家,这需要时间。这意味着,服务器能够处理某个阈值,是的,取决于我的实现的有效性、所使用硬件的速度和能力,当然还有其他外部因素,例如互联网速度,交通和天然橡胶。每秒撞击地球的太阳耀斑......开玩笑的。

我试图从其他人那里找出经历过这个过程的人,其中的陷阱是什么,以及在创建多人插件时我可以期待什么样的典型性能。

我可以很容易地说:“我想同时满足 10000 人在同一服务器上玩的需求”,你可能会说:“100 是一个更现实和可能的数字,每台服务器。”

所以我知道我可能必须想出一个多服务器/云计算中心来处理我的数千个请求和调度,将处理负载分布在多台机器上。所以我可能有几台机器只处理接收数据,一个巨大的中央盒子,它就像一个内存数据库,由所有接收和调度机器以某种方式共享,当然还有一系列调度机器。

显然,存在技术限制,我真的不知道会发生什么以及它们是什么。并且在问题上投入额外的 CPU 和服务器盒不一定能解决问题,因为机器之间更多的相互通信也会稍微减慢处理速度。我想你投入的 CPU 越多,可能会降低效率,甚至在某个阈值处逆转 CPU 生产力。

我可以而且应该考虑多人游戏的 P2P(点对点)!

我是否现实地说我将能够同时满足 2500 名玩家的需求?

是否有可能在几年内扩大到 10000 名玩家?

我知道这个问题很长,所以请接受我诚挚的歉意。

0 投票
2 回答
704 浏览

python - Twisted Spread 适合多人赛车模拟吗?

您认为 Twisted Spread 是否适合(在性能方面)多人赛车模拟器?该应用程序的其余部分基于 Python-Ogre。

Perspective Broker 可以在(可靠的?)UDP 上运行吗?

0 投票
3 回答
748 浏览

delphi - Datasnap 是否适合最多 8 个非通信密集型双向多人游戏?

我正在构建一个小型乘法器,它需要以下内容:

  • 它必须用 Delphi 编写
  • 必须支持互联网连接(不仅是局域网)
  • 通过 HTTP 工作
  • 支持数据包的一些加密(可能是自定义的)
  • 能够向服务器发送命令
  • 能够接收来自服务器的响应
  • 最多可将 8 个玩家连接到一台服务器
  • 能够将复杂对象(可能是 JSON 序列化)传递给服务器

您认为新的 Delphi 2010 Datasnap 可以在这种情况下成功使用,还是我应该使用普通的旧 TSocket?

0 投票
2 回答
3369 浏览

python - 在简单的基于 python-socket 的服务器和客户端之间同步时间

我有一个小型多人游戏的开始,我用 python 编写作为学习练习。目前,服务器以 10 fps 运行,而客户端以他们喜欢的任何速率运行。这可以很好地节省带宽,但是除非客户端在输入发生时告诉服务器,否则所有输入都会被量化为 100 毫秒的间隔。如何在客户端和服务器之间同步时间以便进行这些更正?这里的一个主要障碍是我需要确定 ping 时间并对其进行补偿。

0 投票
4 回答
4364 浏览

c# - 在使用浮点运算的多人 RTS 游戏中保持同步

我正在用 C# 编写一个 2D 空间 RTS 游戏。单人游戏有效。现在我想添加一些多人游戏功能。我搜索了一下,似乎只有一种方法可以让数千个单位在没有强大网络连接的情况下连续移动:只通过网络发送命令,同时在每个玩家身上运行相同的模拟。

现在有一个问题,整个引擎到处都使用双精度。浮点计算在很大程度上取决于编译器优化和 cpu 架构,因此很难保持同步。而且它根本不是基于网格的,并且有一个简单的物理引擎来移动太空船(太空船有冲量和角动量......)。因此,将整个内容重新编码以使用定点将非常麻烦(但可能是唯一的解决方案)。

所以到目前为止我有两个选择:

  • 告别当前代码并使用整数从头开始
  • 仅在有足够带宽的情况下制作游戏 LAN,以容纳 8 名拥有数千个单位的玩家,并在(几乎)每一帧中发送位置和方向等......

所以我在寻找更好的意见,(甚至是关于将代码迁移到定点而不搞乱一切的技巧......)

0 投票
3 回答
131 浏览

design-patterns - 如何管理数据的微小变化?

我目前正在构建一个多人游戏系统,并且我有一个关于如何管理大量对象之间的大量小数据变化的设计问题。

我将从一个例子开始:假设我有 3 个玩家:A、B 和 C。A 与 B 友好,与 C 为敌。这意味着,我必须向 C 表明 A 是敌人,B 表明 A 是友好的。现在我有相同数据的 2 个不同(但很小)的变化。这只是一个例子。另一种变化是 A 进入隐身状态,B 可以看到 A,但 C 不能看到 A。如前所述,这些只是示例。计划有更多不同状态的玩家数据,每个对象之间大多不同。

我应该如何管理这个?大量的 if 块,还是我错过了一些明显的设计模式?由于这是一款多人游戏,因此将不仅仅是 3 个玩家/对象或状态。

0 投票
3 回答
1362 浏览

iphone - iPhone mmorpg 中的高延迟

现在我正在尝试为 iPhone 制作一个 mmorpg。我已将其设置为 iPhone 每秒多次请求播放器位置。它是如何做到这一点的,客户端使用异步 NSURLConnection 向 php 页面发送请求,该页面从 mysql 数据库加载位置并以 json 形式返回。但是,从请求位置到实际加载位置大约需要 0.5 秒。这似乎真的很高,是否有任何明显的事情可能导致这种情况?

此外,这也会导致客户端上的玩家移动也非常不稳定。是否有任何算法或方法来减少玩家运动的不连贯性?

0 投票
4 回答
12086 浏览

flash - 谷歌应用引擎可以用作套接字服务器吗?

我的虚拟主机有针对套接字服务器的规则,所以我一直在研究 GAE。

有谁知道可以在 GAE 上成功运行的套接字服务器?我将它用于闪存,所以如果可能的话,像 smartfox 这样的东西会很棒。

谢谢。

0 投票
2 回答
2547 浏览

c++ - 对象管理器的最佳实践

我对 c++ 编程有点陌生,我正在为多人游戏编写对象管理器,但我对如何管理客户端对象有些疑问。客户端对象由连接的客户端参数(如 IP、连接时间、接收数据等)组成。

为了避免内存碎片,我打算分配一个允许最大客户端数量的对象池。为此,我正在编写这样的客户端对象管理器:

请注意,此类将仅以静态方式调用,因此没有构造函数/析构函数。此类必须是静态的,因为必须可以在不同类型的对象之间读取/修改客户端数据。

实现将类似于:

现在,如何管理 get 函数中的对象返回?参考是最好的选择吗?我不想返回一个指针,但如果这是我最后的选择,我可以接受它。我想我可以确保我只在池中获得注册(初始化)对象,如果是这样,是否需要在 get 函数中进行检查?我不想要断言,因为我希望代码健壮并且在运行时不会停止(我是 C++ 新手,所以如果我说错了,请纠正我)。

在主程序中,我在想这样的事情:

我做对了吗?谢谢

注意:
1)这段代码是我的想法,我在这里输入了它,所以我可能忘记了一些东西。
2)程序只有被杀死才会终止(我使用的是linux),因此在主程序中不会显式调用ClientManager的dispose方法(因为它是一个静态类)。再次,如果我说错了,请告诉我!
3) 对不起我的英语不好:)

0 投票
4 回答
5502 浏览

android - 如何开始在 Android 上开发社交多人游戏

我很想知道如何在 android 上开发一款包含 2 名或 2 名以上玩家的社交游戏。比方说国际象棋..例如或拼字游戏。如何开始?有没有关于这个主题的在线资源或教程?