开发游戏服务器的好语言?
Posted
技术标签:
【中文标题】开发游戏服务器的好语言?【英文标题】:Good language to develop a game server in? 【发布时间】:2010-09-28 09:39:50 【问题描述】:我只是想知道哪种语言是开发游戏服务器以支持大量(数千)用户的好选择?我涉足 python,但意识到这太麻烦了,因为它不会跨内核产生线程(意味着 8 核服务器 = 1 核服务器)。我也不太喜欢这种语言(那种“自我”的东西让我感到恶心)。
我知道 C++ 在性能方面是适合这项工作的语言,但我讨厌它。我不想处理它草率的语法,我喜欢我的手被托管语言握住。这让我接触到了 C# 和 Java,但我对其他语言持开放态度。我喜欢 .NET 的简单性,但我想知道,从速度方面来说,这是否适合这项工作。请记住,因为这将部署在 Linux 服务器上,它将在 Mono 框架上运行 - 不确定这是否重要。我知道 Java 在语法方面与 .Net 非常相似,但我对它的经验有限。是否有任何框架可以用于它或可以简化开发?
请帮助我和我挑剔的自己找到解决方案。
更新:我不是故意听起来那么挑剔,我真的不认为我是。我真正排除的唯一语言是 C++,由于可扩展性问题,我不喜欢 Python。我知道进程之间有多种通信方式,但是如果我有一个 8 核服务器,为什么我需要制作 8 个进程?有没有更优雅的解决方案?
【问题讨论】:
【参考方案1】:我不想这么说,而且我知道我在这里冒着降低模式的风险,但听起来好像没有适合你的语言。所有编程语言都有其怪癖,程序员只需要适应它们。完全可以在没有类的情况下用 Python 编写一个工作服务器(消除“self”变量类引用),同样用干净的语法编写 C++ 也同样容易。
如果您正在寻找跨平台部署并且还想开发跨平台,那么您最好的选择可能是 Java。它比 C 和 C++ 等编译语言更短的开发周期,但比 Python 和 Perl 等解释语言具有更高的性能(有争议,但我一直反对 Java =P),而且您不必使用非官方实现,例如有时可能不支持一种语言的所有功能的 Mono。
【讨论】:
【参考方案2】:我在这里可能有点跑题了,但是这个话题让我很感兴趣,因为我(爱好方面)在很多游戏服务器(MMORPG 服务器)上工作过——在其他人的代码上以及我的代码上。那里有您感兴趣的文献,如果您需要一些参考资料,请给我留言。
在您的问题中让我印象深刻的一件事是希望通过多线程应用程序为一千名用户提供服务。根据我卑微的经验,这不太好。 :-)
当您为成千上万的用户提供服务时,您希望设计尽可能模块化,因为您的主要目标之一是保持服务作为一个整体正常运行。游戏服务器往往相当复杂,因此会有不少令人震惊的错误。不要因为单点故障(一个应用程序!)而让您的生活变得悲惨。
相反,尝试构建可以在多个主机上运行的多个进程。我的谦虚建议如下:
使它们独立,因此失败的进程将与服务无关。 将它们缩小,以便服务的不同部分及其交互方式易于掌握。 不要让用户直接与 gamelogic OR DB 通信。编写代理 - 当您拥有大量用户时,网络堆栈可以并且将会在不同架构上显示奇怪的行为。还要确保您以后可以“清理”/过滤代理转发的内容。 拥有一个只监视其他进程以查看它们是否仍在正常工作的进程,并能够重新启动部件。 使它们可分发。从一开始就通过 TCP 协调进程,否则您将遇到可扩展性问题。 如果您有大型景观,请考虑通过按地理位置划分服务器来动态划分负载的方法。不要让每个后端进程都将所有数据都保存在内存中。我已经为在 Linux、FreeBSD 和 Solaris 上运行的主机移植了一些用 C++ 和 C# 编写的此类引擎(在旧的 UltraSparc IIi 上 - 是的,mono 仍然在那里运行 :)。根据我的经验,考虑到它在 sparc 机器上运行的古老硬件,C# 已经足够快了。
业界(据我所知)倾向于使用大量 C++ 来提供服务,并为实际游戏逻辑嵌入脚本语言。啊,已经写太多了 - 很酷的话题。
【讨论】:
【参考方案3】:Erlang 是一种围绕并发和分布在多个服务器上而设计的语言,非常适合服务器软件。关于 Erlang 和游戏服务器的一些链接:
http://www.devmaster.net/articles/mmo-scalable-server/
http://www.erlang-consulting.com/euc2005/mmog/mmog_in_erlang.htm
我正在考虑自己用 Erlang 编写一个游戏服务器。
【讨论】:
【参考方案4】:说到纯粹的性能,如果你可以运行 Java 6,那么与优化的 C++ 相比,你可以获得大约 1:1 的性能(尽管有特殊情况,有时 Java 更快,有时 C++),你唯一会遇到的问题当然是东西像数据库库、互连性、可扩展性等。我相信对于这些问题中的每一个问题都有各种从好的到好的解决方案,但是您不会找到一种可以为您解决所有问题的语言,因此我必须给您一个古老的建议:选择您喜欢的语言并使用该语言.
哦,你还在读这个吗? :) 好吧,这里有一些额外的提示。
EVE Online 将 Python 用于其客户端和服务器端代码,它充满了 bug 和滞后,因为我认为我不应该在这里写,所以这将是 Python 可以如何扩展到(较差)服务的一个示例用户数量。 虽然 Java 对各种相关问题有一些很好的解决方案,但对于大量用户来说,它确实不是最好的语言;如果没有调整,它不能很好地扩展到极端。不过,有一些多虚拟机解决方案可以在一定程度上解决这个问题,例如 Terracotta 据说可以很好地完成这项工作。 虽然 C++ 相当繁琐,但它允许与系统进行如此低级别的交互,以至于您实际上可能会发现自己正在做一些您认为自己做不到的事情。我正在考虑诸如运行时代码块的动态每核微集群之类的东西,以尽可能高效地“填充”处理器的每个可能的时钟周期,以获得最佳性能等等。 Mono 远远落后于 Windows 平台上的 .NET VM/等价物,因此您将无法使用 C# 的最新和最精美的功能。然而,Windows XP (x64) OEM 许可证目前非常便宜,只需少量投资,您就可以获得一大堆许可证,然后您就可以在原本应有的平台上运行您的代码。不要陷入 Linux 的炒作中,只有当你真正知道如何使用它时,Linux 才是你的救星,尤其是现在 XP 非常快而且稳定。【讨论】:
虽然我还没有尝试过,但 EVE 最近进行了一次重大改写,他们说这显着提高了性能。这向我表明,滞后问题出在他们的架构上,而不是由于他们选择的语言。每种语言都因糟糕的架构而运行缓慢。 他们已经通过一个新的网络层(“Stackless I/O”)消除了一些网络瓶颈,但是他们的可扩展性问题仍然存在,因为他们没有任何动态负载平衡(他们不能移动一个繁忙的太阳能系统到另一个服务器而不“重新启动”它)。 EVE afaik 滞后的最大原因是他们对数据库架构的选择不当(一个 SQL 服务器和多个 SOL,带宽非常大),还有一些是因为他们在错误的地方有趣地使用了 Python,所以是的,你说得对,这主要是一个架构问题。 @Esko AFAIK 数据库服务器在舰队战中的使用并不多。他们有超过 5000 个太阳系分配给 250-300 个 CPU/“节点”,并且任何数量的战斗都可能随时在同一节点上的不同太阳系中爆发,这也可能处理一个繁忙的任务中心。没有负载平衡 = 不好。 S.Lott:我不想因为提到 EVE 而获得积分,而是我的帖子的实际内容。 mjy:你知道每个系统节点实际上是一个运行在服务器模式下的 EVE 客户端吗?这就是为什么他们不能真正正确地对它们进行负载平衡。糟糕的设计选择。【参考方案5】:你需要什么样的性能?
twisted 非常适合需要大量并发的服务器,erlang 也是如此。无论是轻松支持大规模并发,并具有分布式计算的设施。
如果您想在 Python 应用程序中跨越多个核心,请执行与希望跨越多台机器相同的操作 - 运行多个进程。
【讨论】:
【参考方案6】:有关此游戏服务器的更多详细信息可能会帮助人们更好地回答您的问题。这是一个游戏服务器,就像 Counter Strike 专用服务器一样,它位于后台并托管多人交互,还是您正在编写将托管在 HTTP 网络服务器上的东西?
就个人而言,如果是我,我会考虑 Java 或 C++。我的个人偏好和技能组合可能会引导我转向 C++,因为我发现 Java 在两个平台上都难以使用(在 Linux 上更是如此),而且我不相信 C# 已经准备好在 Linux 中的黄金时间。
也就是说,在您的语言性能出现如此大的问题之前,您还需要有一个相当重要的社区对所述服务器进行锤击。我的建议是用你目前可以使用的任何语言编写它,如果你的游戏变得足够大,那么到那时投资重写。
【讨论】:
【参考方案7】:您也可以使用 Java 并使用 GCC 将代码编译为本机可执行文件。
这样您就不会受到字节码引擎的性能影响(是的,我知道 - Java 开箱即用的速度与 C++ 一样快。一定只有我总是会测量 5 倍的性能差异)。缺点是 GCC Java 前端不支持所有 Java 1.6 语言特性。
另一种选择是使用您选择的语言,首先让代码工作,然后将性能关键的东西移到本机代码中。几乎所有语言都支持绑定到已编译的库。
这并不能解决您的“python 不能很好地多线程”的问题,但它为您提供了更多选择。
【讨论】:
【参考方案8】:明显的候选者是 Java 和 Erlang:
专业 Java:
易于开发 良好的开发环境 稳定性,良好的堆栈跟踪 知名(很容易找到有经验的程序员、大量的图书馆、书籍……) 相当快速、成熟的虚拟机专业二郎:
在需要 >99.9% 正常运行时间的系统中得到验证 无需停机即可进行软件更新 可扩展(不仅多核,而且多机)Contra Erlang:
不熟悉的语法和编程范式 不太知名;很难找到有经验的程序员 VM 不如 java 快如果您的游戏服务器主要用作事件调度器(带有一些数据库),那么 Erlang 的消息驱动范式应该是一个很好的匹配。
在这个时代,我不会考虑使用非托管语言(如 C 或 C++);边际性能收益根本不值得麻烦。
【讨论】:
【参考方案9】:这可能很大程度上取决于您的“游戏逻辑”(您可能知道这个术语为“业务逻辑”)最适合用什么语言表达。例如,如果游戏逻辑最好用 Python(或任何其他特定的语言)最好只用 Python 编写它,并使用多线程或集群以困难的方式处理性能问题。尽管从 Python 中获得所需的性能可能会花费您很多时间,但您表达“玩家 A 现在在 7 个单位的半径范围内施放 70 级黑暗法术”所花费的时间会更少所有与玩家 B 和 .... 交谈过的单位在 C++ 中。
另外需要考虑的是您将使用什么协议与客户端进行通信。如果你有一个复杂的二进制协议,C++ 可能更容易(尤其是如果你之前已经有经验),而 JSON(或类似的)可能更容易在 Python 中解析。是的,我知道 C++ 和 python 不是你被限制(甚至考虑)的语言,但我在这里一般指的是它们。
可能归结为您最擅长的语言。一个你讨厌写的写得不好的程序会比用你熟悉和喜欢的语言写的更糟糕,即使写得不好的程序是用一种更强大的语言编写的。
【讨论】:
【参考方案10】:您也可以查看jRuby。它在一个简洁的包中提供了 Java 的许多优点和 Ruby 的许多优点。您可以访问两种语言的大型库。
【讨论】:
【参考方案11】:您的目标是什么?不是游戏本身的创作,而是你为什么要创作它?
如果您这样做是为了学习一门新语言,请选择您认为最有趣的一种(即您最想学习的一种)。
如果出于任何其他原因,那么最好的语言将是您已经最了解并最喜欢使用的语言。这将使您能够专注于制定游戏逻辑并启动并运行某些东西,以便您可以看到进度并保持继续前进的动力,而不是陷入您正在使用的语言的细节并失去兴趣。
如果您最喜欢的语言在某些方面被证明是不合适的(太慢、不够表达等等),那么当出现问题时,您可以用更合适的语言重写问题部分 - 而且您不会知道最适合的语言解决具体问题,直到你知道问题最终是什么。即使您选择的语言被证明完全不适合最终生产使用并且必须重写整个内容,它也会为您提供经过测试的游戏逻辑的工作原型,这将使处理新语言变得更加容易。
【讨论】:
【参考方案12】:您可以查看Stackless Python。它是一种替代 Python 解释器,可为并发提供更大的支持。 EVE Online 的服务器和客户端软件都使用 Stackless Python。
免责声明:我自己没有广泛使用 Stackless Python,所以我无法提供任何关于其有效性的第一手资料。
【讨论】:
【参考方案13】:有一个非常酷的框架正在开发中,可以满足您的所有需求:
Project Darkstar 来自 Sun。所以我会说 Java 似乎是游戏服务器开发的好语言 :-)
【讨论】:
【参考方案14】:我知道 facebook 使用 Erlang 和 C++ 的组合作为他们的聊天引擎。
无论您决定什么,如果您选择多种语言组合,请查看 facebook 的跨语言服务部署节俭框架。他们大约一年前开源了它:
http://incubator.apache.org/thrift/
【讨论】:
【参考方案15】:与 C 相比,C++ 和 Java 的速度相当慢。语言应该是工具,而不是拐杖。
【讨论】:
以上是关于开发游戏服务器的好语言?的主要内容,如果未能解决你的问题,请参考以下文章
我想开发一款网络游戏,请问有啥语言写客户端,用啥语言写服务器端