1

シンプルな 2D ゲームの目的で、クライアント プログラムが常に座標をサーバーに送信する必要があります。

そこで、サーバーから値を送信および取得することで、両方のプレイヤーの速度を同じにすることができるかどうかを確認するテストを作成しました。

package main;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class DataSender implements Runnable{

    private DataInputStream fromServer;
    private DataOutputStream toServer; 

    Player player;
    Player opponent;

    public DataSender(DataInputStream fromServer, DataOutputStream toServer, Player player, Player opponent){

        this.fromServer = fromServer;
        this.toServer = toServer; 

        this.player = player;
        this.opponent = opponent;   
    }

    @Override
    public void run() {

        while(true){

                try {
                    toServer.writeInt(player.velX);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    opponent.velX = fromServer.readInt();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }   
    }
}

ループは、while(true)スレッドの作成時に 1 回だけ実行されます。一定のデータ ストリームを確立するにはどうすればよいですか?

4

2 に答える 2

0

あなたのreadInt機能はおそらくブロックされています。サーバーが対戦相手の位置をクライアントに応答しない場合、ループはサーバーから 4 バイトを受信するまで停止します。

または、それはwriteInt電話かもしれません。Nagle のアルゴリズムを必ず無効にしてください。このような少量のデータが送信されると、過度の遅延が発生します。Java では、TCP_NODELAYと呼ばれます。これは、コードに問題がある可能性もあります。送信を引き起こすのに十分なデータが書き込まれていないため、書き込み中のバイトが送信されていません。

ここでの提案を完全に受け入れる場合は、代わりに UDP を使用してください。UDP は通常、ゲーム プログラミングで使用されます。これは、関係するデータがリアルタイムであり、短期間しか役に立たないためです。TCP は、パケットを確認したり、古すぎるために不要になったパケットの受信を待機したりする可能性があるため、これを遅くします。UDP を使用すると、それを制御できます。

また、通常、ネットワーク コードには送信用のスレッドと受信用のスレッドがあります。この種の問題が発生しないように、2 つのスレッドを作成することをお勧めします。

于 2013-08-12T03:19:52.207 に答える
0

このような状況では、データの書き込みに別のスレッドを使用することをお勧めします。たとえば、ユーザー入力によって速度が変化した場合、速度/位置パケットを送信します。このようなスレッドを使用して、対戦相手の速度/位置を常に読み取り (およびブロック) します。

于 2013-08-12T03:23:23.507 に答える