リアルタイムストラテジーにおける同期の話
しばらくTHE DAY OF SAGITTARIUS 0.3の開発ブログと化します。
そこで今日は同期について。
移動については各プレイヤーの座標に変化が生じる度にサーバに座標データを投げて、同じ対戦部屋にいるプレイヤー(今は1部屋ですが)にブロードキャストしています。
このため、20fpsでしか動かないプレイヤーの画面では40fpsで動いてるプレイヤーの行動が倍速に見えるわけです。
内部で設定されているプレイヤーの最高速度は一定のため、フレーム落ちしているかのように見えます。
動き続けていると常にサーバにデータを投げる状態になり、帯域にもやさしくないため改善の余地はありありですがもうしばらくこのままでいきます。
攻撃については各プレイヤーが操作を行った瞬間にサーバにデータを投げています。
この時点で攻撃が命中するかどうかは全く判らないので、各プレイヤーの画面で当たり判定処理を行いますが、上に挙げた移動速度のズレによって同じ攻撃でも当たっている画面と当たっていない画面が出てきます。
このままダメージ処理も行ってしまうと同期が取れないので、ダメージ処理に関しては攻撃を食らったプレイヤーが責任を持って行います。
つまり、画面上で自身が攻撃を食らうとダメージ処理を行った上で残艦数をサーバに投げるわけです。
こうすることで少なくとも残艦数のズレはなくなりますが、攻撃が当たっているはずなのに残艦数が減っていないor攻撃が当たっていないのに残艦数が減っている、といった表示上のズレはどうしても残ってしまいます。
完全に同期を取るには全ての操作についてサーバが発行するタイムスタンプを上乗せして、各プレイヤーの画面で辻褄合わせをするなどの処理が必要になりますが、処理が重くなったり通信量が増大したりとトレードオフが生じます。
どこかに妥協点を見出さなくてはならないため、できるだけ演出でごまかすといった工夫が必要になってきますが、リアルタイムストラテジーではなかなか難しいですね。
たとえば攻撃時に必ずチャージを発生させて、そのチャージ時間を調整することで同期ズレを少なくするとかそういった感じです。
色々書きましたが、要はプレイして面白ければいいと思っています。
面白ければ些細なズレは気にならないし、ズレを解消した結果面白くなくなると本末転倒ですからね。


