« 勉強中です | メイン | リープアタックの秘密 »

試行錯誤してみる

「無敵格闘娘」でぐぐって見に来てる人が急に増えたなと思ったら、某なりた氏が雑記でコメントしてたからだったんですね。
「今後に期待」と書かれていて、ちょっと嬉しいです。

さて、ネット対戦の実装について、試行錯誤してみたいと思います。
前提条件としてはこんな感じでしょう。
・Winsockを使う
・UDPを使う
・やり取りする情報は基本的にキー入力のみ
・パケロスは認めない

UDPを使うということはパケットの送受信に信頼性が無く、再送処理なども自前でやる必要があります。
基本的な通信の流れは次のようになると思います

1.クライアント(2p側)がキー情報をサーバ(1p側)に送信
2.サーバがキー情報を受け取って1p側のキー情報をクライアントに送信
3.ゲームループを処理して1.に戻る

パケットロスが無ければこれだけでいいんですが、そうはいきません。

対処法その1
受信側は.データを受け取ったら受領シグナルを返す。
送信側に一定時間経っても受領シグナルが来なければ再送する。

対処法その2
受信側に一定時間経ってもキー情報が送られてこなかったら再送シグナルを送る

こういった処理が必要になるはずです。

また、送受信を行なうロジックはスレッドを立ててそっちでやる必要があります。
送受信の待ち時間が発生する以上、メインのスレッドで待つわけにはいきませんからね。


対処法1は受領シグナルが来なかった場合、受領シグナルがロストした可能性もあるのであまり良い方法ではないかもしれません。
対処法2で実装するべきか・・・?でも再送シグナルの到着が遅延したときに困るなぁ。
受領、再送シグナルの両方を使うといいのかな。

うーん、いきなり詰まったな・・・。

コメント

転送するデータの中に通信を行うたびに増加するカウンタ値(シリアル番号値)を入れておくと良いですよ。
パケロスの検知に役に立ちます。

動画配信のソフトを作る仕事をやったことがありましたが、基本的にデータは一方から流しっぱなしでパケロスを検知した時に受信側から送信側へパケロスしたデータを再送するようメッセージを流していました。

あと、パケットの到着順が入れ替わることは簡単に発生します。特にギガビットルーター使ってたりすると。順番にデータを流しているから受け取った順に処理すればよいと安易に考えない方が良いです。

何かのヒントになれば幸いです。

シリアル番号も送受信するというのは私も考えてました。

今考えている方式だと、パケットが一往復しないと次の送信を行なわないので
必要ないのかなぁとも思いましたけど。


あと、とりあえずTCPで作ってみて
スピードに問題があったらUDPで作るというのも有りかもしれないですね。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)