C#はリアルタイムゲームサーバーに適していますか?[閉まっている]


22

質問のほとんどはタイトルにあります。

基本的に、2Dマルチプレイヤーアクションゲームの開発を始めています。クライアントは(おそらく)XNAに参加することになるので、サーバー側の開発にもC#を使用することをお勧めします。

言語が管理されているという事実は、MMOゲームサーバーでさえJavaが使用されているため(問題がある場合は修正してください)、問題にはならないので、この目的でC#を避ける理由はありますか?TCPを介して通信し、SQLサーバーとチャットするために、高速で応答する必要があります。そして、C#を避ける理由がない場合、そのようなWebサーバーをどのように展開しますか?それはサーバーマシン上で実行される.NET EXEでしょうか?


2
Java MMOサーバーについては正しいです。
リケット

回答:


22

私の経験では、実行可能であるだけでなく、本当に優れています。C#を使用して複数のMMOサーバーを開発しましたが、言語とプラットフォームの選択を決して後悔したことはありません。

ネットワーク、ロギング、O / Rマッピングなど、C#および.NET向けの優れたライブラリとツールは多数あります。また、Java C#と比較すると、表現力が豊かで冗長ではありません(ただし、これについて議論する人もいます)。 )

一部の人々を怖がらせるGCの「オーバーヘッド」は、1秒間に何十億もの割り当てでそれを悪用しない限り、実際には問題ではありません。例として、現在のサーバーは、高負荷下で最大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エコシステムのパフォーマンスの観点で注意すべき大きな問題の1つはGCです。.NETフレームワークはいくつかのフレーバーのGCを提供します、「サーバー」GCを含む、学ぶ価値のある。プーリングなどによるメモリのインテリジェントな管理は、管理された環境でも依然として優れた手法です。

基本フレームワークの一部として、またはサードパーティを介して、C#のTCPなどを介して通信するSQLと対話するための堅牢なAPIがいくつかありますので、問題はありません。

サーバーをWebベースにしたい場合は、ASP.NETなどを利用できます。プロセスを実行してTCP接続をリッスンするだけであれば、.exeと適切な依存関係をサーバーマシンに展開し、適切なポートを開いて、.exeを実行するだけです。


5

素晴らしいアイデアだと思います。言語は確かにそれが可能であり、特にあなたが知っていることなら、それが「速い」という理由だけでたくさんの時間を新しい言語の学習に費やさないでください。サーバーの本当のボトルネックはネットワーク遅延です。C ++の代わりにC#を使用したため、1〜2ミリ秒余分に違いはありません。


5
マネージ言語でのゲーム開発(またはリアルタイム開発)の本当のリスクは、すべてが1〜2ミリ秒かかるということではありませんが、GCが決定を決定したため、ランダムフレームに数10ミリ秒かかるということです。「ボトルネック」などの用語とスループット重視の比較を奨励することは誤解を招く恐れがあります。

3

Windowsに展開しても問題ない場合は、特にクライアントがC#であるため、強くお勧めします。

ただし、ゲームサーバーの開発を過小評価しないでください。単純なチャット専用の同時サーバーを作成することさえ簡単な作業ではなく、すぐに同時実行、ロック、パフォーマンスなどに関する多くの質問があります。

出発点として、いくつかのプラットフォームで同時ソケットプログラミングを行う方法を広く説明しているこのページをご覧ください。

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

あなたがそれについて本当に真剣なら、私はあなたがスティーブンスのUnixネットワークプログラミングを徹底的に研究することを勧めます。UnixのCソケットに焦点を合わせていますが、原則は.netを含む他のすべてのプラットフォームで同じです。

編集:これは、.netの同時サーバーのスケーラビリティとパフォーマンスに焦点を当てたもう1つの優れたリソースです。もう利用できませんが、ウェイバックマシンにいる友人がコピーを持っています。

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


1

1つの「デメリット」は、C#を複数のプラットフォームで使用する場合、コードがモノで動作することを確認するために非常に注意する必要があることです。単一のプラットフォームで実行するだけで、Windowsがそのプラットフォームである場合は、他の人が述べているように問題はないはずです。


MONOを使用して他のプラットフォームに展開できることを忘れないでください。Second Lifeはこのアプローチを使用していると思います-内部ゲームスクリプトは実際には.NET ILにコンパイルされていますが、Linux AFAIKにデプロイされています。
ShadowChaser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.