5

ゲームを作成するために、受信、送信(サーバー上でacceptを使用)のスレッドで通常のDataInputStreamとDataOutputStreamを使用していますが、実際には低速です。>5秒の遅れ。

これが私がそれを作った方法です(それのほとんどはそのように見えます):

(dosはDataOutputStreamです)

dos = new DataOutputStream(socket.getOutputStream());
dos.writeFloat(dp.x);
dos = new DataOutputStream(socket.getOutputStream());
dos.writeFloat(dp.y);
dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(dp.username);

そして入力(これはサーバーにあります)には以下を使用します:

(disはDataInputStreamであり、forループ内にあるため、各プレーヤー用です)

dis = new DataInputStream(list_sockets.get(i).getInputStream());
x = dis.readFloat();
dis = new DataInputStream(list_sockets.get(i).getInputStream());
y = dis.readFloat();
dis = new DataInputStream(list_sockets.get(i).getInputStream());
username = dis.readUTF();

とても遅いですが、理由はわかりません:(助けてください?

編集:すべての操作(送信、受け入れ、受信)には独自のデーモンスレッドがあります。

4

3 に答える 3

7

インスタンスを繰り返し作成するDataOutputStreamと、パフォーマンスが低下します。DataInputStream

ただし、より重要なパフォーマンスの問題は、Java側のバッファリングなしで読み取りと書き込みを行っていることだと思います。これは、各読み取り/書き込み呼び出しが、データを読み取るために1つ(場合によっては多数)のシステムコールを実行していることを意味します。システムコールは、通常のJavaメソッド呼び出しよりも数桁遅くなります。

ソケット入力ストリームをでラップしBufferedInputStream、出力ストリームをでBufferedOutputStreamラップしてから、これらをデータストリームでラップする必要があります。(これを行うときは、各メッセージまたは一連のメッセージの最後にflushいることがより重要になることに注意してください。DataOutputStream


いくつかの情報を書き込んでから、書き込むたびにフラッシュしますか?

上で述べたように、各メッセージまたはメッセージの各シーケンスの最後でフラッシュします。バッファリングされるデータがバッファにあると仮定すると、バッファリングされた出力ストリームでフラッシュするたびにシステムコールが発生します。書き込みのたびにフラッシュすると、(おそらく)不要なシステムコールが実行されます。

プロトコルのメッセージ境界がどこにあるべきかを理解するのはあなた次第です。それはあなたが送受信しているデータの詳細とそれが処理される方法に完全に依存します。

于 2012-05-05T12:57:01.837 に答える
2

あなたが言うように、 for ループがあり、ループ内の反復ごとに新しいデータ入出力ストリームを作成します。これにより、膨大なオーバーヘッドが発生します。

クライアントごとに (別のスレッドで) 1 つのデータ入力ストリームと出力ストリームを用意し、入力ストリームが空になるまで入力を構築するストリームをループしてユーザー入力を取得する必要があります。

于 2012-05-05T11:38:37.680 に答える
1

「遅い」とはネットワークの遅延のみを意味する場合、ストリームを「フラッシュ」して、満杯でないバッファーの転送を強制する必要があります。

添加:

それでも、このように「作業草案」が作成されます。適切に設計された通信プロトコルには、プレーンコマンドの周りにあらゆる種類のベルとホイッスルが含まれていることを考慮してください..質問は次のように発生します

  • 例外処理
  • シーケンシング
  • 認証
  • 完全性チェック (チート、リプレイなどを避ける)
  • 拡張性 (新しいコマンド、明示的なコマンド オブジェクトを使用)
  • リアルタイム処理
  • そして確かに他の多くの人...

その負担を軽減するためのフレームワークがいくつかあります。

于 2012-05-05T11:35:59.520 に答える