socket.ioを使用して最初のオンラインゲームを作成していますが、agar.ioやdiep.ioのようなリアルタイムのマルチプレイヤーゲームになりたいです。
しかし、すべてのコンピューターを同じ速度で動作させる方法を見つけようとする問題に遭遇しました。
モデルには3つのアイデアがありますが、どれも正しいとは思えません。通常のビデオゲームではどのようにそれが行われるのでしょうか。(私のアイデアを読むことをスキップできます;私が抱えている問題を見る方法を与えてくれます。)
サーバーは、クライアントが自分で実行できるようにし、サーバーに更新を渡し、サーバーから残りのクライアントに更新をブロードキャストします。これには、一部のコンピューターが他のコンピューターよりも速く動作し、更新が速くなり、画面上をより速く移動できるという問題があります。
更新するタイミングをサーバーにクライアントに伝えます。次に、最後のクライアントが応答するまで待機し(ある人が遅いコンピューターを使用している場合のひどい考え)、最初のクライアントが応答するまで待機し(再び、各フレームの前に通信を待機します)、またはできるだけ早く送信します(これは、 1)と同じ問題に遭遇するようです。
ゲームの開始時に、サーバーにクライアントに更新の速さを伝えてもらいます。これは、クライアントがその期間の間の移動を制限する責任があることを意味します。たとえば、その期間内に誰かがなんとかボタンを2回押すことができた場合、ボタンを押すイベントは1つしか送信されません。これには、一部のアクション(ダブルボタンを押すなど)が無視され、サーバーのクロックと一致しない可能性のあるクライアントのクロックに相互作用が依存するという問題があります。サーバーは、各クライアントを追跡し、更新が正しい時間に送信されていることを確認する必要があります。
私はいくつかの調査を行いましたが、私が読んだ記事は、クライアントが他のクライアントよりも速く更新を送信した場合の対処方法を具体的に扱っていないようです。
私の特定のケースでは、キーボードの速度が速い人を扱っています(彼らのコンピューターは他のコンピューターよりも多くのキーボード更新を送信します)。
プログラマは通常、これにどのように対処しますか?