社交多人在线浏览器游戏架构(后端选择+前端选择[Flash/Silverlight])

4
我在考虑开发在线多人社交游戏。世界的共享状态需要后端快速处理,因此潜在的解决方案似乎有:
  1. 服务器上的快速游戏引擎(例如C++)和一些前端语言(PHP/Python/Ruby)+ Flash

  2. 整个堆栈使用Python(使用Twisted或Stackless Python)+ Flash

  3. .NET(ASP.NET或ASP.NET MVC)+ Flash

  4. .NET + Silverlight

从生产力角度来看,第一个可能是过度设计(3个异构层)。

第4个可能是程序员的天堂(所有层都使用相同的环境),但:

  • 还没有使用Silverlight构建过这样的东西,也许有一些无法预料的问题
  • 可能很难找到Silverlight设计师
  • 尽管Flash电影/剪辑模型在与SL完全OO架构进行比较时受到批评,但它在外部设计师设计虚拟世界的额外部分时不是优势吗?他们只需准备具有4个透视图的项目的.swf,每个透视图占用4个帧 - 使用SL会更难吗?
  • Silvelight显然在某些游戏功能上缺乏(例如碰撞检测)

你认为呢?

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


你能否以大写字母开头,使用标点符号结尾并重新格式化句子,以便我们能够理解你的表述并找到你的问题?这不是Twitter,清晰地书写会有所帮助。 - S.Lott
对问题进行了多次编辑,并插入了两种不同的项目符号之后,是的先生! - aaimnr
3个回答

6
我曾花了一年时间使用Silverlight作为前端技术和Python作为后端技术开发大型多人在线游戏(实际上我在Silverlight中使用了IronPython以简化开发流程)。
对于这个项目,Silverlight非常适合,我不会用其他任何工具来进行严肃的在线游戏开发。它已经占据了市场的35%,而且在你完成开发之前,它的市场份额应该足够高,不需要过多考虑。对于严肃的游戏,大多数人真的不介意安装一个4MB的浏览器插件。如果你只想制作一个小型的类“星际争霸”的克隆版,请使用Flash。
如果我必须重新开始,我认为我会保留Python作为服务器技术,因为这是我最擅长的服务器技术,但我认为我会使用C#作为前端技术,并使用JSON传递数据。
我能给你的最好建议是:
1.尽可能利用现有的库和代码
2.不要过早考虑性能问题
最困难的部分将是完成游戏,使用你熟悉的技术,并优化你的时间,而不是代码。希望你能做到我做不到的事情-完成该死的游戏:)
关于为什么我会在重新开始时使用C#:
IronPython有它的优点和缺点。它很棒,我可以跨服务器和客户端共享代码文件(常量,模型等)。更改并刷新浏览器以查看它的效果非常好。但是调试不像C#那样友好。
但在某些方面,它是C#的二等公民,数据绑定不起作用,并且您无法在xaml中使用IronPython类。加载时间是一个问题,因此我实际上花了很多精力在后台线程上设置导入并行以加快速度。由于xaml受到二等公民待遇,我使用了一种模板语言来生成xaml,就像它是html一样,这实际上比数据绑定更好,但没有Python模板语言适用于IronPython,所以我编写了自己的(又是一个时间消耗)。
为了启用共享模型,我必须编写自己的ORM。那很容易。但是为了传输它们,我放弃了JSON并制作了一种优化的二进制格式,在IronPython和Python之间起作用。那又是另一个时间消耗。
事后看来,我不应该被所有这些兔子洞分心了。

你为什么认为C#更适合前端?DLR有什么问题吗? - aaimnr

5

Twisted已被成功地用于此目的。它基于异步调用,非常适用于需要持久连接的应用程序。此外,它还具有与Flash一起使用的不错的RTMP实现。请查看chesspark,它是使用Twisted构建的:

http://www.chesspark.com/

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

个人建议您不要使用Silverlight。Flash插件更受欢迎,并且在可预见的未来,特别是在非微软操作系统上,它将继续得到支持。不要介意,但我不会安装Silverlight来玩您的游戏。


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当然可以做到这一点;nignx和lighttpd也可能适用。

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

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


你认为将应用程序与Django堆栈进行潜在集成的想法如何?我猜可能会存在一些兼容性问题? - aaimnr
Django与任何事情有什么关系?如果考虑使用Django,请更新您的问题。 - S.Lott
这只是一个额外的价值 - 如果一个Web框架可以轻松访问全球状态,以呈现站点各个部分的一些数据(除了Flash),那将是很棒的。此外,纯粹的Flash后端通信也可以使用Django MVC来组织。 - aaimnr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接