0

私は 2D マルチプレイヤー ブラウザ ゲームを持っています。ゲームには、ヘビのようなプレーヤーと、さまざまな色のブロックのグリッドで満たされた世界が含まれています。

現在、サーバーからこれらのデータを送信しています。

  • if new player spawn - すべてのブロックとプレーヤーに関するデータを彼に、新しくスポーンしたプレーヤーに関するデータを他の人に
  • 誰かが動きを変えた場合 - 彼の軌跡、位置、方向に関するデータを全員に
  • 一部のブロックの色が変更された場合 - それに関するデータをみんなに

そのため、冗長なデータは送信しませんが、すべてのデータを全員に送信します。改変されたクライアントを使用する詐欺師はすべてを見ることができました! そのため、ビューポートに基づいてクライアントにデータを送信する必要があります。


ヘビのようなプレーヤーの場合、プレーヤーの最小値と最大値、X と Y を確認します。

プレーヤー A がプレーヤー B に近づくと、サーバーはクライアント A にプレーヤー B に関するデータを送信します。プレーヤー A がプレーヤー B から遠すぎると、サーバーはプレーヤー B をクライアント A から削除します。サーバーは、プレーヤー A が近い。


主な質問

しかし、ブロックに関するデータをどのように送信すればよいかわかりません。残念ながら、冗長なデータを送信しすぎてしまいます。

プレイヤーがスポーンするとき、近くにあるブロックに関するデータを彼に送信します。また、彼の近くのブロックの色が変わったら、彼に送ります。

プレーヤーが左に移動する場合、左のブロックに関するデータを彼に送信します。しかし、どのくらいの頻度でそれを行う必要がありますか? 彼が 1 ブロックの距離を移動するたびに、新しいブロックを送る必要がありますか?

プレイヤーがすでに行ったことのある場所に行くことにした場合はどうなりますか? 冗長データをもう一度送信する必要がありますか? または、そこにあるブロックが変更されたかどうかを確認できますか。しかし、プレイヤーがすでにいくつかのブロックを見たことをどのように思い出すことができますか? プレイヤーが見たすべてのブロックを覚えていない可能性があります (ブロックの量が多すぎます)。パフォーマンスに悪いでしょう。

Zoom チーターからゲームを保護し、パフォーマンスを低下させないようにするにはどうすればよいですか?

4

1 に答える 1

0

したがって、実装しようとしているものは、ネットワーク バブルと呼ばれることがあります。すべてのプレイヤーは自分の周りのデータを取得しますが (自分の周りのバブルのように)、すべてのデータを取得するわけではありません。したがって、プレーヤーに送信されるプレーヤーの周りのブロックの量を定義できます。たとえば、現在のブロックに直接隣接するすべてのブロックを送信します。

block1 - block2 - block3

block4 - player - block5

block6 - block7 - block8

ブロックをどのように記憶するかという問題については、クライアント側に、ブロックを格納する何らかの種類のストレージ アレイ (ハッシュマップなど) が必要になります。

サーバーは、クライアント ブロックがまだ最新かどうかを確認する機能を提供する必要があります。これは、ハッシュ関数を使用して実行できます。サーバーは要求されたブロックのハッシュを計算します。ブロック内のデータが変更されると、ハッシュ値が変更されます。サーバーのハッシュと保存されたクライアントのブロックが比較され、一致しない場合にのみブロックデータが送信されます。

于 2018-09-26T10:07:33.180 に答える