社交多人浏览器游戏的架构(后端选择+前端选择[flash / silverlight])

时间:2009-03-12 11:48:08

标签: .net silverlight multiplayer python-stackless

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

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

  2. python中的整个堆栈(使用twisted或stackless python)+ flash

  3. .NET(asp.net或asp.net mvc)+ flash

  4. .NET + silverlight

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

    NR。 4可能是程序员的天堂(所有层面的共同环境),但是:

    • 没有用Silverlight构建这样的东西,也许有一些隐藏在幕后的showstoppers
    • 可能很难找到silverlight designer
    • 尽管与SL完全OO架构相比,Flash电影/剪辑模型受到批评,但在外部设计师设计虚拟世界的其他部分时,这不是一个优势吗?他们可以用例如准备.swf。 4个项目的4个视角 - SL会不会更难?
    • Silvelight显然缺少某些游戏功能(如碰撞检测)
    你觉得怎么样?

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

3 个答案:

答案 0 :(得分:6)

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

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

如果我不得不这样做,我想我会为服务器保留Python,因为它是我最熟练的服务器技术,但我想我会在前端使用C#并使用JSON传递数据

我能给你的最好建议是:

  1. 尽可能多地利用现有的库和代码
  2. 不要过早考虑表现
  3. 最艰难的部分是完成游戏,使用你熟悉的技术,并优化你的时间,而不是代码。希望你能做我不能做的事 - 完成该死的游戏:)。

    修改

    关于为什么我要使用C#,如果我不得不这样做:

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

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

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

    事后来看,我不应该被所有这些兔子小径分心。

答案 1 :(得分:5)

Twisted已成功用于此目的。基于asynchronius调用它对于需要持久连接的应用程序非常有效。此外,它还有一个很好的RTMP实现,可用于flash。检查国际象棋公园,它是用Twisted构建的:

http://www.chesspark.com/

此外,游戏引擎并非真的必须使用c / c ++。取决于游戏的复杂性和类型。但是还有pygame库非常好。

我个人不鼓励你使用silverlight。 Flash插件更好地采用,并将继续在可预见的未来,特别是在非ms操作系统上。不要把这个放在心上,但我不会为了看你的游戏而安装silverlight。

答案 2 :(得分: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引擎。 Apache肯定会这样做; ngingnx和lighttpd也可能有效。

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

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