Star Controlのようなmeleeをサポートするゲームサーバーを実装しています。船を飛ばして射撃し、動きを動かすための超単純な速度/加速/減衰物理学を備えています。
私は、Valve、Gafferon、Gambettaを読み、クライアント予測のためにGambettaのアルゴリズムを実装しました。
クライアント予測は、サーバーからの位置を更新することでプレーヤー船に作用し、サーバーで未処理の入力をプレーヤー船に再適用します。
残念ながら、私のゲームではうまく機能しません。ガンベッタの例では、すでに移動しているオブジェクトや段階的に更新されるコマンドは考慮されていないという事実と関係があると思います。(「ステップ」とは、フレームを意味します)。そのため、私のゲームでは、プレイヤーは(すでに動いている)船を加速するために押し上げます。船はクライアント上で動き続け、コマンドをサーバーに送信し、通常は次のステップでサーバーからワールドスナップショットを受信します。私はもっと何かを得ます:
playerコマンドはクライアントのステップ3で実行されますが、サーバーではサーバーのステップ5でのみ実行されます。クライアントのステップ6でクライアントが世界のスナップショットを受信するまでに、特に高速の場合、予測はかなりずれます。
問題の核心は、クライアントがステップ5でコマンドを実行するのに対し、サーバーはステップ6でコマンドを実行することです。コマンドを使用してクライアントステップを送信し、サーバーをロールバックしてクライアントタイムステップを使用してコマンドを再実行することを検討しました。ただし、ロールバック以降に受信したコマンドがどうなるか、送信されたステップを変更することによってクライアントを不正に利用する方法など、他の多くの問題が発生する可能性があります。
このようなGoogleの動画を読んだり見たりすると、別のアプローチが言及されています。このアプローチでは、プレーヤーの位置をスナップショットの位置に合わせて徐々に変更します。
私の質問:
Gambettaのアルゴリズムを一定のステップ移動で機能させることができますか?それとも概念的に私のゲームと互換性がないのですか?
ステップを徐々に補間するのは正しい方法ですか?もしそうなら、サーバーから受信したばかりのオブジェクトと一致するように、クライアントの位置から既に移動しているオブジェクトをどのように補間しますか?
これらの方法、段階的補間、Gambettaのアルゴリズムは連携して機能しますか、それとも相互に排他的ですか?