開発の後半の段階で、ネットワークコードをどのように記述できますか?


12

私は現在、ゲームの作成の初期段階にあり、最終的にはほとんどの面で改善したいと思っています。
ネットワークコードの作成をスキップして、かなり簡単に実装したまま、つまり追加するだけでゲーム全体を書き直す必要がないようにするにはどうすればよいですか。
何を覚えておく必要がありますか?

物理学/衝突検出、ゲームロジック、データタイプ、アニメーション/レンダリングを互いに分離するコンポーネントパターンがあります。
ネットワークコードがまだ実装されていないクライアントとサーバーを作成して、ローカルでテストする方法を教えてください。
クライアントで何をすべきか、サーバーで何をすべきか?ネットワークコードが終了し、サーバーとクライアント間でメッセージを送信し、遅延などがない場合でもアカウントにメッセージを送信するふりをする必要がありますか?

編集:トップダウンRPGになる予定です。友人のためにサーバーをホストするシンプルなマルチプレイヤーは私が考えていることです。それでも、「サーバーは常に正しい」というアプローチにしたいと思います。

編集2:私は私の心のセットがどうあるべきかについてのいくつかのポインタを探していると思います。すべてのエフェクト/変更を即座に適用するのではなく、キーボード入力やアニメーションなどをどのように処理すればよいですか。うーん、私は結局のところどこかに行く前にネットワークについて適切に読む必要があるかもしれません。


それは、ネットワークコードの実装方法に大きく依存します。たとえば、Quake(または後のidタイトル、私の記憶が少し曖昧な場合があります)は、たとえば常にクライアント/サーバーであるというアプローチをとりました。シングルプレイヤーオプションでさえ、実際には127.0.0.1のサーバーに接続しており、他のプレイヤーを招待していません。つまり、シングルプレイヤーゲームでさえも完全にネットワークコードを介して実行されます。
LLL79

それは私が念頭に置いていたようなものです。たぶん、プロセス間通信がいくつかあるので、単独でプレイしたいときや、クライアントと同じ機能を持ちながらサーバーのようにすぐに処理したいときに接続する必要はありません。
ゴーク

3
ベストプラクティスは、かなり長い間「してはいけない」ことです。ターンベースのゲームを書いているのでなければ、ネットワーキングを処理するために物事を別の方法で設計する必要があります。遅延、正確性、不正行為を気にする場合、それを回避する方法はありません。そうしなければ、それについてあまり考える必要はありません。経験がない場合は、とにかく適切な設計を十分に予測することはできません。最良の方法は、ネットワークエクスペリエンスを獲得するために、ネットワーク化されたいくつかのプロトタイプに着手することです。
ルアーン

考えてみれば、Minecraftにはシングルプレイヤーゲームでもローカルサーバーがあります。サーバーはエンジンであり、クライアントは単なるプレゼンターです。
SparK

回答:


12

あなたが書いている正確なゲームについて、そしてあなたがそれをどのように書いているかについての詳細を知ることなく、あなたの問題に対する一般的な解決策を言うことは非常に困難です。

ただし、ゲームにとってネットワークの重要性に応じて、ネットワークコードを最後まで残すというこの決定を検討することをお勧めします。

つまり、MMORPGなどのネットワーク負荷の高いゲームを作成している場合、ネットワークを最後まで残すのは賢明ではないかもしれません。

ネットワークコードに期待する影響が低い場合(ネットワークコードをまったく持たないことがゲームブレーカーではないなど)、それを後の(ただし、遅すぎない)ステージに残すことが適切であると考えられます。

ネットワークコードを記述することは、それを考えることとは異なります。ゲームの作り方を決定する際には、これがネットワークの決定にどのように影響するかを検討する必要があります。予想される影響が大きい場合は、一般的な情報を提供するスタブとして実装し、ネットワークを作成するときコードは、スタブを残した場所にプラグインするだけです。

したがって、たとえば、オンラインチェスゲームを作成ExecuteMove()している場合、マウスで動きが入力されたときに何らかの方法で呼び出され、キーボードで動きが入力されたときに別の方法で呼び出される関数があります。この時点で、他のホストから必要なデータを取得した後(これは後の部分で記述します)を呼び出すネットワークスタブの作成を検討できます。ExecuteMove()

そうすれば、ゲームを作成するときに、どの部分がネットワークコードの影響を受けるかがわかります。実際にネットワークコードを記述するときは、数歩先に進んでいます。

ネットワークゲームを作成するのがこれが初めての場合は、不正行為やそのようなことについて考えすぎないようにしてください。ネットワークゲームの作成は非常に複雑で、経験豊富なチーム全員がAAAゲームを行う必要があります。そのため、より遅くして、最初に機能するゲームを作成してから、より複雑なトピックに焦点を当てます。

最後に、これが初めてゲームを作成する場合は、ネットワーク化しないでください。ゲームの作成は非常に複雑であるため、ゲームに追加する要件ごとに指数関数的に複雑になります。


まあ、それはMMOではないので、ネットワーク上でそれほど重くはなりません。ただし、移動が行われる前に数秒かかることもある古いボードゲームではありません。私の経験では、最後の段階でマルチプレイヤーを追加してもうまくいかないので、ネットワーキングは早い段階で考えるべきだと思います。ただし、キャラクターを動き回らせてオブジェクトと衝突させる前に、ネットワークコードを記述してデバッグしたくありません。
ゴーク

2
@Ghork:ああ、あなたはあなたの製品ができるだけ早くきれいなことをするのを見たいです!まあ、はい、私たちは皆そうです。しかし、その誘惑に負けても、適切に設計された、考え抜かれたプログラムにはなりません。
モニカとの軽さのレース

私はこの答えを受け入れますが、他の答えも好きです。具体的には、@ Luaan
Ghork

2

私は同様の状況にいますが、ゲームよりもネットワーク化されたシミュレーションをしようとしています。しかし、私のアプローチは設計プロセスに役立つと思います。

私のアプローチは、IPC(プロセス間通信)に関するコメントに沿っています。

最初に、背景として、スティードとオリベイラによる本「Networked Graphics」を勉強しています。これは、さまざまな基準とゲームの種類に応じて、ゲームのさまざまなネットワークアーキテクチャに関する優れた背景を提供します。ゲームアーキテクチャ、ネットワーク上に正確に配置するもの、ローカルで実行するものを決定するのに役立つツールを提供します。

第二に、ネットワークコンポーネントを個別のバックグラウンドスレッドに分離して、最初のゲーム開発でコンポーネントをローカルにコーディングできるようにしますが、スレッドの分離に対処する必要があります。これらを後で「ローカルバックグラウンド」になる他の機能と組み合わせないで、「潜在的にリモート」のバックグラウンドスレッドに強制します。

これにより、ロジックの分離を維持し、ネットワーク遅延要因をプロセスにシミュレートして、遅延の影響を確認することもできます。


その本をチェックする必要があると思います!あなたが言ったことをできると期待できるように思えます。
ゴーク

@Ghork:重要なのは、アーキテクチャ、ローカルで必要なもの、サーバーで必要なものを把握することです。または、ピアが通信および対話する方法。その本は役立つはずです。次に、リモートで必要なものすべてを、現在はすべてローカルのままですが、別々のスレッドに「リモート」のものを保持するクライアントサーバーコードのセットを介して、IPCメッセージコールの反対側に配置します。IPCメッセージパッシングコンポーネントで、シミュレートする遅延を人為的に追加します。幸運を!
ジョーヴァンスティーン

1

これらすべてを学んでいるなら、シンプルなシングルプレイヤーバージョン1を書いてみてください。それが機能したら、より深い知識を持って、マルチプレイヤーになるバージョン2について徹底的に再考してください。


0

ネットワーククラスと同じインターフェイスを持つ、スレッド間でメッセージを渡す「偽のネットワーク」クラスを実装します。後で、偽のネットワークを作成して、ランダムな遅延とパケット損失を発生させることができます。実際のネットワークよりも偽のクラスを使用すると、常にネットワークコードをデバッグするのが簡単になります。

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