0

学習実験の一環として、ネットワーク アプリケーションを作成したいと考えています。私はまだマルチスレッドについて学んでおり、プレーヤーがスプライトを動かすことができる画面上にスプライトを描画することを含む、単純なマルチスレッド「ゲーム」を作成しました。

この新しいプロジェクトでは、経験と学習のためだけに、シンプルなものを作りたいと思っています。複数のクライアントが接続できるサーバーを作成したいと考えています。サーバーには「ゲーム オブジェクト」が含まれます。これは、x と y の位置、文字列名、それを識別する ID、および速度 (dx と dy) を含むオブジェクトです。

「サーバー」アプリケーションは、(速度を使用して) オブジェクトの位置を更新するワーカー スレッドのような機能を備え、クライアントにすべてのゲーム オブジェクトの「状態」も送信するため、クライアントはプレイヤーがオブジェクトを描画できるようになります。見る。

プレーヤーがキーボードのボタンを押して KeyEvent を生成するたびに、クライアントはサーバー データも送信します。サーバーはこのデータを読み取り、プレイヤーのゲーム オブジェクトを更新して処理します。たとえば、プレイヤーが左矢印キーを押すと、クライアントは左キーが押されたことを示すサーバー データを送信し、サーバーはクライアントに関連付けられたゲーム オブジェクトを見つけます (おそらく、オブジェクトを Map のように保存しますか? )

問題はこれをどうするかです。私はこれまでにこの規模のネットワーキングを行ったことがありません。これまでに作ったものの中で最も多いのは、バグのある 2 人用の tic tac toe ゲームです。それはターンベースなので、私が今作ろうとしているアプリケーションとは大きく異なります。調査として、Oracle の同時実行のレッスン全体を読みました。NIO のこのチュートリアルも読みました。私はこれまで NIO を使用したことがありませんでしたが、複数の人から使用を勧められました。コードを読んでその仕組みを理解することで、マルチスレッドと同時実行性について多くのことを学びました。

SocketChannels は ByteBuffers を使用して通信するため、私が考えた戦略の 1 つは、GameObjects のリストを取得し、それをバイト配列にシリアル化することです。次に、ByteArray を使用して ByteBuffer を作成し、それをクライアントに送信します。その後、クライアントはサーバーにロードされたすべてのゲームオブジェクトを取得し、タイプと状態に基づいてそれらすべてを描画できるようになります。これに関する 1 つの問題は、バイト配列が非常に大きくなる可能性があることです。256 個のゲームオブジェクトでテストしたところ、最大 9KB のバイト配列が得られました。バイト配列を圧縮すると、サイズは約 96 バイトになります。それでも、これがクライアントに 1 秒間に 15 回送信するには大きすぎるかどうかはわかりません。

私が知っている別のオプションは、情報をバイトごとに送信することです。たとえば、送信された最初のバイトは、送信しているゲーム オブジェクトのタイプ (例: 猫、車、人) を識別し、次の 2 バイトは X 位置を識別し、次の 2 バイトは Y 位置を識別し、最後に使用したバイトを識別することができます。オブジェクトの状態を識別します。このデータを使用して、クライアントは受け取った位置にスプライトを描画するだけです。

ここまで述べてきたことの大きな問題は、クライアントがどのオブジェクトとも対話できないことです。クライアントは単純なコマンドをサーバーに送信するだけで、その位置でゲーム オブジェクトのスプライトを「表示」できます。サーバーが特定のアクションを実行するようにゲーム オブジェクトに指示したい場合、スプライトと対話するのではなく、静的なスプライトを画面に描画するだけなので、それを描画するのは困難です。

また、NIO が最良のアイデアであるかどうかもわかりません。私が話したほとんどの人はそれを推奨していますが、非ブロッキング NIO サーバーとマルチスレッドの通常の java.net.* サーバーの実装の実際的な違いはよくわかりません。私の推測では、非ブロック サーバーはマルチスレッド サーバーよりもパフォーマンスが優れており、接続ごとに複数のスレッドを使用するよりも、1 つのスレッドだけを使用した方が問題が少ないと思います。

最後に、TCP を使用するか UDP を使用するかについて、さまざまなアドバイスを受けました。私もUDPを使ったことがありません。TCP を強く推奨するものもあれば、UDP を強く推奨するものもあります。

ご覧のとおり、私はかなりまとまりがなく、何をすべきかわかりません。ネットワーキングと並行性についてはよく読んだ気がしますし、Swing についてはグラフィカルなゲームを作成するのに十分な知識があります。私はそれをすべてまとめる方法を知りません。

4

1 に答える 1

0

おそらく、Nettyの使用を検討してください。迅速なアプリケーション開発に非常に役立ち、ほとんどのサーバーおよびクライアントアプリケーションに十分な速度であることがわかりました。Java NIOを使用したreactorデザインパターンの生の実装を使用すると、より高速になりますが、デバッグが難しい、より多くの作業とコードが必要になります。

于 2012-08-02T23:42:44.240 に答える