タグ付けされた質問 「synchronization」

プレイヤーやサーバー全体で同様のゲーム状態を維持するプロセス。これにより、すべてのプレイヤーにプレイフィールドの現在の状態に関する同じ情報が提供されます。

4
MMOで負荷分散はどのように達成されますか?
負荷を軽減するために、単一のシャードまたはレルムの処理を複数のサーバーで実行できることがMMOの一般的な要件だと思います。すべてのプレイヤーとすべてのNPCが相互作用できる統一された一貫した世界を維持しながら、これをどのように行うことができるのか興味があります。 私の質問は、MMOでロードバランシングをどのように達成するかです。 このテーマに関する知識を向上させる方法に関するリンク、書籍、または一般情報も歓迎します。

3
MMOのサーバーとの低トラフィッククライアント同期
プレイヤーが矢印キーで宇宙船を操縦して宇宙船で飛行し、他のプレイヤーと協力するMMOを実装しています。 プレイヤーがロケットなどから船をかわすことができるように実装したいので、サーバー使用と同じ世界をシミュレートするアルゴリズムを使用して、クライアント側でゲーム全体の状態を予測しようとしています。そのゲームワールドはC#で記述され、クライアント内で直接呼び出され(Unity3Dで記述されます)、C ++サーバー上のCLRを介して(Linuxの下で)呼び出されます。UDPを介した接続。 問題は、たとえば、単一のマップ内で1000人のプレーヤーを維持する方法です(他のすべてのゲームオブジェクト、Mobを除く)。 サーバーをクライアントと毎秒50回同期する (一定の半径内で)彼が見ることができるゲームオブジェクト(およびプレイヤー)の状態を各クライアントに送信する ビュー半径内の各プレイヤーに100個のオブジェクトを送信する必要があります ゲームオブジェクトごとに平均50バイトを送信する必要があります(id、x、y座標、回転、状態...) そのため、次のようなネットワーク帯域幅が必要になります:1000(クライアント)* 50(1秒あたりの回数)* 100(各プレーヤーに送信するオブジェクト)* 50(オブジェクトあたりのバイト数)= 250 000 000バイト/秒!それは不可能だ! どういうわけかこの値を減らすことは可能ですか?たとえば、クライアントがゲームの世界を(長期間)完全にシミュレートし、他のクライアントの入力だけを送信し、数秒ごとにゲームの世界を同期できるようにします。 。 とにかく、そのようなゲームはどのように一般的な方法でプログラムされていますか?ありがとうございました。

5
リアルタイム戦略ゲームのネットワーキング
私は自分が取っているコンピューターサイエンスコースのリアルタイム戦略ゲームを開発しています。それのより難しい側面の1つは、クライアントとサーバーのネットワーキングと同期であるようです。このトピック(1500人の射手を含む)を読みましたが、他のモデル(たとえばLAN経由)とは対照的に、クライアント/サーバーアプローチを採用することにしました。 このリアルタイム戦略ゲームにはいくつかの問題があります。ありがたいことに、プレーヤーが行うすべてのアクションは決定論的です。ただし、スケジュールされた間隔で発生するイベントがあります。たとえば、ゲームはタイルで構成されており、プレイヤーがタイルを取得すると、そのタイルの値である「エネルギーレベル」は取得後1秒ごとに増加します。これは、私のユースケースを正当化する非常に簡単な説明です。 現在、サーバーにパケットを送信して応答を待つシンクライアントを実行しています。ただし、いくつかの問題があります。 プレイヤー間のゲームがエンドゲームに発展すると、毎秒50を超えるイベントが発生することが多く(前述のスケジュールされたイベントにより、蓄積されます)、同期エラーが発生し始めます。私の最大の問題は、クライアント間の状態のわずかな逸脱でさえ、クライアントが異なる決定を意味する可能性があり、それが完全に別個のゲームに雪だるま式になるということです。もう1つの問題(現時点ではそれほど重要ではありません)は、待ち時間があり、結果を確認するために移動してから数ミリ秒、さらには数秒待つ必要があることです。 これをエンドユーザーにとってより簡単に、より速く、より楽しくするためにどのような戦略とアルゴリズムを使用できるのだろうかと考えています。これは、1秒あたりのイベント数が多く、ゲームごとに複数のプレイヤーがいることを考えると、特に興味深いものです。 TL; DRが1秒あたり50イベントを超えるRTSを作成している場合、クライアントを同期するにはどうすればよいですか?

5
ゲームロジックスレッドとレンダリングスレッド間の同期
ゲームロジックとレンダリングをどのように分離しますか?ここで正確にそれを尋ねる質問が既にあるように思えますが、答えは私にとって満足のいくものではありません。 私がこれまでに理解していることから、それらを異なるスレッドに分ける点は、ブロックされているスワップバッファ呼び出しからレンダリングが最終的に返される次のvsyncを待つのではなく、ゲームロジックが次のティックですぐに実行を開始できるようにすることです。 しかし、具体的には、ゲームロジックスレッドとレンダリングスレッド間の競合状態を防ぐためにどのデータ構造が使用されているか。おそらく、レンダリングスレッドは、描画対象を特定するためにさまざまな変数にアクセスする必要がありますが、ゲームロジックがこれらの同じ変数を更新している可能性があります。 この問題を処理するための事実上の標準技術はありますか。ゲームロジックを実行するたびにレンダリングスレッドが必要とするデータをコピーするようなものです。解決策が何であれ、同期のオーバーヘッドや、すべてを単一スレッドで実行するよりも少ないものは何ですか?

2
Quake 3のような精密なネットワークゲームでサーバーとクライアントのクロックを同期させる方法は?
私は2Dトップダウンシューターに取り組んでおり、Quake 3のようなネットワークゲームで使用されるコンセプトをコピーするために最善を尽くしています。 信頼できるサーバーがあります。 サーバーはクライアントにスナップショットを送信します。 スナップショットには、タイムスタンプとエンティティの位置が含まれます。 スナップショット位置間でエンティティが補間されるため、動きがスムーズに見えます。 必要に応じて、エンティティの補間は「過去に」わずかに行われるため、複数のスナップショットを補間します。 私が直面している問題は「クロック同期」です。 わかりやすくするために、サーバーとの間でパケットを転送する際のレイテンシーがゼロであると少しの間ふりをしましょう。 サーバーのクロックがクライアントのクロックより60秒進んでいる場合、スナップショットのタイムスタンプはクライアントのローカルのタイムスタンプより60000ミリ秒進んでいます。 したがって、クライアントのクロックが追いつくのに時間がかかるため、エンティティスナップショットが収集され、クライアントが特定のエンティティが移動するのをクライアントが見るまで約60秒間待機します。 スナップショットを受信するたびにサーバーとクライアントのクロックの差を計算することで、この問題を克服することができました。 // For simplicity, don't worry about latency for now... client_server_clock_delta = snapshot.server_timestamp - client_timestamp; エンティティが補間にどの程度沿っているかを判断するとき、単にクライアントの現在の時間に差を追加します。ただし、これに関する問題は、スナップショットが他のクロックよりも速く/遅く到着するために2つのクロックの差が突然変動するため、ジャーキネスが発生することです。 知覚可能な遅延が補間のためにハードコードされている遅延と、通常のネットワーク遅延によって引き起こされる遅延のみであるように、クロックをどのように密接に同期できますか? 言い換えると、ジャーキネスを導入せずに、クロックが大幅に非同期化されたときに、補間の開始が遅すぎる、または早すぎるのを防ぐにはどうすればよいですか? 編集:Wikipediaによると、NTPを使用して、インターネット上のクロックを数ミリ秒以内に同期できます。ただし、プロトコルは複雑に思えますが、おそらくゲームで使用するには過剰ですか?

2
物理学によるマルチプレイヤーネットワーキング
私は、物理学を使用したマルチプレイヤーネットワーキングがレーシングゲームでどのように実装されているのか興味があります。私たちは、異なる人々によって制御される複数の高速移動車両で物理的な世界を持っています。車両には武器があり、互いに射撃できるとしましょう(ツイストメタル、Vigilante v8) ヒットとコリジョンが心配です。権限のあるサーバーまたはより良い代替手段?

2
マルチプレイヤーでのジャンプなどのアクションを同期する方法は?
私は初心者のゲーム開発者で、マルチプレイヤーゲームについて研究しています。私は常にある程度の待ち時間があることを観察しました、プレイヤーは常に過去のアクションから更新を取得します。しかし、レイテンシを処理する推測航法のようなテクニックがあります。動きを予測してスムーズに動きます。しかし、ジャンプ、歩行停止などのアクションを同期させるにはどうすればよいでしょうか。 クライアントAが動いていて、100m /秒の速度で10.2時間に100mにいて、この情報を送信したとします。クライアントBはこの情報を少し後で受け取り、10.4にします。クライアントBでは、予測を使用して、クライアントAを120mに配置できます。しかし、クライアントが10.3で110mでジャンプしたとしたらどうでしょう。それを予測することはできません。予測を使用しているため、クライアントAの過去のジャンプを示すことはできません。 ジャンプアクションをまったく送信しないことで、この問題に対処できます。しかし、私のゲームにプレーヤーが転んで死ぬ可能性があるいくつかの空白がある場合はどうでしょうか。したがって、ジャンプアクションを同期しない場合、他のプレーヤーは1人のプレーヤーが走っていることを観察し、その後彼は無効になり、画面に表示されて視覚的なエンゲージメントを破壊します。 ジャンプは単なる例であり、予測が機能しない多くのシナリオがあるかもしれません。だから、どうやってそれらに対処するのですか?そのような例の1つは、Awesomenautsのようなマルチプレイヤーオンラインバトルアリーナゲームです。

1
ネットワーククライアントサーバーメッセージ交換とクロック同期ヘルプ
テーブルホッケーである高速の物理ゲームをやっています。マレット2つとパック1つ。ゲームはiphone / ipadで実行され、GameCenterを介してマルチプレイヤーの部分を実行しています。 これがネットワークシステムの動作方法です。マッチにスターを付けるクライアントはサーバーとして解決され、マッチリクエストを受け入れるのはクライアントです。 「サーバー」は物理演算を実行しており、応答は即時であり、クライアントも物理演算を実行しているため、メッセージ交換間でスムーズに見えます。私がサーバーとしてしていることは、パック速度と位置をクライアントに送信し、クライアントがサーバーに関連するパック速度/位置を調整してサーバーを同期させることです。そうしないと、物理が非同期になり、ねじ込みます。 ネットワークレイテンシが良好な場合、100ミリ秒以下の結果はかなり良好です。クライアント側でスムーズにプレイできるゲームが得られ、奇妙な動作は最小限です。ラグが約150〜200ミリ秒のときに問題が発生します。その場合、私のクライアントパックはすでにエッジと逆方向にヒットしていますが、サーバーから遅延メッセージを受信し、少し後ろに戻ってボールの動作に奇妙な感覚を引き起こしています。 私はそれについていくつか読んだ: Pongネットワークの例 同期の例をクリックします クロック同期に関するウィキペディア だから、どうすればこれを解決できますか?私が持っている最良のオプションを読んだ限り、タイムスタンプを使用してサーバー/クライアントでクロック同期を行い、クロックに関連する遅延メッセージが表示された場合は無視して、クライアントのシミュレーションでジョブ。皆さんはそれに同意しますか?また、データを信頼できない(UDP)で送信しているため、メッセージが遅れたり、メッセージが乱れたりすることがあります。 それが最善のアプローチである場合、クロック同期をどのように実装しますか?手順を読みましたが、よくわかりませんでした。 それは言う: クライアントは現在の現地時間を「時間要求」パケットにスタンプし、サーバーに送信します。 サーバーが受信すると、サーバーはサーバー時間にスタンプを付けて戻ります クライアントが受信すると、クライアントは送信時間から現在の時間を減算し、2で除算してレイテンシを計算します。サーバー時間から現在の時間を差し引いてクライアント/サーバー時間のデルタを決定し、待ち時間の半分を追加して正しいクロックデルタを取得します。(これまでのところ、このアルゴリズムはSNTPに非常に似ています) クライアントは、手順1〜3を5回以上繰り返し、そのたびに数秒停止します。他のトラフィックは暫定的に許可される可能性がありますが、最良の結果を得るために最小化する必要がありますパケット受信の結果は累積され、最小遅延から最大遅延の順にソートされます。待機時間の中央値は、この順序付きリストから中間点サンプルを選択することによって決定されます。 中央値からの標準偏差が約1を超えるすべてのサンプルは破棄され、残りのサンプルは算術平均を使用して平均化されます。 この例に従って、私はこれを持っています: ゲームがロードされ、クライアントの時間が0になったふりをして、時間を0としてサーバーに送信します。 メッセージがサーバーに到達するまでに150ミリ秒かかりますが、サーバーのクロックは既に開始されており、クライアントより1秒進んでいます。サーバーがメッセージを受け取ると、時間は1.15になり、その時間をクライアントに送信します。ラグが150ミリ秒で一定であるとしましょう。 これで、クライアントは1.15の時間を受け取り、送信された時間から現在の時間を差し引き、レイテンシを計算するために2で割ります。Wichは、0.3-0 = 0.3 / 2-> 150msです。 サーバー時間から現在の時間を差し引いてクライアントサーバー時間のデルタを決定し、半分の待ち時間を追加して正しいクロックデルタを取得します。 クライアント時間:0.3サーバー時間1.15 0.3-1.15 = .85 +待ち時間(.15)= 1 それはどのように同期されますか?何が欠けていますか? マルチプレイヤーとネットワークの経験が初めてなので、少し混乱しています。 ありがとうございました。

3
完全な状態の更新よりも効率的にマルチプレイヤーゲームの状態を同期するにはどうすればよいですか?
私は以前に少しゲームネットワークコーディングを行いましたが、主にリアルタイムニーズのないゲームのTCPを使用しました。ネットワーク化されたマルチプレイヤーで2D Javaゲームに取り組んでいます。学習のために、私はこれを既存のネットワークAPIなしで自分で行いたいと思っています。 サーバーからクライアントに送信されるゲームの状態を効率的に表すにはどうすればよいですか?最も明白ですが、おそらく最も効率の悪い方法があります。これは、各プレーヤーの場所、アニメーションの状態などを使用してゲーム状態コンテキストオブジェクトを作成し、更新ごとにそれを各プレーヤーに送信することです。それを実装することはそれほど難しくはないように見えますが、おそらくリアルタイムの相互作用に近いものを達成するには大きすぎるでしょう(もちろん、これに関する私の経験は限られているため、私は正しくない可能性があります)。 状態の変化のみを送信するために以前に使用した確かな方法はありますか?パフォーマンスに十分な格差があっても、追加の作業に値するでしょうか?

3
クライアントをサーバーと相互に同期する
すべてのクライアントをサーバーと相互に同期させる最良の方法は何ですか? 現在、2つのアプローチが考えられています。 クライアントがサーバーに何かを送信すると、サーバーはすぐにすべてのクライアントにメッセージを送信します。 いくつかの時間遅延の導入により、サーバーはすべてのクライアントにメッセージを送信しますt。 2番目のアプローチは、クライアントをよりよく同期させる可能性が高いようです(ある程度の遅延に対応しているため)。しかし、応答性が大幅に低下するかどうか(つまり、ユーザーが「ジャンプ」をクリックし、ボタンを押すことと実際にジャンプすることの間に顕著なギャップがある)かどうかと思います。 クライアントに自分の位置を計算させる可能性もあります(サーバーが「ジャンプした」と言うのを待たないでください)。しかし、避けられない遅延のために、クライアントは非常に非同期になります。 次に、TCPとUDPの全体の問題があります。私たちはそれを速くしたいのですが、あなたが思っていたのとは完全に異なる場所にいるとサーバーが言うのも嫌です。 これらのすべての競合する要求により、この問題への取り組み方は非常に不確実になります。これらのアプローチ(またはその他のアプローチ)のうち、クライアントとサーバーをすべて同期させるのに最適なのはどれですか。業界で実際に使用されているのはどれですか?

3
2人のレーシングプレーヤーの同期を保つにはどうすればよいですか?
私は、テンプルランのマルチプレイヤーバージョンのように、Unityモバイルゲームに取り組んでいます。モバイルプラットフォームが原因で、ネットワークのレイテンシが変動している(通常は200〜500ミリ秒)ように見えます。 2人のプレイヤーキャラクターは同じパスに沿って走っているように示され、障害物を通過するために単純なアクション(ジャンプ、スライド、パワーアップなど)を実行する必要があります。 メッセージが遅れると、ゲームはリモートプレイヤーが障害物を通過したと見なします。これは通常はうまく機能しますが、プレイヤーが障害物によって殺された場合、リモートプレイヤーがローカルプレイヤーと同じ障害物/位置で死んでいるように見せたいです。レイテンシが原因で、リモートプレーヤーは、死を告げるメッセージが届く前に障害物を越えたように見えます。 プレーヤーの同期を維持するにはどうすればよいですか? 死のメッセージが届いたらすぐにリモートプレーヤーをローカルプレーヤーの死の位置に戻してみました。視覚的に不自然に見え、他の同期の問題が発生する可能性があります。

3
マルチプレイヤータイルベースの動きの同期
私はインターネット上で複数のプレイヤーの動きを同期させなければなりません、そしてそれを行うための最も安全な方法を見つけようとしています。 ゲームはタイルベースで、4方向にしか移動できません。移動するたびにスプライトが32ピクセル移動します(もちろん時間とともに)。さて、この移動アクションをサーバーに送信し、すべてのプレーヤーにブロードキャストする場合、ウォークキーを押し続けている間、ウォーキングを続けるには、次のコマンドを実行してサーバーに送信する必要があります。そして、すべてのクライアントにとって、時間内に、または動きはもはやスムーズではなくなります。私はこれを他のゲームで見ました、そしてそれはラグがなくてもかなり醜くなります。だから私はこれが実行可能なオプションでさえあるのだろうかと思っています。これはシングルプレイヤーにとって非常に優れた方法のようですが、簡単で簡単です(次の移動アクションを時間内に実行してリストに追加するだけです)。マウスの移動を簡単に追加できます(タイルをクリックする)。キューへのパスを追加するために、それは歩きました。 私の頭に浮かんだもう1つのことは、誰かがどこかの方向に動き始めたという情報を送り、もう一度彼が停止または方向を変えたときに、位置とともにスプライトが正しい位置に表示されるようにするか、位置が間違っている場合は、位置を修正できます。これは(うまくいけば)誰かが本当に遅れている場合にのみ問題を引き起こすはずです。その場合、それは予期されることです。これがうまくいくためには、何らかの方向のキューが必要です。ここで、着信方向の変更やものが保存され、スプライトが次のタイルへの現在の移動が完了した後、どこに行くべきかがわかります。これは実際には機能するかもしれませんが、ちょっと複雑すぎるようです。これを行う唯一の方法かもしれませんが、吃音のリスクはありません。停止または方向変更がクライアント側で受信された場合 sはキューに保存され、charは停止または方向を変更する前に、指定された座標に移動し続けます。もちろん、新しいコマンドが遅すぎると、どもりも発生します... 私は方法を決めるのに苦労しており、まだこれに関する例を見つけることができませんでした。私の主な問題はタイルの動きをスムーズに保つことです。そのため、ピクセルベースの動きの同期に関する他のトピックがあまり役に立たないのはこのためです。 これを行う「標準的な」方法は何ですか?

5
マルチプレイヤーの同期とパスファインディング
クライアントでポイント&クリックタイプのインターフェイスを使用しており、サーバーでA *を実行してパスを検索しています。 ゲームはRTSのように制御されますが、世界は永続的であるため、プレーヤーはいつでも参加/離脱できるはずであり、画面には最大で30ユニットしかありません。 パスを計算した後、サーバーとクライアントの間でプレーヤーの動きを同期させる最良の方法は何ですか? サーバーはすべてのアニメーションステップ/フレームでクライアントを同期する必要がありますか?または、パス上の各ノードと移動している各プレーヤーについて、「位置X、Yに移動する」ことをクライアントに伝えるだけですか?または、クライアントとサーバーの両方でアニメーションタイマーを実行し、暗黙的に同期させるのが最善ですか? パスベースの移動の典型的なデータ交換はどのようなものですか? 編集: 「RTS」と言ったのでロックステップを提案している人もいますが、ゲームはRTSではなく、インターフェイスの種類が同じです。大きな違いは、いつでもプレーヤーをゲームに参加させたり、ゲームから離脱させたりできるようにする必要があることです。より具体的でなくてすみません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.