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

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

1
マルチプレイヤープラットフォーマー-サーバー上の単一のクライアントでサーバーの修正が通常必要ですか?
私は現在、かなりシンプルなマルチプレイヤープラットフォーマーに取り組んでいます。私は待ち時間を隠すために使用される手法に関する記事をかなり読みましたが、それでも特定の概念を理解することができません。私はこのトピックが非常に興味深く、自分でアイデアを試したいと思っていますが、私の質問にはgamedev stackexchangeに尋ねる方が効率的だと思います。私の現在の状況と、その過程でどんな質問が生じたかを説明するために最善を尽くします。 現時点では、サーバーと同期するプレーヤーを1つだけにしたいと思っています。理論的には、クライアント側の予測を使用するプレイヤーは、自分の動きに影響を与える外部要因がないため、サーバーの修正は不要であると想定しました。したがって、私のプロトタイプでは現在、サーバー修正を送信せずにサーバーと同期しているプレーヤーは1つだけです。 ゲームネットワーキングに精通している場合は、コンテキストセクションをスキップすることもできますが、途中で問題が発生した可能性もあります。 クライアントループ(フレームごとに1回、〜16.67msごとに1回) 単純化されたクライアントループは次のようになります。 ローカル入力(WASD)を確認し、アクション(例:)としてパッケージ化しますType=MoveLeft, Time=132.0902, ID=15。後で送信するために、パッケージ化されたアクションを保持します。また、目的のアクションをゲームのローカルの物理シミュレーションに直接適用します。たとえば、MoveLeftアクションがある場合、プレーヤーの速度を左に向けて力を加えます。 チェックしてアクションを送信します。クライアントの帯域幅を乱用しないようにするには、パッケージ化されたアクションを特定の間隔(30msなど)でのみ送信します。 サーバーの変更を適用します。ある時点で、これはサーバーが受け取ったデルタと修正を処理し、それらをゲームのローカルシミュレーションに適用します。この特定の質問では、これは使用されません。 ローカル物理学を更新します。メインプレーヤーで物理ループを実行します。基本的に、これはプレイヤーの動きのクライアント側の予測を行います。これにより、プレーヤーの速度に重力が追加され、プレーヤーの速度が位置に適用され、途中で衝突が修正されます。物理シミュレーションは常に固定デルタ秒で実行されることを指定する必要があります(実際のデルタ秒に応じて複数回呼び出されます)。 。 物理学およびその他のセクションについては、質問には必要ないと感じたため、いくつかの具体的な詳細はスキップしますが、質問に関連するかどうかは、遠慮なくお知らせください。 サーバーループ(15msごと) 単純化されたサーバーループは次のようになります。 アクションを処理します。クライアントから受け取ったアクションパッケージを確認し、サーバーの物理シミュレーションに適用します。たとえば、5つのMoveLeftアクションを受け取ることができ、力を速度に5回適用します。アクションパッケージ全体が1つの「フレーム」で実行されることに注意してください。これは、アクションが発生するとすぐに適用されるクライアントではなく、 ゲームのロジックを更新します。ゲームの物理演算、プレーヤーの移動、衝突の修正などを更新します。また、後でプレーヤーに送信された重要なイベント(プレーヤーのヘルスの低下、プレーヤーの死亡など)もパッケージ化します。 修正を送信します。私たちは定期的に(たとえば、35ミリ秒ごとに)デルタを他のプレーヤー(たとえば、プレーヤーの位置、ヘルスなど)に最近変更した場合に送信します。この部分は現在実装されていません。クライアント側の予測が適切に機能することを確認するために、単一のプレーヤーのシミュレーションで修正なしでクライアントとサーバーで同じ結果が得られるようにしたいのです。 問題 現在のシステムは単純な状況では問題なく機能し、単純な水平移動でも非常によく似た結果が得られたことを嬉しく思います(この不正確さは浮動小数点の精度エラーが原因であると思います)。 プロトタイプのグラフィックは無視してください。白い長方形=プレーヤー、赤い長方形=障害物、青い=背景 しかし、ジャンプしたり、孤立した障害物に近づいたりするなど、時間に敏感な動きをした後、同期エラーが発生します。 理論的には、クライアントの立場に影響を与える外部要因がないため、どちらも常に同じ結果になると予想します。しかし実際には、問題は理解できたと思います。 そのような障害物の周りをジャンプすることは、プレーヤーのタイミングに大きく依存するため、速度がその位置に適用されたときの小さな変動は、結果に繰り返し実行されます(たとえば、クライアントは、サーバーは後でアクションパッケージ全体を受け取り、障害物にしばらく留まり、最終結果を変更するため、サーバーはそれを行います)。クライアントとサーバーがそれを処理する方法の違いは、サーバーがそれらを受信するときに、サーバーがそれらをすべて一括して実行するのに対し、クライアントはそれらが発生するとすべてのアクションを実行することです。 質問 この長いコンテキストは最終的に私の質問につながります(ここまで読んでいただきありがとうございます):サーバーと同期しているプレーヤーが1人だけの場合でもサーバーの修正が必要ですか、それとも特定の手法を使用して時間に敏感な状況での非同期を回避する必要がありますか? 私はいくつかの可能な解決策を考えましたが、そのいくつかは私にはあまり満足できません: サーバー修正を実装します。これが正常な動作であると単純に想定し、発生したエラーを修正してください。とにかくそれを実装したかったのですが、これまでに行ったことを受け入れられるようにしたかっただけです。 提供されたクライアント時間を使用して、目的のアクションを適用します。これはラグ補償と似ていると思います。「時間をさかのぼって」動きをチェックする必要があります。サーバーの修正を適用するようなもので、時間を遡り、その後の次のアクションを再適用します。本当に嫌いです。それは複雑でリソースが高価に見え、クライアントの指定された時間を信頼する必要があります(ただし、時間がかなり合法に見えることを実際に確認する予定ですが)。 GameDevelopment StackExchangeに、私のすべての問題を解決する優れた新しいアイデアを求めてください。 私はゲームネットワーキングの世界を始めたばかりなので、上記のコンセプトを修正、批判、侮辱したり、ワンダフルワールドオブネットワーキングの旅に役立つアイデアやリソースを提供したりしてください。他の場所で自分の答えを見つけることができたとしたら、失礼します。 貴重なお時間をありがとうございました。

1
プレーヤーの速度変更を送信するときにクライアントとサーバーを同期するにはどうすればよいですか?
クライアント側の予測を実装しています。ほとんどの説明は、クライアントが「プレーヤーを1ポジション上に移動する」のようなメッセージを送信することを前提としています。「プレイヤーのベロシティをxに設定」のようなメッセージを送信するとどうなりますか? クライアントでは、サーバーよりも先にプレイ​​ヤーが(クライアント側の予測によって)自分の速度を設定するため、2つが同期しなくなります。この問題は、平均遅延を考慮しても解消されません。 どうすればこれに取り組むことができますか?

4
マルチプレイヤーの不正行為を防止
小さなインディースタイルのマルチプレイヤーゲームの開発はほぼ完了です。私は人々がシングルプレイヤーでチートすることを許可するつもりですが、これは明らかにマルチプレイヤーでは受け入れられません。平均的なジョーがチートエンジンのようなものを使用してゲームの一部を変更するのを止めるのに役立つ方法を知っている人はいますか?私は現在、クライアントがゲームで使用する各設定ファイル(XMLとして保存)のMD5ハッシュを数秒ごとに検証のためにゲームサーバーにアップロードすることを計画していますが、メモリエディターなどを停止するためにできることはありますか? ?

3
最高のピアツーピアゲームアーキテクチャ
ゲームクライアントが次のような設定を検討します。 コンピューティングリソースが非常に小さい(モバイルデバイス、スマートフォン) すべてが共通のルーター(LAN、ホットスポットなど)に接続されている ユーザーは、外部サーバーなしでマルチプレイヤーゲームをプレイしたいと考えています。 1つの解決策は、1台の電話で信頼できるサーバーをホストすることです。この場合、このサーバーもクライアントになります。ポイント1を考慮すると、電話のコンピューティングリソースが十分でないため、このソリューションは受け入れられません。 そのため、ゲームのシミュレーション負荷をクライアント間で分散するピアツーピアアーキテクチャを設計したいと考えています。ポイント2のため、システムは最適化に関して複雑である必要はありません。レイテンシーは非常に低くなります。各クライアントは、自分自身と彼の直接の環境に関するデータの信頼できるソース(たとえば、弾丸)になることができます。 そのようなアーキテクチャを設計するための最良のアプローチは何でしょうか?そのようなLANレベルのピアツーピアプロトコルの既知の例はありますか? ノート: ここではいくつかの問題に対処していますが、そこにリストされている概念は、私には高レベルです。 安全保障 信頼できるサーバーが1つもないことはセキュリティの問題であることはわかっていますが、この場合はクライアントを信頼してもかまいません。 編集: 私は言及するのを忘れていました:かなりテンポの速いゲーム(シューティングゲーム)になります。 また、私はGaffer on Gamesでネットワーキングアーキテクチャについてすでに読みました。

3
MMOにハッキングメカニズムの知識は必要ですか?
大規模なマルチプレーヤー型オンラインゲーム(mmo)を作成する予定のグループプロジェクトに参加することを検討している(現在ではありません。最初に学ぶ必要があることはたくさんあります)と計画していたとします。私の仕事はネットワークです。部分。私はネットワークプログラミングにあまり詳しくありません(PHPやMYSQLに関する非常に基本的な本を読んだり、WAMPを少しいじったりしました)。 PHPとMYSQLの学習の過程で、ハッキングについて調べる必要がありますか?ポートスキャン、ルーターハッキングなどのハッキング。MMOでは、ボットなどをだまそうとする人が常にいますが、最悪のシナリオは、誰かがデータベースをハッキングすることです。これは私の概念です。本当にわかりません。ただし、サブネット化/ポート/ IP(ローカル/グローバル)/などのネットワークについてはかなりよく理解しています。 あなたの専門家の意見では、(あなたがトピックを理解しているなら、私を啓発してください)私はこれが起こる可能性に対抗するためにこれらのことについて学ぶべきですか? また、私が言及したこと(ポートスキャン、ルーターハッキング)のうち、ハッキングに関連する他に検討すべきことはありますか?私はネットワーキングの悪意のある/セキュリティの側面にあまり詳しくありません。 そして注意:ハッキングの方法を学ぼうとしている子供ではありません。大学に行く前にできるだけ多くのことを学びたいので、勉強する必要があるかどうかを本当に知る必要があります。


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
リアルタイム戦略ゲームのネットワーキング
現在の最先端のネットワークリアルタイム戦略ゲームとは何ですか? 数年前、一部のAAAタイトルがプレイヤーの入力のみを送信したことを思い出しているようです(Starcraft 1、Age of Empires)。これはあなたが他のすべてを完全に決定論的に保つことを要求するので、これはまだ実行可能なオプションですか?乱数ジェネレータを同期させることは実行可能に思われますが、FPU実装などの微妙な違いはどうですか? または、戦略ゲームはアクションゲームネットワークに近いものを使用しており、個々のエンティティが代わりに送信されます(何らかの形の予測と(デルタ)圧縮を使用して)? もしそうなら、発射体のような揮発性アイテムはどのように扱われますか? クライアント/サーバー対ピアツーピアはどうですか?私はこれらすべてが強く相互に関係していると思います。 お時間をいただきありがとうございます!

5
ネットコードの扱い方は?
ネットコードがゲームエンジンに「フック」できるさまざまな方法を評価することに興味があります。私は現在マルチプレイヤーゲームを設計しています。これまでのところ、少なくとも、ネットワークソケットを処理するために、グラフィックループとスクリプトを処理する他のエンジンとは別のスレッドを用意する必要があると判断しました。 私は、ネットワーク化されたゲームを完全にシングルスレッド化する1つの潜在的な方法がありました。つまり、非ブロッキングソケットを使用して、各フレームをレンダリングした後にネットワークをチェックします。ただし、フレームのレンダリングにかかる​​時間がネットワークラグに追加されるため、これは明らかに最適ではありません。ネットワーク経由で到着するメッセージは、現在のフレームのレンダリング(およびゲームロジック)が完了するまで待機する必要があります。しかし、少なくともこの方法では、ゲームプレイは多かれ少なかれスムーズなままです。 ネットワーク用に別のスレッドがあると、ゲームはネットワークに完全に応答することができます。たとえば、サーバーから状態の更新を受信するとすぐにACKパケットを送り返すことができます。しかし、ゲームコードとネットワークコードの間で通信するための最良の方法について少し混乱しています。ネットワークスレッドは受信したパケットをキューにプッシュし、ゲームスレッドはループ中の適切なタイミングでキューから読み取るため、この最大1フレームの遅延は解消されていません。 また、パケットの送信を処理するスレッドは、パイプを下りてくるパケットをチェックしているスレッドとは別のスレッドにしたいようです。これは、パイプが途中にある間は送信できないためです。着信メッセージがあるかどうかを確認します。selectまたは類似の機能について考えています。 私の質問は、最高のネットワーク応答性を実現するゲームを設計するための最良の方法は何でしょうか?明らかに、クライアントはできるだけ早くユーザー入力をサーバーに送信する必要があるため、イベント処理ループの直後、両方ともゲームループ内でnet-sendコードを送信することができます。これは意味がありますか?

6
ネットワーキングポンクローン
私はTCPソケット、UDP通信などの基本を持っていますが、これらをリアルタイムゲーム環境に適用する方法についてはあまりわかりません。 私は4プレーヤーのPongクローンを持っていて、3つのクライアントとサーバーの間でパドルの位置を同期する必要があります(サーバーは4番目のプレーヤーです)。現在、UDPを使用してリアルタイムの更新(パドルの動き)を送信し、TCPを使用してゲームロビーを設定しています。 大量のUDPトラフィックをスパム送信するのは悪いことですか?輻輳機能については、DCCPのようなものを検討する必要がありますか?それとも、これはこのような小規模プロジェクトでは本当に問題ではないのですか? クライアント/サーバー間で同期メッセージを送信する必要があるのはいつですか?現在、サーバーは、現在のゲーム状態のUDPパケットを管理可能な限り速くスパム送信しており、クライアントは、パドルの位置をできるだけ早くサーバーに送信しています。これはそれを行うための最良の方法ですか?Xミリ秒ごとにメッセージが送信されるように追加する必要がある遅延のようなものはありますか、またはイベントが発生したときにのみメッセージを送信する必要がありますか?(例えば、ユーザー入力によりパドル速度が変化した) クライアントにパドル位置をピアツーピアで通信させる方が良いでしょうか? 私はPongのコンテキスト内でこれらの質問をしていますが、これらの問題が他のゲームまたは一般化されたソリューションでどのように克服されるかにも興味があります。

2
UDPノンブロッキングまたは受信用の別のスレッド?
マルチプレイヤーゲーム(64歳未満のプレイヤー向け)を作成しています。私はすでにネットワークループ用に別のスレッドを用意することを決めましたが、UDPを受信するための追加のスレッドを作成するのか、受信用ソケットを非ブロッキングに設定する(追加のスレッドなしで)のが良いのか疑問に思っていました。 または、非同期ソケットのような別の方法を使用する方が良いですか?より良い方法はいつでも歓迎です!

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

5
Vector3で演算子 '> ='を使用できないのはなぜですか?
私は私がように参照する2つの位置の間を移動するための四角形を取得しようとしている_positionAとします_positionB。どちらもタイプVector3です。長方形はうまく動きます。ただし、到達_positionBしても、本来のように反対方向に移動することはありません。 コードをもう一度見てみました。オブジェクトが移動ifすると、コード内のステートメントは、rectsの位置がに等しいフレームを逃したという結論に達しました_positionB。rectsの位置がより大きいか等しい 場合は、コードを変更して方向を逆にすることにしました_positionB。私のコードは長すぎないので、以下に表示します。 using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

3
スロットルを回避する方法は?
私はネットワーク化されたiOSゲームを書いています。でパケットを送信するときGKMatchSendDataReliable(私はどの仮定 60のパケット毎秒(隣接パケット間のように16ミリ秒)、平均ping時間でUDPを書き込む自分のパケット受信コードであった)急速に悪化:私は次々 (以下7個のゲームセンターの一致を開い)、100パケットの「フラッド」を送信しました(毎秒60パケットのレートで)。私は平均往復時間を測定しました、そしてこれらは結果です: [ 21:16:39 ]: I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms [ 21:16:34 ]: I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms [ 21:16:45 ]: I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 …
9 networking  udp 

2
サーバー側入力
現在私のゲームでは、クライアントはレンダラーにすぎません。入力状態が変更されると、クライアントはサーバーにパケットを送信し、プレーヤーが入力を処理しているかのようにプレーヤーを移動しますが、サーバーは最終的な判断を下します。 これは、1つの大きな問題を除いて、通常は非常にうまく機能します。基本的に、プレーヤーが崖に向かってエッジに向かって歩いていて、エッジから出る直前に停止する場合、場合によっては1秒後に、エッジからテレポートされます。これは、サーバーが情報を処理した後で、「Wを押すのをやめた」パケットが送信されるためです。 ここに私が何を意味するかを理解するのに役立つラグダイアグラムがあります:http : //i.imgur.com/Prr8K.png サーバーが処理するフレームごとに "W Pressed"パケットを送信するだけでもかまいませんが、これは帯域幅のコストがかかるソリューションのようです。 どんな助けでもありがたいです!

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