2

数え切れないほどのスタック オーバーフロー スレッドや Web 上の記事を読んで、これが何度も議論されてきたことに気づきました。現在、VPS で実行されている TCP 非同期 C# .NET サーバーを使用しています。

これは、プレイヤーをゲームに接続するなどのマルチプレイヤー ロビーでうまく機能するようになりました。私の主な問題は、ゲームの開始時です。だから私の研究では

Interpolation に関するいくつかの非常に役立つスレッドを見つけて、基本的な (Difference (Serverpos - Localpos) * Deltatime (Time between server updates?) * Interpolation Constant) に案内してくれました。これは、フレームレートを滑らかにするという意味では機能しましたが、サーバーの更新時間にはまだ一時的な遅れがありました.

ただし、私の主な問題は、加速度計を使用して各プレーヤーの位置を更新していることですが、サーバーがそのデータを受信して​​加速度計の更新と同じ速さで処理できないため、混乱が始まります。

そのため、今日は単純にデータをサーバーに送信しようとしましたが、最大転送時間は約 350MS であり、誤ってメッセージを結合することはありません。

その後、「推測航法」に出くわしました。これは理論的には機能しますが、理論的には最新のパドル位置を追跡できないためです。相手のパドルにボールが当たるとどうなりますか? パドルを所定の位置に自動的にジャークし、ボールの位置を反転しますか?

基本的に、これを行うためのさまざまな方法を理論化するだけで、大きな輪の中で自分自身を回転させたと思います. UDP も認識していますが、Pong マルチプレイヤーで UDP 接続を実行する必要があるとは想像できません。TCP を使用する方法が必要です。

とにかく、皆さんが私を助けてくれてありがとう。私はこれが初めてで、ネットワーキングのウェブで迷子になったと思います。

4

1 に答える 1

3

これはネットワークの問題ではなく、フィルターの問題です。「カルマンフィルタリング」を読むことをお勧めします。数学は恐ろしいかもしれませんが、あなたがしようとしている基本的な問題は、「システムの物理学に関する知識と、(おそらく) ユーザー入力と以前の状態のノイズと不規則な測定値に基づいて状態を補間する方法」です....これはたまたま古典的なカルマン問題です。

1)サーバーとクライアントが同意する共通の「時間」を確立する必要があります。これを行うためのよく知られたアルゴリズムがいくつかあります。この共通時間ですべての更新にタイムスタンプを付けます。

2) UDP を使用する方法です。パケットが失われる可能性があり、送信された順序で受信されるとは限らないことに注意してください。これは、パケットを使用してクライアントを更新する前に、パケットを検査して「古い」かどうかを判断する方法が必要であることを意味します。また、クライアントが送信されるのと同じ速さでそれらを処理できない場合、クライアントで大きなデルタを取得し始めるという問題もあります....処理に時間を費やすよりも古いパケットを破棄する方がよい.

3) 待ち時間を最小限に抑えます。可能であれば、サーバーをループから完全に切り離し、クライアントが相互に更新をブロードキャストするようにします。

4) ここでフィルター理論の出番です。自由度ごとに、どれだけのエラーを許容できるかを決定します (クライアントが見るものと「真実」との差)。たとえば、飛行機の場合、位置はあまり動的ではありません。おそらく、1 秒または 2 秒の更新で済む可能性があり、クライアントの位置エラーはほとんどありません。ただし、姿勢 (ピッチ、ヨー、ロール) は非常に動的であるため、許容可能な位置誤差を達成するには、これらの状態を 0.25 秒ごとに更新する必要がある場合があります。カルマン理論は、必要なエラーを達成するために必要な更新レートを教えてくれます。元のクライアントで何が起こっているかを知っていることに基づいて、更新レートを変更することもできます....急速な制御入力 => 高い更新レート vs. 制御入力なし => 低い更新レート。

于 2012-12-11T02:54:38.983 に答える