JSブラウザーゲームとnode.jsサーバー間の通信のヒント?[閉まっている]


7

私はいくつかの単純なCanvasベースの洞窟フライヤーゲームをいじくり回しており、最終的にそれをマルチプレイヤーにしたいと考えています。サーバー側でNode.jsを使用する計画です。

送信されるデータは、各プレーヤーの位置、方向、速度などで構成されます。プレーヤーの動きは単純な力の物理学なので、サーバーからの次の更新の前に動きを推定できるはずです。

通信側のヒントやベストプラクティスはありますか?私はウェブソケットが行く方法だと思います。ゲームループのすべてのパスで、または指定された間隔で情報を送信する必要がありますか?また、それが古いブラウザーで動作しないかどうかは気にしません。

回答:


10

私は最近、Node.js / JavaScriptを使用して小惑星/ジオメトリウォーズクロスオーバーを作成しました:http :
//github.com/BonsaiDen/NodeGame-Shooter

ゲームを処理するファットサーバーと、基本的には単なるビューであるシンクライアントがあります。クライアントは補間を行い、スムーズに見えるようにします。

基盤となるネットワークロジックと、アクターおよびクライアントモデルが含まれている、次の2つのファイルを確認することをお勧めします
。 js
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/nodegame.js

ゲーム全体は、ほとんどの場合、「更新イベント」(クライアントに送信されるもの)を自分で処理するアクターに基づいています。特定のクライアントからアクターを非表示にして、非表示などを実装することもできます。

ゲームを記録し、メッセージをクライアントにフィードして再生することもできます。

技術に関する限り、
WebSocketはここに行く方法です。私はJSのカスタムバイナリエンコーディングも行いました。浮動小数点数の小数点以下2桁以上をあきらめる一方で、JSONよりも約50%小さくなっています(V8ではネイティブ JSONエンコーディングより2倍高速です)。


ありがとう!そのNodeGame Shooterはかなり興味深く見えます、私はそのコードで少し時間を費やす必要があります。
Petteri Hietavirta

8

物事を分けておくことをお勧めします。

Javaで記述された2D MORPGであるスタンダールでは、次のことを実行しました。

  • クライアントは描画に高速ループを使用します。スムーズなアニメーションと予測を行い、ラグを最小限に抑えます。
  • サーバーはループを使用してすべてのゲームロジックを処理します。私たちの場合、描画ループよりもかなり遅くなる可能性があります。クライアントはいくつかの予測を行いますが、サーバーが常に優先されます。

クライアントとサーバー間の通信は、アクションと認識を使用して行われます。

  • 「上に移動」などのユーザーが行ったアクションは、発生時にサーバーに送信されます。サーバーはそれらをキューに入れ、独自のループで処理します。
  • 知覚はサーバーからクライアントに送信され、世界観を更新します。

追加のパフォーマンスを得るために、いくつかの「トリック」を行いました。

  • 認識メッセージには2種類あります。1つはログインで使用される完全なメッセージ、もう1つはゾーンに参加するプレイヤーです。そしてその後に使用される増分更新。これにより、ネットワーク帯域幅を大幅に節約できます。
  • 認識メッセージをパブリック部分とプライベート部分に分割します。同じゾーンのすべてのプレーヤーが同じパブリック部分を共有するため、シリアライゼーションがJava(JavaScriptではない)のボトルネックになるため、処理時間を節約できます。

ああ!呼び出し時にアクションを処理するのではなく、ループのアクションをキューに入れます。これは私が必要とするものだけです。
MetaGuru

3

socket.ioを使用してください。これは、サポートしていないブラウザにフォールバックを提供する便利なWebSockets抽象化ライブラリです。

また、そのようなオンラインモデルを使用する場合は、ゲーム処理をサーバーに移動することをお勧めします。そうすれば、グラフィカルな変更とマウス/キーボード入力を通信するだけで済みます。また、不正行為を防ぐのにも役立ちます。

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