格闘アクションゲームのリアルタイム通信1

皆様こんにちは。
プログラマの島鼻と申します。

今回は通信処理について基本的な部分を解説してみたいと思います。
社内で行った勉強会を幾つかの回数に分けてお送りします。

格闘アクションゲームの場合、FPSやMMORPGとは違い、毎フレーム確実な同期処理が必要になります。1フレーム毎にボタンの操作情報を送り合い、同期が取れたらそのフレームを表示します。
画像と交えて簡単に解説して行きます。

もくじ
  • どうやって同期するのか?
  • 再現(リプレイ)する。
  • コンピュータにおける不確定要素
  • 不確定要素「変数」に挑む
  • まとめ


どうやって同期するのか?

相手の端末と自分の端末は非同期です。

そうです。基本的には毎フレーム自分の操作情報を相手に教えてあげれば良いのです。
次から簡単に図で通信の様子を確認しましょう。




どうやら操作情報を送り合えたようです。
しかし、相手にデータが届くまで時間は掛かるのでワンテンポズレてしまいますね。
もう少し詳しく見て行きましょう。

操作情報はフレーム単位で管理されます。よく聞く単語の「FPS」と呼ばれる物です。
1秒間を幾つかに分割した単位をフレームと呼び、ゲームはこのフレーム単位で動きます。
入力情報も1フレームずつ取得され、ゲームに反映されます。
この通信では1フレームずつの操作情報を毎フレーム送っています。

次々解説して行きます。まずは「ラグ」についてです。

 これは情報を送信してから相手に到着するまでの時間と思って良いです。
次に「同期フレーム」です。

こちらは自分の操作情報と相手の捜査情報が揃ったフレームです。
この揃った状態でないと、ゲームを1フレーム処理出来ないです。
格闘ゲームの場合、相手と自分の操作情報の状態を厳密に合わせないと同じ試合を再現できない為です。
この同期フレームを以てゲームは進行して行きます。
次に「現在フレーム」です。


これは実際の入力を受け付けているフレームです。
何か不思議な感じがしますが、ボタンを押してから少し経ってからゲームに反映されます。なので常にゲーム画面は「ラグ分」だけ遅れて動作します。
後追いで次々送信するので「ラグ以上に遅れる事」は基本的には無いです。
このラグがミソですね。このラグが無いと常にカクカクしながらゲームが進行する事になります。どうしても通信している間は待たされるという事です。


通信は色々障害が起きるのでこの基本的な事以外に様々な工夫がなされていますが、
今回はこの辺に致しましょう。


採用情報

クラウドクリエイティブスタジオではプログラマを募集しております。
一緒に面白いゲームを作っていきましょう!

コメント