マルチプレイヤーゲーム用のシンプルなゲームサーバーを構築する方法


9

シンプルなゲーム用のシンプルなマルチプレイヤーゲームサーバーを作成したいと思います。

このゲームはCommand&Conquerに似ていると思われ、戦車と兵士が数人います。1人の兵士を選択し、マップをクリックして、兵士が行くべき場所に移動できます。兵士が行けなかった場所に来ると、歩き回ります。そして、兵士は敵に撃ち落とされることができます。

ゲームサーバーをどのように構築し、クライアントで何をすべきですか?

つまり、兵士がXからYに移動するがZの建物の周りを移動する場合、サーバーは兵士がいる場所を正確に計算できなければならない(敵が彼に撃たれた場合)、そしてクライアントはまた、兵士を描く。

サーバーで何をすべきか、そして私はこれのためのプロトコルを設計しなければならないと思います。サーバーはゲームの状態と時間を追跡する必要があると思います。これを行う方法についての提案はありますか?またはいくつかの読書をお勧めできますか?

回答:


12

一般に、それは非常に複雑なテーマです。あなたには2つの相反する目的があります(少なくとも、専用サーバーですべてのゲームを実行する予定がない場合):

  1. チートを防止し、すべてのクライアントに同じものが表示されるようにするために、サーバーでできる限り多くのことを実行する必要があります。
  2. しかし、公平性を保つ必要もあります。つまり、1人のユーザーがサーバーに対して0回のpingを実行し、他のユーザーがネットワークに遅れを持っている場合、両方が同時にユニットにコマンドを発行すると、「サーバー」プレーヤーが有利になります。 。

RTSでそれを解決する方法を正確に言うことはできません。FPSの起動のために行うことは、サーバーに完全な世界状態をしばらく保存させ、クライアントにすべてのショットにタイムスタンプを付けさせることです。「解雇!」のネットワークメッセージが表示されたとき サーバーに到達すると、サーバーはワールドをロールバックし、「ショットが発射されたときにクライアントを探したように」ワールドで衝突テストなどを実行できます。

多数のユニットを使用することを計画している場合は、サーバーが処理するには処理が多すぎるという問題も発生します。ハッキングや不正行為についてひどく心配していない場合は、クライアントでパスファインディングを実行し、その結果をサーバーに送信することをお勧めします。

さらに別のオプションとして、代わりにpeer2peerを使用して、各クライアントにローカルチームの更新を処理させることもできますが、その場合、誰が何にヒットするかを判断する方法などの問題が生じます。

このプロジェクトがどれほど複雑で、どれだけの労力をかけてプロジェクトに費やすかにもよりますが、私は、予備的なものを決めて、それをテストするための作業を始めることをお勧めします。


1
実際には、3つ(またはそれ以上)の相反する目的があります。3つ目はパフォーマンスです。リアルタイムゲームの状態をサーバー上で完全に維持および更新することは、多くのリソースを使用します。
Bart van Heukelom、2010

2
ああ、そして、他のプレイヤーのラグの平均に等しい人工的なラグを導入することで、#2を簡単に解決できます。まあ、もしあなたが「誰にとっても悪いこと」を解決策と呼ぶことができるなら、それはそれです。
Bart van Heukelom

@バート:部分的には真実ですが、当然のことながら、人為的に導入するラグには上限があります。遅い接続では、速い接続が常に過度にラグするように強制される可能性があります。
o0 '。

クライアントで実行された場合、最適なパスを見つけることは問題ありません。最適なパスを見つけると、ソリューションがサーバーに送信され、すべての移動と同様に、正しいかどうかがチェックされます。
o0 '。

2

基本的に2つの方法があります。

  1. 信頼できるクライアント
  2. 信頼できないクライアント

信頼できるクライアントは少し複雑ですが、サーバーから多くの計算をオフロードできるという利点があります。サーバー操作のコストはマルチプレイヤーゲームの最大の問題の1つであり、スケーラビリティを大幅に低下させます。

(初心者にとって)良いアプローチは、各プレイヤーのクライアントに自分のユニットを処理させることです。次のステップでは、スペアサイクルを使用して、プレーヤーのクライアントが他のクライアントのアクションを確認できるようにします。サーバーは、メッセージの交換、同期の維持、持続性の確保(データベースなど)以外のことを行う必要はありません。

何らかのロビーやチャットを計画している場合は、これらの各トピックを追加のサーバーで処理します。将来的には物事がずっと簡単になります。


ありがとう、それは有益でした。私は信頼できないクライアントのために行くと思います、そしてサーバー上で仕事をしなければなりません。最初はあまりプレイヤーはいないでしょう。
ジョナス

1
「私は多くのプレーヤーがいないでしょう...」そのラインを与えて6週間後に戻ってくる開発者の数を数えることはできません:「私はこれらの5000人のプレーヤーがゲームをプレイするために支払いたいと思っていますが、スケーリングできません。 :( "。覚えておいてください!
Andreas

9
「信頼できるクライアント」はアプローチではなく、間違いです。
o0 '。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.