多人游戏的服务器架构? [关闭]

Posted

技术标签:

【中文标题】多人游戏的服务器架构? [关闭]【英文标题】:Server architecture for a multiplayer game? [closed] 【发布时间】:2010-10-12 13:54:12 【问题描述】:

我正计划构建一个小型多人游戏,它可以作为 java 小程序或网络浏览器中的 flash 文件运行。我之前没有做过任何服务器编程,所以我想知道我应该拥有什么样的服务器架构。

在服务器上创建 perl/php 文件对我来说很容易,java/flash 代码会联系这些文件以更新玩家位置/动作等。但我正在考虑是否应该获得一个专用的网络主机,使用哪个操作系统,使用哪个数据库等。此外,使用的带宽量和可扩展性也是一个考虑因素。

另一种选择可能是使用云托管系统(而不是专用服务器),因此他们会随着游戏的发展增加额外的机器。只要每台服务器运行核心 perl/php 文件来更新数据库,它就可以正常工作。

另一种选择可能是使用 Google 应用引擎。

任何关于服务器架构、操作系统/数据库选择以及我使用 perl/php/python 脚本进行服务器端编程的方法是否是一个好的方法的任何想法,将不胜感激!

【问题讨论】:

你能详细说明这是什么游戏吗?这将帮助我们帮助您:) 这将是一款小型多人角色扮演游戏,所以实时而非回合制:) 我认为您最好管理一台机器内存中的所有状态并定期将其备份到数据库(事务性?)。以这种方式同步所有客户端要容易得多。 【参考方案1】:

您需要更清楚地了解游戏,并更多地考虑架构而不是具体的实现细节。

主要问题是您的游戏是实时的、基于回合的还是基于长延迟的(例如,电子邮件国际象棋)。另一个问题是您是否要冻结状态以供后续重新加载。

我强烈建议提前弄清楚同一游戏中的所有玩家是否都将托管在同一服务器上(例如,4 名玩家中的 1000 场比赛与每场 1000 名玩家的 4 场比赛相比)。如果可能,请先使用同一服务器下同一游戏中的每个人。您将很难将多个客户端同步到一个服务器,而不是让多个服务器同步玩家。否则,一致性的定义就有问题。

如果可能,让每个客户端与服务器通信,然后服务器将更新分发给客户端。这样你就拥有了一个“官方状态”,并且可以进行各种冲突解决、幻像等。点对点在更快的游戏(例如 FPS)中提供更好的性能,但会带来大量问题。

我一辈子都找不到任何令人信服的理由来做这个和 perl 或 PHP。你的游戏不是基于网络的,为什么要用面向网络的语言编写它?为服务器使用良好的旧 J2EE,并通过 XML 和 AJAX 与您的客户端交换数据。如果可能,请在客户端而不是 servlet 上运行真正的 Java 应用程序。然后,您可以从使用 JMS 中受益,它会为您抽象出大量通信细节,从而减轻您的负担。

【讨论】:

客户端会将其作为 java 小程序运行。你的意思是服务器应该运行 java servlet 还是服务器应该运行一个成熟的应用程序?只是 perl/php 在服务器上更常见和受支持,所以我认为在它们中创建服务器代码可能是一个更好的主意 服务器应该是一个成熟的应用程序。您可能希望在内存中管理系统状态和客户端之间的同步。 如果您在普通的 Web 服务器上运行 perl/php,那么每个客户端都会有一个单独的进程。如果您运行一个多线程服务器,可以用高级语言处理多个请求,事情可能会更简单。 啊,我明白了。但是服务器必须非常强大才能支持它。您会推荐什么操作系统/数据库,您建议使用云托管还是专用服务器? 您可能高估了您的游戏要求。我曾经在双奔腾 166 上运行过一个 50 人的 MUD。阅读准备好的客户端,处理,更新所有内容。时间滴答,处理,更新所有。除非您的“流程”步骤非常庞大(什么,神经网络 AI?),否则网络将首先成为瓶颈。【参考方案2】:

对于您的服务器架构,您可以查看Three Rings' code。他们用 Java(客户端和服务器端)编写了许多非常可扩展的游戏。

【讨论】:

+1 for Three Rings - 还可以查看他们的 www.gamegardens.com - 它为想要创建自己的多人游戏的人们提供了一个不错且简单的入口点,为您提供了一个创建游戏的框架和让你使用他们的游戏服务器【参考方案3】:

我也不鼓励使用 PHP,HTTP 也不是最好的主意,因为它是无状态且健谈的。我在公司工作了一段时间,目前正在开发非常大型的多人游戏。后端是普通的 JVM(由多个客户端通过 tomcat 连接,每个客户端从手机连接)。因此,我知道您传输的数据越少,服务器上所需的缓冲区就越小 -> 一台机器上的客户端越多,响应速度也就越快。还要考虑安全性,https 相当昂贵,尤其是如果您需要传输图形和声音。您自己的带有非浏览器客户端容器的二进制协议会做得最好(好的选择是开发调试时间的可切换协议)。也许听起来很复杂,但事实并非如此。 @Sarah 很好的提示,也谢谢 ;)

【讨论】:

顺便说一句,AntiP2P 守护者阻止了三环和游戏花园的链接,有人知道这是为什么吗?

以上是关于多人游戏的服务器架构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

大型多人在线游戏服务器架构设计

BS架构

MMO大型多人在线游戏服务器架构简述

node.js 中的多人游戏架构 - 与 Redux 的状态管理和同步

Socket.io & Redis - 适合 io 游戏的架构?

游戏服务器架构概要