2

我正在开发一个多人游戏(客户端-服务器模型),但在扩展其服务器时我陷入了困境。

我知道大多数游戏甚至从未达到 10 000 多名玩家,我认为我的游戏也不会。虽然如果我很幸运能得到这个,我想开发服务器,这样它们以后就不会成为一个巨大的障碍。

我在互联网上搜索了很多关于我的问题的解决方案,查看了 GDC 的讨论并查看了该网站上的其他帖子,但似乎没有一个能解决我的具体问题。

我当前的设置如下,所有服务器都是用 C++ 编写的,使用 ENet 作为我的网络库。

游戏服务器

该服务器处理游戏的实际游戏玩法,需要在服务器与其连接的客户端之间发送大量 CPU 和数据包。但是这个专用服务器是由玩家自己托管的,所以我根本不需要考虑扩展它。

大厅服务器

此服务器处理服务器列表,其中包含当前启动的所有服务器。

  • 所有游戏服务器每 5 秒向该服务器发送一个 UDP 数据包,表示它们还活着。这样大厅服务器就可以保留当前在线的所有服务器的更新列表。

  • 当所有客户端想要获取所有服务器时(仅在服务器列表屏幕中),所有客户端都向该服务器发送 UDP 包,并且大厅服务器发回所有服务器的列表。这种情况不会经常发生,并且大厅服务器被限制为每秒向客户端发送 4 个服务器(而不是包含所有服务器的大包)。

登录服务器

该服务器处理创建帐户、丢失密码、登录、朋友和他们当前的游戏状态、给其他登录玩家的私人消息以及指定他们拥有哪些游戏内物品的玩家资料。

  • 所有客户端每 5 秒向该服务器发送一个 UDP 数据包,表示他们还活着,同时还发送他们当前所在的游戏。然后服务器将他们的好友列表发送回在线/离线/游戏中状态。这样他们的朋友就可以保留在线/离线/游戏中的朋友的更新列表。

  • 它只发送带有玩家操作的消息,例如创建帐户、登录、更改/重置密码、添加/删除/忽略朋友、给朋友的私人消息等。

我的问题

我担心的是我的大厅和登录服务器可能无法扩展,并且它们的流量会太大。

1.理论上它们可以只托管在一台计算机上吗?还是对 10 000 多名玩家来说流量太大了?

2.如果它们可以托管在一台计算机上,那么对于住在远方的人来说,服务器是否仍然没有问题?
在这种情况下,每个地区都有大厅和登录服务器会更好吗?不好的是,如果玩家住在欧洲,他们将无法看到美国的服务器,并且他们的帐户和物品将不存在于其他服务器上。

3.可能有点牵强,但如果我将两台服务器都重写为位于具有数据库的网站上,并让客户端/游戏服务器改为执行 Web 请求(例如 HTTPS 或调用具有特定标头的 php),会不会以某种方式帮助解决我的问题?

4

2 回答 2

0

您的所有问题和疑问都可以通过基于无服务器云的解决方案AWS Lambda或类似解决方案来解决。在这种情况下,可扩展性不是您的问题。只是发展逻辑。这将为您节省很多时间。

如果您想将服务器作为由您自己的服务器托管的单个应用程序。考虑使用诸如 Go 之类的东西而不是 C++。它正是为这些目的而设计的。我的意思是高负载的网络/网络服务。

于 2020-12-22T22:18:38.553 回答
0

好吧,这是 c++ 和我用 java 编写的代码,但也许这个逻辑对你有用,所以我会告诉你我最终是如何在赌场中实现类似的东西的。

在我的情况下,我在同一个服务器程序中有 2 个不同的套接字,其中一个套接字是 TCP,它处理所有登录、注册和支付,而第二个套接字是 UDP,它处理多个付款人正在玩的实际游戏,那么你可以在内部将所有这些 UDP 连接分组(可能是套接字数组)以生成这些大厅。这样做,您的所有服务器只是一个类,可以使用 2 个端口(每个套接字一个)在单台 pc 上运行,但这并不能解决住得很远的人的 ping 问题。如果 ping 是一个问题(不是我在赌场的情况),您可能可以托管您的服务器区域库但删除登录,

很抱歉让你的生活更加混乱,但我希望它有所帮助

于 2020-12-22T22:42:39.343 回答