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

情報交換の目的でケーブルバインドまたはワイヤレス通信リンクを介して接続された2台以上のコンピューター。

7
テスト目的で、悪いインターネット接続をシミュレートするにはどうすればよいですか?
オンラインマルチプレイヤーゲームを開発しています。ローカルエリアネットワークでテストするとうまく機能しますが、リリースする前に、サーバーへの接続があまり良くない人のためにユーザーエクスペリエンスがどのように機能するかをテストしたいと思います。ローカル環境で、高遅延、低帯域幅、ジッター、および時折パケット損失が発生する悪いインターネット接続をどのようにシミュレートできますか?

6
ネットワークゲームの書き方 [閉まっている]
基づいて、なぜそれがMMOを開発するのは難しいのですか?: ネットワーク化されたゲーム開発は簡単ではありません。遅延だけでなく、チート防止、状態管理、および負荷分散においても克服すべき大きな障害があります。ネットワークゲームを作成した経験がない場合、これは難しい学習課題になります。 ソケット、サーバー、クライアント、プロトコル、接続などに関する理論を知っています。 今、私はどのようにネットワークゲームを書くことを学ぶことができるのだろうか: 負荷の問題のバランスをとる方法は? ゲームの状態を管理する方法は? 物事を同期させる方法は? 通信とクライアントをリバースエンジニアリングから保護する方法 遅延の問題を回避する方法は? ローカルで計算する必要があるものとサーバー上のもの ... これに関する良い本、チュートリアル、サイト、興味深い記事、またはその他の質問はありますか? 幅広い答えを探していますが、違いを学ぶには特定の答えでも構いません。

10
データ量の多いリアルタイムゲームの場合、UDPはTCPよりも優れていますか?
UDPは、通常、データ使用量の多いリアルタイムマルチプレイヤーゲームに推奨されることを知っています。 ほとんどの記事は数年前に作成されたものであり、インターネット上で送信されるすべてのデータの〜80%がTCPであるため、TCPに対して多くの最適化が行われたに違いありません。 これは私に不思議にさせます:UDPはまだ速度と待ち時間の点で優れていますか?最近のTCP最適化により、TCPはUDPよりもパフォーマンスが向上しましたか?
71 c++  networking  udp  realtime 

9
TCPプロトコルは、リアルタイムのマルチプレイヤーゲームに十分ですか?
かつて、ダイアルアップ/ ISDN /低速ブロードバンドを介したTCP接続では、パケットが1つドロップされただけで再同期が行われたため、ゲームが途切れ途切れになりました。つまり、多くのゲーム開発者は、UDPの上に独自の信頼性レイヤーを実装する必要がありました。または、ドロップまたは順序が狂う可能性のあるメッセージにUDPを使用し、信頼性が必要な情報にパラレルTCP接続を使用しました。 平均的なユーザーのネットワーク接続が高速になったとすると、FPSなどのリアルタイムゲームはTCP接続で優れたパフォーマンスを発揮できますか?
57 networking 

9
浮動小数点の非決定論に直面して決定論的ゲームはどのように可能ですか?
ネットワーク化されたRTSのようなゲームを作成するために、ここでゲームを完全に決定論的にすることを提案する多くの回答を見ました。次に、ユーザーのアクションを相互に転送するだけで、次のフレームがレンダリングされる前にすべてのユーザーの入力を「ロック」するために、表示されているものを少し遅らせるだけで済みます。その場合、ユニットの位置、ヘルスなどのようなものは、ネットワーク上で常に更新される必要はありません。すべてのプレイヤーのシミュレーションはまったく同じだからです。また、リプレイを行うために提案された同じことを聞いたことがあります。 ただし、浮動小数点の計算はマシン間、または同じマシン上の同じプログラムの異なるコンパイル間でも非決定的であるため、これは本当に可能ですか?その事実が、ゲーム全体に波及するプレイヤー(またはリプレイ)間の小さな違いを引き起こすのをどのように防ぐのでしょうか? 一部の人々は、浮動小数点数を完全に避けint、分数の商を表すために使用することを提案することを聞いたことがありますが、それは私には実用的ではありません-たとえば、角度の余弦を取る必要がある場合はどうなりますか?数学ライブラリ全体を真剣に書き直す必要がありますか? 私は主にC#に興味があることに注意してください。私が知る限り、この点ではC ++とまったく同じ問題があります。

9
ピアツーピアマルチプレイヤーゲームを作成するにはどうすればよいですか?[閉まっている]
p2pマルチプレイヤーゲームを作成するにはどうすればよいですか?サーバーレスのマルチプレイヤーゲームが欲しいです。しかし、その後、どのようにすべてのクライアントがお互いを知っているのでしょうか? なぜp2pプロトコルがファイル転送で有名なのにマルチプレイヤーゲームではそうではないのですか?

4
非シューティングゲームの動きの予測
私は、中規模のマルチプレイヤー、約20〜30人のプレイヤーが一度に永続サーバーに接続する等尺性2Dゲームに取り組んでいます。適切な動き予測の実装を適切に行うのに苦労しました。 物理学/運動 このゲームには真の物理学の実装はありませんが、基本原理を使用して動きを実装します。入力を継続的にポーリングするのではなく、プレーヤーが制御しているキャラクターエンティティの状態を変更するために、状態の変更(つまり、マウスのダウン/アップ/移動イベント)が使用されます。プレイヤーの方向(つまり、北東)は一定の速度と組み合わされ、エンティティの速度である真の3Dベクトルに変換されます。 メインゲームループでは、「更新」が「描画」の前に呼び出されます。更新ロジックは、速度がゼロ以外のすべてのエンティティを追跡する「物理更新タスク」をトリガーし、非常に基本的な統合を使用してエンティティの位置を変更します。例:entity.Position + = entity.Velocity.Scale(ElapsedTime.Seconds)(ここで、「Seconds」は浮動小数点値ですが、ミリ秒の整数値に対して同じアプローチが機能します)。 重要な点は、動きに補間が使用されていないことです-初歩的な物理エンジンには「前の状態」または「現在の状態」という概念はなく、位置と速度のみがあります。 状態変更および更新パケット プレイヤーが制御しているキャラクターエンティティの速度が変化すると、エンティティのアクションタイプ(スタンド、ウォーク、ラン)、方向(北東)、および現在位置を含む「アバターの移動」パケットがサーバーに送信されます。これは、3D一人称ゲームの仕組みとは異なります。3Dゲームでは、プレイヤーが動き回るにつれて、速度(方向)がフレームごとに変化します。すべての状態変更を送信すると、フレームごとにパケットが効率的に送信され、コストがかかりすぎます。代わりに、3Dゲームは状態の変化を無視し、一定の間隔(たとえば80〜150ミリ秒ごと)で「状態更新」パケットを送信するようです。 私のゲームでは速度と方向の更新の頻度がはるかに低いため、すべての状態変更を送信する必要はありません。すべての物理シミュレーションは同じ速度で行われ、確定的ですが、レイテンシは依然として問題です。そのため、通常の位置更新パケット(3Dゲームに似ています)を送信しますが、頻度はずっと低くなります-現在は250ミリ秒ごとですが、良い予測では500ミリ秒に簡単にブーストできると思います。最大の問題は、私が現在標準から逸脱していることです。他のすべてのドキュメント、ガイド、およびサンプルはオンラインで定期的に更新を送信し、2つの状態間を補間します。それは私のアーキテクチャと互換性がないようで、(非常に基本的な)「ネットワーク化された物理」アーキテクチャに近い、より良い動き予測アルゴリズムを考え出す必要があります。 サーバーはパケットを受信し、スクリプトに基づいてその移動タイプからプレーヤーの速度を決定します(プレーヤーは実行できますか?プレーヤーの実行速度を取得します)。速度が得られると、それを方向と組み合わせてベクトル(エンティティの速度)を取得します。いくつかのチート検出と基本的な検証が行われ、サーバー側のエンティティが現在の速度、方向、および位置で更新されます。基本的な調整も実行され、プレイヤーが移動要求でサーバーをあふれさせるのを防ぎます。 自身のエンティティを更新した後、サーバーは範囲内の他のすべてのプレーヤーに「アバター位置更新」パケットをブロードキャストします。位置更新パケットは、リモートクライアントのクライアント側の物理シミュレーション(ワールドステート)を更新し、予測と遅延補正を実行するために使用されます。 予測とラグ補償 前述のように、クライアントは自分の立場に対して権威があります。不正行為や異常の場合を除き、クライアントのアバターはサーバーによって再配置されることはありません。クライアントのアバターには外挿(「今すぐ移動して後で修正」)は必要ありません-プレイヤーが見るものは正しいです。ただし、移動しているすべてのリモートエンティティには、何らかの外挿または内挿が必要です。クライアントのローカルシミュレーション/物理エンジン内では、何らかの予測および/または遅延補償が明らかに必要です。 問題点 私はさまざまなアルゴリズムに苦労してきましたが、いくつかの質問と問題があります。 外挿、内挿、またはその両方を行う必要がありますか?私の「直感」は、速度に基づいた純粋な外挿を使用する必要があるということです。状態の変化はクライアントによって受信され、クライアントは遅延を補正する「予測された」速度を計算し、通常の物理システムが残りを行います。ただし、他のすべてのサンプルコードや記事とは相反するように感じられます。これらはすべて、多くの状態を格納し、物理エンジンなしで補間を実行するようです。 パケットが到着したとき、パケットの位置を、一定時間(たとえば200ms)にわたってパケットの速度で補間しようとしました。次に、補間された位置と現在の「エラー」位置の差を取り、新しいベクトルを計算して、送信された速度ではなくエンティティに配置します。ただし、別のパケットがその時間間隔で到着するという前提があり、次のパケットがいつ到着するかを「推測」することは非常に困難です。特に、すべてのパケットが一定の間隔で到着するわけではないためです。概念に根本的な欠陥があるのか​​、それとも正しいのか、いくつかの修正/調整が必要なのか? リモートプレーヤーが停止するとどうなりますか?エンティティをすぐに停止できますが、再び移動するまで「間違った」スポットに配置されます。ベクトルを推定するか、補間しようとすると、以前の状態を保存しないため問題が発生します。物理エンジンには「位置Xに到達した後に停止する必要がある」と言う方法がありません。速度を理解するだけで、それ以上複雑なことはありません。「パケット移動状態」情報をエンティティまたは物理エンジンに追加するのは嫌です。これは、基本的な設計原理に違反し、ゲームエンジン全体でネットワークコードを流出させるためです。 エンティティが衝突するとどうなりますか?3つのシナリオがあります-制御プレイヤーがローカルで衝突する、2つのエンティティが位置更新中にサーバーで衝突する、またはリモートエンティティ更新がローカルクライアントで衝突します。すべての場合において、衝突の処理方法は不確かです-不正行為は別として、両方の状態は「正しい」が、異なる期間にあります。リモートエンティティの場合、壁を歩いて描くのは理にかなっていないので、ローカルクライアントで衝突検出を実行し、「停止」させます。上記のポイント#2に基づいて、エンティティを「壁を通り抜けて」継続的に移動しようとする「修正されたベクトル」を計算することがあります。ポジション。ゲームはこれをどのように回避しますか?

4
クライアント側の予測はどのように機能しますか?
私はValve + GafferonとGoogleの何百ものページを読みましたが、何らかの理由でクライアントの予測に頭を悩ませることはできません。 私の理解では、基本的な問題は次のとおりです。 クライアントAは入力を送信します T0 サーバーはで入力を受け取ります T1 すべてのクライアントが変更を受け取ります T2 でT2しかし、クライアントの予測を使用して、クライアントAは、に位置適切になりましたT4。 サーバーが移動要求を受け入れると予測するときに、クライアントAがサーバーの前にいないことをどのように確認しますか?明らかに、常に先を行っているため、サーバーが最後に見た場所に戻ってしまいます。私が試したすべての修正を行っても、サーバーはあなたの後ろで停止するため、停止してもこれは依然として顕著です

2
このエンティティシステムをネットワーク化する方法は?
FPSのエンティティシステムを設計しました。基本的には次のように機能します。 GameWorldと呼ばれる「世界」オブジェクトがあります。これは、GameManagerの配列とComponentManagerの配列を保持します。 GameObjectはComponentの配列を保持しています。また、非常にシンプルなイベントメカニズムも提供します。コンポーネント自体は、すべてのコンポーネントにブロードキャストされるイベントをエンティティに送信できます。 コンポーネントは基本的にGameObjectに特定のプロパティを与えるものであり、GameObjectは実際にはそれらの単なるコンテナであるため、ゲームオブジェクトに関係するすべてはコンポーネント内で発生します。例には、ViewComponent、PhysicsComponent、およびLogicComponentが含まれます。それらの間の通信が必要な場合は、イベントを使用して行うことができます。 ComponentManagerは、Componentと同様の単なるインターフェイスであり、各Componentクラスには、通常1つのComponentManagerクラスが必要です。これらのコンポーネントマネージャは、コンポーネントを作成し、XMLファイルなどから読み取ったプロパティでコンポーネントを初期化する役割を果たします。 ComponentManagerは、外部ライブラリを使用するPhysicsComponentのように、コンポーネントの大量更新も処理します(世界中のすべてを一度に実行します)。 構成可能性のために、XMLファイルまたはスクリプトのいずれかを読み取るエンティティのファクトリーを使用し、ファイルで指定されたコンポーネントを作成します(また、一括更新のために適切なコンポーネントマネージャーに参照を追加します)。次に、それらをGameObjectオブジェクトに注入します。 次に問題が発生します。これをマルチプレイヤーゲームに使用しようとしています。私はこれにどのようにアプローチするのか分かりません。 まず、最初からクライアントはどのエンティティを持っているべきですか?まず、シングルプレイヤーエンジンがどのエンティティを作成するかを決定する方法を説明する必要があります。 レベルエディタでは、「ブラシ」と「エンティティ」を作成できます。ブラシは、壁、床、天井など、基本的に単純な形状のものです。エンティティは、先ほどお伝えしたGameObjectです。レベルエディタでエンティティを作成するとき、各コンポーネントのプロパティを指定できます。これらのプロパティは、エンティティのスクリプト内のコンストラクターのようなものに直接渡されます。 ロードするエンジンのレベルを保存すると、エンティティとそれに関連付けられたプロパティのリストに分解されます。ブラシは「ワールドスポーン」エンティティに変換されます。 そのレベルをロードすると、すべてのエンティティがインスタンス化されます。簡単ですね。 さて、エンティティをネットワーク化するために、多くの問題に遭遇しました。最初に、最初からどのエンティティがクライアントに存在する必要がありますか?サーバーとクライアントの両方にレベルファイルがあると仮定すると、クライアントは、サーバー上のゲームルールのためだけに存在する場合でも、レベル内のすべてのエンティティをインスタンス化できます。 もう1つの可能性は、サーバーがその情報を送信するとすぐにクライアントがエンティティをインスタンス化することです。つまり、クライアントは必要なエンティティのみを持つことになります。 別の問題は、情報の送信方法です。サーバーはデルタ圧縮を使用できると思います。つまり、フレームごとにクライアントにスナップショットを送信するのではなく、何かが変更されたときにのみ新しい情報を送信します。ただし、サーバーは各クライアントが現時点で知っていることを追跡する必要があります。 最後に、ネットワークをエンジンにどのように注入する必要がありますか?ネットワーク化されることになっているすべてのエンティティに注入されるNetworkComponentというコンポーネントを考えています。しかし、どのようにネットワークコンポーネントの知っておくべきどのようなネットワークへの変数は、とどのようにそれらにアクセスするために、そして最終的にクライアントに対応するネットワークコンポーネントは、ネットワーク変数を変更する方法を知っている必要がありますか? 私はこれに近づくのに大きな問題を抱えています。あなたが途中で私を助けてくれたら本当に感謝しています。コンポーネントシステムの設計を改善するためのヒントも受け付けていますので、提案することを恐れないでください。

5
ネットワーク化された2Dゲームでの遅延補償
基本的に物理学に基づいたサンドボックス/アクティビティゲームである2Dゲームを作りたいです。しかし、私には本当に理解できないことがあります。調査から、サーバーからの更新は約100ミリ秒ごとであるように思われます。プレイヤーが物理学を同時にシミュレートし、補間によって遅延補償を行うことができるため、これがプレーヤーに対してどのように機能するかを見ることができます。 私が理解していないのは、これが他のプレーヤーからの更新に対してどのように機能するかです。クライアントが100ミリ秒ごとにプレーヤーの位置のみを通知される場合、100ミリ秒で多くのことが発生する可能性があるため、その動作がわかりません。プレーヤーはその時間に2回程度方向を変えた可能性があります。誰かがこの問題について何らかの洞察を持っているのではないかと思っていました。 基本的に、これは撮影などでどのように機能しますか? ありがとう


3
MMOゲームで多数のピックアップを処理する方法
Minecraftのようなゲーム、または実際にピックアップを備えたMMOゲームはどのようにそれらを処理しますか? 地形を発掘するたびに、地形が3滴の「汚れ」を生成するとします。すべてのアイテムに、フレームごとに計算された回転アニメーションがあるとします。世界中のピックアップの数が非常に多くなると、それらのピックアップアイテムの多くがあなたから数年離れている可能性が高いため、特定のサーバーのクライアントのフレーム計算で無駄な大規模なオーバーヘッドになります。 だから私は、ローカルプレイヤーの近くにあるピックアップだけで「何かをする」必要があると考えましたが、それでも他のピックアップアイテムがアニメーションを開始するのに十分近いかどうかを確認する必要があるすべてのフレームを意味します。 私の実際の質問は、他のMMOがこの問題をどのように解決したかです。

9
デルタ圧縮は、ネットワークを介して送信されるデータ量をどのように削減しますか?
多くのゲームでは、送信されるデータの負荷を軽減するために、デルタ圧縮の手法を使用しています。この手法が実際にデータ負荷を下げる方法を理解できませんか? たとえば、ポジションを送りたいとしましょう。デルタ圧縮を使用しないvector3場合、たとえばエンティティの正確な位置を送信します(30, 2, 19)。デルタ圧縮ではvector3、より小さな数値でを送信します(0.2, 0.1, 0.04)。 両方のメッセージがvector3-各フロートに32ビット-32 * 3 = 96ビットである場合、データ負荷を下げる方法がわかりません。 各フロートをバイトに変換してから、バイトからフロートに戻すことができますが、表示される精度エラーが発生します。

2
リアルタイムFPSゲームでサーバーに送信するもの
ローカルプレイヤーの位置をサーバーに伝える正しい方法は何ですか?一部のドキュメントでは、入力が生成されるたびに送信する方が良いと述べています。また、いくつかの文書は、クライアントが一定の間隔で位置を送信すると述べています。 入力を送信するアプローチでは、プレーヤーが方向キーを押している場合はどうすればよいですか?つまり、すべてのフレームでサーバーにパッケージを送信する必要があります。多すぎませんか?また、マウス入力からのプレーヤーの回転もあります。以下に例を示します。 http://www.gabrielgambetta.com/fpm_live.html 固定間隔アプローチで位置を送信するのはどうですか。サーバーに送信するメッセージが少なすぎます。ただし、応答性も低下します。 それで、どちらの方が良いですか?

9
ネットワークゲームで非公式クライアントを防ぐためのテクニックはありますか?
マルチプレイヤーネットワークゲームでは、ユーザーがハッキングされたクライアントアプリではなく、公式のクライアントアプリケーションに接続していることを確認するためのテクニックは何ですか? これを行う確実な方法はおそらくないと思いますが、むしろ問題を軽減するために使用できる手法に興味があります。 Webベースのゲームに使用できる技術に特に興味がありますが、ほとんどの技術は一般的に適用できると思います。 ありがとうございました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.