Android を学習するためのリアルタイム ゲームを開発しています。ゲームの開始時に Tomcat と Webservices を使用してデータを交換しています。ソケットを使用しています。どちらの Android デバイスも、ソケットを介して Java プロセス (私のサーバーである可能性があります) と情報を交換できます。情報を送信する必要がある場合もあれば、サーバーから情報を取得する場合もあります。
WiFiと3Gを使用して確認しました。驚いたのは、3G の遅さです。そのため、プログラミングが正しくできているかどうかはわかりません。確かに私は怠け者で、クラスを再利用してより小さなデータを送信しました。それは大きな違いでしょうか?約 10 個の文字列と 5 個の整数があります。それは… 5?本当に、オブジェクトが重すぎるとは思いません。もう1つのことは、このオブジェクトがSerializableを実装していることです。私が実装できる別のインターフェースがあることを読みました.Androidで作業している場合はより良いですが、私はJavaでも作業しているので、それがAndroid で作業しているときだけです。と呼ばれていると思いますParcelable
。
私はリアルタイムに近いことをしようとしています。ボタンをクリックしてからサーバーがデータを返すまで、約 4 ~ 6 秒待っています。
ボタンを押すと、ソケットを使用してデータがサーバーに送信されます。サーバーは情報を (非常に高速に) 処理し、更新されたデータをこのユーザーと対戦相手に送信します。Android 側では、2 つAsynTask
の を作成しました。1 つは常にサーバーからの新しいデータをリッスンしており、もう 1 つはユーザーが何かを行ったときにデータをサーバーに送信します。
最後の問題は、異なるデバイスの更新の時間差です。つまり、これらのデバイスの 1 つで、新しいデータが 2 秒早く到着します。これを同期することは可能ですか?ネットワークの質が違うからだと思いますので、大変かもしれません。しかし、どうすればこの側面を改善できますか?
更新しました:
さて、コードを少しいじってみますが、 コードが多すぎます!!
わかりました、、私の最初の間違いだと思うのは、クラスをオフラインモードとオンラインモードに再利用しようとしたため、送信しているクラスが大きすぎるということです.
クラスは次のようになります。
/**
*
*/
private static final long serialVersionUID = -2849406755758020431L;
private List<Word> listWords;
private long numberWords;
private int score1;
private int score2;
//OffLine
private int lifes;
private int numWordsNextLevel;
private int speedTime;
private int level;
private int difficult;
//Online
private String message;
private int numPlayers;
private int numWordsGame;
private String namePlayer1;
private String namePlayer2;
//Flags players
private boolean player1failed;
private boolean player2failed;
これを 4 つの int と 2 つの String と 2 つの boolean に減らすことができると思います。それは違いでしょうか?その価値はありますか?
これは私が両側に送っているクラスです。本当に、両側で同じデータを送信する必要はありません。したがって、サーバーに送信する必要があるデータは非常に小さいです。
UDP や TCP について、パケットが失われるとどうなりますか?? 人々はそれを改善するために通常何をしますか? UDP は TCP よりどれくらい速いですか? ACK を送信する必要がないことはわかっていますが、プロトコルのこの部分にどれくらいの時間がかかるかはわかりません。
送信しているデータの量をDDMSで確認していますが、毎回1~1.5Kbyte程度ですが、多すぎるとは思いませんので、専用のクラスを作成してデータをやり取りするつもりなのですが、 、それについてさらにアドバイスしますか?