4

マルチプレイヤーゲームを作っています。今、Androidデバイスをサーバーに接続するテクノロジーを選択しようとしています。クライアントは Android で動作し、ゲームは MMORPG です。サーバーをJavaで書きたいと思います。今のところ、私はそれについて3つのアイデアしか持っていません:

1) プレーン Java とソケットを使用したマルチスレッド環境の作成。これにより、ゲームクライアントとサーバー間の全二重接続がより簡単になります。しかし、次の懸念があります。

1.1) ゲームは多数のオブジェクトを持つ MMORPG であり、たとえば 5000 人が同時にプレイしている場合、そのようなソリューションがどのようにスケーリングされるかわかりません。Java マシンで実行できるスレッドの数は? どうすればそれを概算できますか?1 つのスレッドが各ソケットを読み取り、1 つのスレッドがソケットに書き込みを行っている場合 (つまり、1 人のプレイヤーに対して 2 つのスレッド)。

1.2) プレイヤーの数が増えた場合、自分で作成した jar アーカイブを拡張して複数のサーバーに配布するにはどうすればよいですか? たぶん、それを行うための特別なトリックがありますか?

1.3) 多くのプログラミング オーバーヘッド - ソケット API は非常に低レベルです。

2) HTTP 要求を処理するためのサーブレット インターフェイスを作成します。

2.1) 各プレイヤーが自分のセッションを持っている限り、セッション (および承認) を簡単に制御できます。

2.2) は、Java EE EJB などに接続できます。システム レベルのプログラミングに伴う多くの複雑さが解消されます。そのため、ビジネス ロジックの作成に専念できます。

2.3) HTTP を使用するすべてのタイプのクライアント (モバイル デバイス + ブラウザー) にサービスを提供できます。

2.4) 高速 - 1 つのサーブレット コンテナーでも 1 秒あたり数千のリクエストを処理できるため、非常に高速です。

2.4) しかし、このアプローチは全二重通信を提供できません。更新を確認するために、1 秒ごとにリクエストを送信する必要があります。ゲームはターン制であるため、1 秒の遅延はゲームに大きな影響を与えませんが、それでも大量のトラフィックが生成されます。プレイ人数が多い場合は可能ですか?COMET テクノロジーについて聞いたことがありますが、サーバーが多くのメッセージを連続してプッシュする必要がある場合でも、毎回リクエストを送信する必要があるようです + このテクノロジーはまだ十分に確立されていません。

3) ソケットを作成し、JMS を介して Java EE サーバーに接続します。

3.1) クライアントとサーバー間の全二重通信を可能にし、Java EE のすべての優れた機能を提供するため、クールです。後で、サーブレット インターフェイスを介してブラウザに拡張できます。

3.2) ある種のオーバーエンジニアリングのようです。それは本当に人々がそれをする方法ですか?つまり、それは正しい方法ですか?正気の開発者がそんなことをするだろうか?

選択の参考になれば幸いです。私はそのような仕事をした経験があまりありません。そして、ベストプラクティスに固執したいと思います。

4

1 に答える 1

2

アイデア 3 がエンジニアリングを超えているとは思いません。

onMessage メソッドで着信ソケット接続を処理する @MessageDriven Bean の「アダプター」を構築するのは簡単で、そこから EE の世界を適切にスケーリングできます。

あなたのケースでは、UDP に頼りたくなるかもしれません。次の例を参照してください: http://www.apprigger.com/2011/06/javaee-udp-resource-adapter-example/

しかし、私の観点からすると、この方法を採用する重要な理由は他にもあります。いくつかのポインタ:

1.) すでに述べたように。スレッドとリクエストを処理する独自の Socket Server を構築するのは大変な作業であり、最終的には独自の小さな「アプリケーション サーバー」を構築することになるかもしれません。

2.) アプリケーション サーバーの使用を恐れないでください。もちろん、人々はそのようなプラットフォームを「オーバーヘッド」と呼ぶ傾向があります。他のサービスや ebbs を呼び出す時間を測定したところ、ローカル インターフェイスを使用した場合、1 回の呼び出しにかかるコストは 10 マイクロ秒未満でした。独自のスレッド プールとワーカーを用意し、それらを自分で処理する方が高速かもしれませんが、0 マイクロ秒には近くありません ;-)

3.) AS を使用すると、インスタンスの境界を非常に簡単に構成できます。さらに重要なことは、自作のソフトウェアよりも簡単にアプリケーションをスケーリングできることです。2 台以上のサーバーでクラスターを実行することを想像してみてください (MMO が成功した場合はそうなるでしょう)。ネットワーク ロードバランサーはあらゆる種類のアーキテクチャで機能しますが、EE パッケージでは、セッション情報 (おそらくゲーマー接続ではなく、ログインしているユーザー セッションではそうではない) またはエンティティ マネージャーを共有する可能性があります。

これらすべての EE ツールとパターンにより、フレームワークの代わりにゲームを開発する時間が得られます ;-)

于 2013-06-12T12:22:24.437 に答える