开发游戏服务器的好语言?

时间:2008-12-25 08:25:55

标签: c# java python networking

我只是想知道哪种语言可以成为开发游戏服务器以支持大量(数千)用户的好选择?我涉猎python,但意识到它只会太麻烦,因为它不会在核心之间产生线程(意味着8核心服务器= 1核心服务器)。我也不太喜欢这种语言(那种“自我”的东西让我大吃一惊。)

我知道C ++是性能方面的工作语言,但我讨厌它。我不想处理它草率的语法,我喜欢用托管语言来控制它。这带我到C#和Java,但我对其他语言开放。我喜欢.NET的简单性,但我想知道,从速度上来说,这对于这项工作是否有益。请记住,因为它将部署在Linux服务器上,它将在Mono框架上运行 - 不确定这是否重要。我知道Java在语法方面非常类似于.Net,但我对它的体验是有限的。是否有任何框架可供开发使用,或者可以在开发过程中轻松实现?

请帮助我和我挑剔的自己到达解决方案。

更新:我并不是说听起来如此挑剔,我真的不认为我是。我真正排除的唯一语言是C ++,我不喜欢Python因为可扩展性问题。我知道进程之间有通信的方式,但如果我有一个8核服务器,为什么我需要制作8个进程?有更优雅的解决方案吗?

15 个答案:

答案 0 :(得分:19)

我不想这么说,而且我知道我冒着降压模式在这里冒险,但听起来并不像你有一种语言。所有编程语言都有它们的怪癖,程序员只需要适应它们。完全有可能在Python中编写一个没有类的工作服务器(消除“自”变量类引用),同样也很容易用干净的语法编写C ++。

如果您希望部署跨平台并希望开发跨平台,那么您最好的选择可能是Java。它比C和C ++等编译语言缩短了开发周期,但是比Python和Perl这样的解释语言具有更高的性能(可论证,但我一直都是反Java = P),你不必使用非官方的实现,如单声道可能不时不支持语言的所有功能。

答案 1 :(得分:16)

Erlang是一种围绕多个服务器的并发和分发而设计的语言,非常适合服务器软件。关于Erlang和游戏服务器的一些链接:

http://www.devmaster.net/articles/mmo-scalable-server/

http://www.erlang-consulting.com/euc2005/mmog/mmog_in_erlang.htm

我正在考虑在Erlang中自己编写游戏服务器。

答案 2 :(得分:14)

我可能会稍微偏离主题,但这个主题让我感兴趣,因为我(业余爱好)在很多游戏服务器(MMORPG服务器)上工作 - 在其他人的代码和我的代码上。那里有你感兴趣的文献,如果你想要一些参考文献,请给我留言。

在您的问题中让我感到震惊的一件事是希望为多线程应用程序提供服务。从我卑微的经历来看,这不太合适。 :-)

当您为数千名用户提供服务时,您希望设计尽可能模块化,因为您的主要目标之一是保持整个服务的正常运行。游戏服务器往往相当复杂,因此会有很多显示停止的错误。不要因为单点故障而使你的生活变得悲惨(一次申请!)。

相反,尝试构建可在多个主机上运行的多个进程。我的拙见建议如下:

  • 让它们独立,因此失败的过程与服务无关。
  • 将它们缩小,以便服务的不同部分及其交互方式易于掌握。
  • 不要让用户直接与gamelogic OR DB通信。编写代理 - 当您拥有大量用户时,网络堆栈可以并且将在不同的体系结构上显示奇怪的行为。还要确保以后可以“清理”/过滤代理转发的内容。
  • 有一个流程只会监控其他流程,以确定它们是否仍在正常工作,并能够重新启动部件。
  • 让它们可分发。从一开始就通过TCP协调进程,否则会遇到可伸缩性问题。
  • 如果您拥有大型景观,请考虑通过按地理位置划分服务器来动态划分负载的方法。不要让每个后端进程都将所有数据保存在内存中。

我已经移植了一些用C ++和C#编写的引擎,用于在Linux,FreeBSD和Solaris上运行的主机(在旧的UltraSparc IIi上 - 是的,单声道仍在那里运行:)。根据我的经验,考虑到它在sparc机器上运行的古老硬件,C#足够快。

业界(据我所知)倾向于使用大量C ++进行服务工作,并为实际游戏逻辑嵌入脚本语言。啊,已经写得太多 - 很酷的话题。

答案 3 :(得分:8)

说到纯粹的性能,如果你可以运行Java 6,那么与优化的C ++相比,你可以获得大约1:1的性能(尽管有特殊情况,有时Java更快,有时候是C ++),你唯一的问题当然是东西像数据库库,互连性,可伸缩性等。我相信每种问题都有各种各样的优秀解决方案,但你找不到一种可以解决所有问题的语言,所以我必须给你一个古老的建议:选择你喜欢的语言并使用那个

哦,你还在读这个吗? :)好吧,这里有一些额外的指示。

  • EVE Online使用Python作为客户端和服务器端代码,它既有bug又有滞后性,因为我不认为我应该在这里写一些内容,因此这是一个如何将Python扩展到(很差)为大量用户提供服务。
  • 虽然Java对各种相关问题有很好的解决方案,但对于大量用户来说,它并不是最好的语言;如果没有调整,它就无法很好地扩展到极端。然而,有一些多VM解决方案可以解决这个问题,例如Terracotta可以很好地完成工作。
  • 虽然C ++相当繁琐,但它允许与系统进行这种低级别的交互,实际上你可能会发现自己做了一些你认为不能做的事情。我正在考虑像运行时代码块的动态每核闪烁一样,以尽可能高效地“填充”处理器的每个可能的时钟周期,以获得最佳性能等等。
  • Mono远远落后于Windows平台上的.NET VM /等价物,因此您将无法使用C#的最新和最高级功能。然而,目前Windows XP(x64)OEM许可证的价格非常便宜,只需很少的投资就可以获得大量的许可证,然后您可以在平台上运行您的代码。并且不要陷入Linux炒作,只有当你真正知道如何使用Linux时,Linux才是你的救星,尤其是XP现在非常快速和稳定。

答案 4 :(得分:7)

您需要什么样的表现?

对于需要大量并发性的服务器来说,

twisted非常适合,就像erlang一样。要么容易支持大规模并发,要么具有分布式计算的功能。

如果你想在python应用程序中跨越多个核心,如果你想跨越多台机器,那就做同样的事情 - 运行多个进程。

答案 5 :(得分:3)

有关此游戏服务器的更多详细信息可能有助于人们更好地回答您的问题。这是一个类似Counter Strike专用服务器的游戏服务器,它位于后台并承载多人交互,或者你正在写一些将在HTTP网络服务器上托管的东西?

就个人而言,如果是我,我会考虑使用Java或C ++。我个人的偏好和技能可能会引导我走向C ++,因为我发现Java在两个平台上都很笨拙(更多的是在Linux上)并且没有信心C#已经为Linux中的黄金时段做好了准备。

也就是说,在你的语言表现出现问题之前,你还需要有一个非常重要的社区来攻击所述服务器。我的建议是用目前你能用的任何语言写它,如果你的游戏规模足够大,那么就投入重写。

答案 6 :(得分:2)

您也可以使用Java并使用GCC将代码编译为本机可执行文件。

这样你就不会受到字节码引擎的性能影响(是的,我知道 - 开箱即用的Java和C ++一样快。只有我总能衡量因素5的性能差异)。缺点是GCC Java前端不支持所有Java 1.6语言功能。

另一种选择是使用您选择的语言,首先使代码工作,然后将性能关键的东西移动到本机代码中。几乎所有语言都支持绑定到已编译的库。

这并不能解决你的“python没有多线程”问题,但它会为你提供更多选择。

答案 7 :(得分:2)

明显的候选人是Java和Erlang:

Pro Java:

  • 易于开发
  • 良好的发展环境
  • 稳定性,良好的堆栈痕迹
  • 众所周知(很容易找到经验丰富的程序员,很多图书馆,书籍......)
  • 相当快,成熟的VM

Pro Erlang:

  • 在需要> 99.9%正常运行时间的系统中得到验证
  • 无需停机即可进行软件更新的能力
  • 可扩展(不仅是多核,还包括多机)

Contra Erlang:

  • 不熟悉的语法和编程范例
  • 不太知名;
  • 很难找到有经验的程序员
  • VM并不像java那样快

如果您的游戏服务器主要用作事件调度程序(隐藏了一些数据库),那么Erlang的消息驱动范例应该是一个很好的匹配。

在这个时代,我不会考虑使用非托管语言(如C或C ++);边际绩效收益根本不值得麻烦。

答案 8 :(得分:1)

这可能在很大程度上取决于您的“游戏逻辑”(您可能将此术语称为“业务逻辑”)的语言最佳表达方式。例如,如果游戏逻辑最好用Python表达(或任何其他特定的话)语言)最好用Python编写它,并用多线程或聚类来解决性能问题。尽管你可能花费大量时间来获得你想要的性能,但是你需要花费很多时间表达“玩家A现在在7个单位的半径范围内施放70级黑暗法术效果”所有与玩家B和......交谈的单位“在C ++中。

还需要考虑的是您将使用哪种协议与客户进行通信。如果你有一个复杂的二进制协议,C ++可能会更容易(特别是如果你之前已经有过这样的经验),而JSON(或类似的)可能更容易在Python中解析。是的,我知道C ++和python不是你所限制的语言(甚至是考虑的),但我一般都会在这里提到它们。

可能归结为你最擅长的语言。你讨厌写作的写得不好的程序,会更糟糕的是用你熟悉和喜欢的语言编写的程序,即使写得不好的程序是一种可论证的更强大的语言。

答案 9 :(得分:0)

您还可以查看jRuby。它带来了Java的许多好处以及Ruby在一个整洁的软件包中的许多好处。您可以访问两种语言的大型库。

答案 10 :(得分:0)

你的目标是什么?不是游戏本身的创造,而是你为什么创造它?

如果你这样做是为了学习一门新语言,那么选择一个对你来说最有趣的语言(即你最想学习的语言)。

如果是出于任何其他原因,那么最好的语言将是您最熟悉且最喜欢使用的语言。这将使您能够专注于制定游戏逻辑并开始运行,以便您可以看到进度并保持继续的动力,而不是陷入您正在使用的语言的细节并失去兴趣。

如果您最喜欢的语言在某些方面证明不合适(太慢,不够表达,无论如何),那么当出现问题时,您可以用更合适的语言重写问题部分 - 而且您不会知道最好的语言解决具体问题,直到你知道问题最终是什么。即使你选择的语言完全不适合最终的制作使用,并且整个事情必须重写,它会给你一个带有经过测试的游戏逻辑的工作原型,这将使​​得处理新语言变得更加容易。

答案 11 :(得分:0)

您可以查看Stackless Python。它是另一种Python解释器,可以为并发提供更好的支持。 EVE Online的服务器和客户端软件都使用Stackless Python。

免责声明:我自己并未广泛使用Stackless Python,因此我无法提供有关其有效性的第一手资料。

答案 12 :(得分:0)

开发中有一个很酷的框架可以满足您的所有需求:

来自Sun的

Project Darkstar。所以我认为Java似乎是游戏服务器开发的好语言: - )

答案 13 :(得分:0)

我知道facebook使用Erlang和C ++的组合作为聊天引擎。

无论你决定什么,如果你选择语言组合,请查看facebook的跨语言服务部署的thrift框架。他们开源大约一年+后退:

http://incubator.apache.org/thrift/

答案 14 :(得分:-1)

与C相比,C ++和Java相当慢。语言应该是一种工具,而不是拐杖。