2

私はオンラインゲームに取り組んでおり、サーバー側で作業しているときに少し問題が発生しました。

Javaでノンブロッキングソケットを使用する場合、すべてのデータが利用可能になるまで処理できない完全なパケットデータセットを処理するための最善のアクションは何ですか?たとえば、大きな2Dタイルマップをソケット経由で送信します。

私はそれを処理する2つの方法を考えることができます:

  1. 私の例の大きな2Dタイルマップを処理するために必要な完全なデータセットを処理するのに十分な大きさのByteBufferを割り当てます。すべてが受信され、そこから処理されるまで、読み取りデータをバッファーに追加し続けます。

  2. ByteBufferのサイズが小さい場合(おそらく1500)、ファイルから完全に処理できるようになるまで、後続の読み取りを実行してファイルに出力できます。これにより、大きなByteBufferを使用する必要がなくなりますが、ディスクI/Oが原因でパフォーマンスが低下します。

すべてのSocketChannelに専用のByteBufferを使用しているので、処理が完了するまでデータを読み込み続けることができます。問題は、2Dタイルマップのサイズが2MBの場合、1000個の2MB ByteBufferを使用するのが本当に賢明ですか(1000がクライアント接続の制限であり、それらがすべて使用されていると仮定)?私が考えていないより良い方法があるに違いありません。

私は物事をシンプルに保ちたいと思いますが、私はどんな提案にもオープンであり、助けに感謝します。ありがとう!

4

2 に答える 2

1

おそらく、現時点での最善の解決策は、完全な2MB ByteBufferを使用し、必要に応じてOSにディスク(仮想メモリ)へのページングを処理させることです。おそらくすぐに1000人の同時ユーザーがいることはないでしょう。そうすることで、最適化することができます。実際のパフォーマンスの問題が何であるかに驚くかもしれません。

于 2009-06-26T03:59:53.607 に答える
0

私は、大規模なデータセットのサイズを単純に縮小し、マップ全体を更新するのではなく、タイルの更新を送信することが最善の方法であると判断しました。そうすれば、マップ全体ではなく、マップ上で変更されたタイルのリストを簡単に送信できます。これにより、このような大きなバッファーの必要性が減り、軌道に戻りました。ありがとう。

于 2009-06-30T00:26:33.263 に答える