4

我正在考虑开发在线多人社交游戏。世界的共享状态需要在后端有一些快速的东西,所以潜在的解决方案似乎是:

  1. 服务器上的快速游戏引擎(例如 c++)和一些前端语言(php/python/ruby)+ flash

  2. python中的整个堆栈(使用扭曲或无堆栈python)+ flash

  3. .NET(asp.net 或 asp.net mvc)+ 闪存

  4. .NET + 银光

从生产力的角度来看,第一个可能是过度杀伤(3 个异构层)

编号。4 可能是程序员的天堂(所有层的公共环境),但是:

  • 从来没有用 Silverlight 构建过这样的东西,也许在拐角处隐藏着一些令人兴奋的东西
  • 可能很难找到 Silverlight 设计师
  • 尽管 Flash 电影/剪辑模型与 SL 完整 OO 架构相比受到批评,但在外部设计师设计虚拟世界的额外部分时,它不是一个优势吗?他们可以用例如准备.swf。4 帧上的 4 个项目的视角 - 使用 SL 会不会更难?
  • Silvelight 显然缺乏一些游戏功能(如碰撞检测)

你怎么看?

[编辑] 游戏本身将成为更大门户的一部分 - 因此将引擎与一些 Web 框架集成会很好。

4

3 回答 3

6

我花了一年时间开发一个大型多人在线游戏,前端使用 Silverlight,后端使用 Python(我实际上在 Silverlight 中使用 IronPython,以简化开发)

Silverlight 非常适合这个,我不会在其他任何方面做一个严肃的在线游戏。它已经拥有 35% 的市场份额,当你完成开发时,它应该足够高,不再重要。对于严肃的游戏,大多数人真的不介意安装 4MB 浏览器插件。如果你只是想要一个小行星克隆,使用闪光灯。

如果必须重做,我想我会为服务器保留 Python,因为它是我最熟练的服务器技术,但我认为我会在前端使用 C# 并使用 JSON 来传递数据。

我能给你的最好建议是:

  1. 尽可能利用现有的库和代码
  2. 不要过早地考虑性能

最困难的部分将是完成游戏,使用您熟悉的技术,并优化您的时间,而不是代码。希望你能做我做不到的事——完成该死的游戏:)

编辑

关于如果我不得不重新使用 C# 的原因:

IronPython 有它的优点和缺点。很高兴我可以在服务器和客户端之间共享代码文件(常量、模型等)。进行更改并刷新浏览器以查看它真是太棒了。调试不如 C# 友好。

但在某些方面,它是 C# 的二等公民,数据绑定不起作用,并且您不能在 xaml 中使用 IronPython 类。加载时间是个问题,所以我实际上花了很多精力在后台线程上设置并行导入以加快速度。由于涉及到 xaml 的第二公民身份,我使用模板语言来生成 xaml,就好像它是 html 一样,这实际上比数据绑定更好,但是在 IronPython 中没有 python 模板语言工作,所以我自己编写了 (另一个时间沉没。)

为了启用共享模型,我必须编写自己的 ORM。这很容易。但是为了传输它们,我传递了 JSON 并制作了一种优化的二进制格式,而不是在 IronPython 和 Python 之间工作。那是另一个时间沉没。

事后看来,我不应该被所有那些兔子足迹分心。

于 2009-08-10T14:28:37.703 回答
5

Twisted 已成功用于此目的。基于异步调用它对于需要持久连接的应用程序非常有效。它还有一个很好的 RTMP 实现,可与 flash 一起使用。检查 chesspark,它是用 Twisted 构建的:

http://www.chesspark.com/

另外,游戏引擎并不一定要使用 c/c++。取决于游戏的复杂性和类型。但也有相当不错的 pygame 库。

就我个人而言,我不鼓励您使用 Silverlight。flash 插件被更好地采用并且将在可预见的将来继续使用,尤其是在非 ms 操作系统上。不要把这个放在心上,但我不会安装 silverlight 只是为了看你的游戏。

于 2009-03-12T15:34:38.913 回答
3

选项 2——使用无堆栈 Python——是 Eve Online 使用的。

http://support.eve-online.com/Pages/KB/Article.aspx?id=128


编辑

当然,除非您拥有实际的软件,否则不可能创建一个性能相当好的架构。所以,这里的任何判断都只是无谓的猜测。

但是,请考虑以下内容。

  1. 静态内容(.js 文件、.css、.png 等)往往会支配您的网络带宽。您必须使用反向代理服务器(例如 squid)来处理此问题。

  2. Squid 必须从某个地方获取内容。您需要一个轻量级文件服务器,为 squid 提供静态内容。Nginx 或 lighttpd 什么的。Apache 将为此工作,但是——在某种程度上——它可能是矫枉过正的。

  3. 您的动态内容——它看起来——将有两种形式。

    • JSON 支持游戏。

    • 支持门户的 HTML。

    为此,您对 mod_wsgi 引擎最满意。阿帕奇当然会这样做;ngingnx 和 lighttpd 也可以工作。

    • 您的 JSON 内容应该是一组 URI。REST 是一种很好的设计模式。通过 mod_wsgi,它们使用无堆栈 Python 连接到面向游戏的服务器——如果有必要的话。您的前端(例如 Apache)有一个位置、目录或虚拟主机来过滤这些 URI 并将它们路由到为游戏提供服务的 mod_wsgi 守护程序。看看Wekzeug来构建它。

    • 您的 HTML 内容是另一组 URI。通过 mod_wsgi,它们连接到运行传统 Python 的 Django 服务器。您的前端(例如 Apache)有一个位置、目录或虚拟主机来过滤这些 URI 并将它们路由到 mod_wsgi 守护进程。

于 2009-03-12T15:22:28.990 回答