C#是否适用于实时游戏服务器?[关闭]


22

大部分问题都在标题中。

基本上,我将开始开发2D多人动作游戏。客户端(可能)将使用XNA,我想在这里问一下使用C#进行服务器端开发是否是一个好主意。

我想管理语言是没有问题的,因为Java甚至在MMO游戏服务器中都在使用Java(如果我错了,请纠正我),那么出于这个目的有什么理由避免使用C#?我需要它快速且响应迅速,通过TCP进行通信,与SQL Server聊天。并且如果没有理由避免使用C#,我将如何部署这样的Web服务器,它将是在服务器计算机上运行的.NET EXE吗?


2
您对Java MMO服务器是正确的。
Ricket

Answers:


22

根据我的经验,不仅可行,而且非常好。我已经使用C#开发了几台MMO服务器,我必须说我从不后悔选择语言和平台。

一般而言,对于C#和.NET,有很多很棒的库和工具-网络,日志记录,O / R映射等。而且,与Java C#相比,C#更具表现力,更不那么冗长(不过,有些人可能会对此争论不休。) )

恐吓某些人的GC“开销”并不是真正的问题,除非您碰巧以每秒数十亿的分配滥用它。例如,我们当前的服务器在重负载下的分配速度高达50 mb /秒,而GC不会引入任何明显的延迟。但是,我们确实必须在战略性位置使用对象池-最重要的是,代表网络数据包的对象被池化而不是垃圾回收。即使关闭池,GC也不是最大的问题。

作为C#多么酷的一个例子,这是我们最近实现的。我们的服务器运行多个WCF服务,游戏客户端将其用于非时间紧迫的任务,并且还将它们用于服务器管理。事实证明,建立WCF服务以简单地将我们的游戏对象返回给调用者非常容易。因此,我们做到了,然后为LINQPad制作了一个小插件以连接到我们的服务器-现在我们可以运行查询

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

在实时服务器上,同样如此!我认为您无法在任何其他平台上执行此操作。至少不在几天的工作中。


我特别喜欢LINQ的使用,这使服务器的开发变得如此简单和快捷。
托马斯

26

当然,您可以使用C#。

就C#或其他.NET生态系统的性能而言,要意识到的更大问题之一是GC – .NET框架提供了几种值得学习的GC风格,包括“服务器” GC。即使在托管环境中,智能管理内存(例如,通过池化)仍然是一项不错的技术。

作为基础框架的一部分或通过第三方,有几种健壮的API用于与SQL交互,通过TCP等以C#进行通信,因此在此应该没有麻烦。

如果您确实希望服务器基于Web,则可以使用ASP.NET或类似工具。如果您只想运行一个进程并侦听TCP连接,则可以将.exe和适当的依赖项部署到服务器计算机,打开适当的端口,然后运行.exe。


5

我认为这是个好主意。该语言当然可以,特别是如果您所知道的,不要花很多时间学习一种新语言,只是因为它“更快”。服务器的真正瓶颈将是网络延迟。多花一两毫秒,因为您使用C#而不是C ++不会产生任何影响。


5
使用托管语言进行游戏开发(或任何实时开发)的真正风险不是,所有事情都需要花费一毫秒或两毫秒,而是因为GC决定完成事情,所以随机帧将花费数十毫秒。以“瓶颈”之类的术语来鼓励以吞吐量为中心的比较是令人误解的。

3

如果可以在Windows上部署,我强烈建议您这样做,尤其是因为您的客户端是C#。

但是不要低估游戏服务器的开发。即使制作一个简单的仅聊天的并发服务器也不是一件容易的事,并且您很快就会遇到许多有关并发性,锁定,性能等方面的问题。

作为起点,我希望您看一下该页面,该页面广泛地解释了如何在多个平台上进行并发套接字编程:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

如果您真的很认真,建议您彻底研究Stevens的Unix网络编程。它的重点是Unix上的C套接字,但是其他所有平台(包括.net)的原理都相同。

编辑:这是另一个很棒的资源,专注于.net中并发服务器的可伸缩性和性能。它不再可用,但是我们在Wayback机器上的朋友可以得到它的副本。

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


1

一个“缺点”是对于C#,如果要在多个平台上使用它,则必须非常小心以确保您的代码可以与mono一起使用。如果您只关心在单个平台上运行它,而Windows是该平台,那么您应该不会有别人提到的问题。


不要忘记,MONO可用于在其他平台上进行部署。我相信Second Life使用这种方法-他们的内部游戏脚本实际上已编译为.NET IL,但仍可部署在Linux AFAIK上。
ShadowChaser 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.