2012-01-02 5 views
4

私はwinsockとC++を使用して2次元のサイドコントローラMMorpgを作成していますが、クライアント側の予測&の修正方法を尋ねたがっていますか? 予測は基本的に、クライアント上のサーバ上で実行している物理コードを実行しているだけなので、特に修正が必要です。 サーバーは約2秒ごとに修正を送信します。私は他のクライアントのために同じことを行うこと それはOKです: は、右1、1ジャンプ、0左のように、このメッセージがゲームのネットワークコード - クライアント側の予測と修正

編集... X & Y位置及びX & Y速度および入力が含まれていますか?したがって、位置と速度のスナップショットを送信する代わりに、変更された入力のみを送信し、ローカルの クライアントは、他のクライアントの移動先を予測します。サーバーは2〜3秒ごとに訂正を送信します。

ありがとうございます!このタイプのゲームで行われているものを一般的に

答えて

7

  1. 予測は、サーバーは、クライアントが(もちろん重力のために、この速度を調整するいくつかの一定の速度で移動している「推測航法」で爆発し、クライアントが現在の位置と速度を更新するまで、サーバー上で発生しているものは何でも)。アクションゲームでは、この速度*時間の動き(すなわち、どの入力が来るかを予測しようとする)よりも進んだ予測を思いつくのは難しい。

  2. あなたが現在いる場所にサーバーを伝えるのは難しいことです。サーバーが自分のポジションと速度を送信するためにプレーヤーに依存する場合、クライアントは障害物を回避するために自分の位置を偽装することができます。理想的には、サーバーはクライアントの入力を受け取り、その結果の動きを直接処理するだけなので、人々が正当なやり方で動き回っていることは確かです。しかし、サーバーへの入力を遅らせることは現実的ではありません。したがって、クライアントが「(x、y)で速度を(s、t)に変更したとき、すなわち、ジャンプキーがポイントx、yで押された)、サーバはこの情報を見て、「このクライアントの予測動作によれば、彼は実際にはわずか0.7秒前にかなり近いところにいたので、その時点で(s、t)に速度を変更してください。最後の0.7秒の予測が不正確なので、実際に(x、y)+(s、t)* 0.7になります。プレーヤーが現在自分がどこにいると思っているのかをプレイヤーに伝え、プレイヤーがサーバーが示す位置にスナップバックするようにすべきです。例えば、クライアントの入力がサーバに到達する前にサーバ上で爆発が発生した場合、クライアントの世界観はもはや正確ではない。同様に、クライアントが現在の位置から遠くの偽の位置または不自然に高い移動速度を送信しようとしている場合も同様です。サーバは、インクルードがダウンピシャリ築くために、いわば持って:)

  3. サーバは、各クライアントに彼または彼女の近くにおける位置と各プレイヤーの速度を送ります。位置と速度は、プレーヤーの動きを完全に予測して推定するのに十分です。言い換えれば、他のプレイヤーはどのキーが押されているかどうか気にしません。サーバーの精度の確認は既に行われています。 NPCの動きとAIはクライアント側で処理できるので、送信する必要はありません。

  4. ネットワークゲームは、ほとんどです。UDPソケットで行われるのは、常にです。 UDPソケットは、パケットが受信者によって確認応答されないため、TCPよりもはるかに低いオーバーヘッドを持ちます。もし彼らが亡くなってしまったら、彼らは善のために去ってしまいますこれにより往復の確認応答は保存されますが、パケットがサーバーに到達したと見なすことはできません。これは、入力イベントを送信するのは難しいことです。パケットが通過中に失われた場合でも、あなたはとすぐにパケットが入って来ないように正しい状態を知っているので、常にかなり状態の変化よりも、現在の状態「スナップショット」を送信することが理想的である。言い換えれば、あなたはいつも言いたいです」私は、何私は現在やっている」のではなく、 『私は』ジャンプを3回押した場所です。

要約すると、クライアントは速度の更新と、変更が発生したときのアバターの位置を送信できます。サーバーは、現在のすべての状態を妥当な値であると判断します。サーバは、(理想的には、単一のパケットに近くのプレーヤーのためのすべてのモーション情報を梱包)他の近くのプレイヤーにこのデータを送信し、クライアントが同じ予測モデルマイナス合理的な運動の検証を適用します。これが長すぎる...

申し訳ありません