管理するものは大きく2つあります。
サーバーは、正式な方法で全世界を管理する必要があります。そのためには、N個のクライアント(Nは「大規模」)との通信が必要です。
クライアントは、原則として、全世界について知ることができますが、そうする必要はありません。クライアントにとっては、プレイヤーの近くに何があるかを知るだけで十分です。たとえば、かなり粗いグリッドのようなパーティション分割を想定すると、プレーヤーのセルとプレーヤーの周囲の26個のセル(2Dグリッドの場合は8個のセル)のみを知る必要があります。多少細かいグリッドの方が優れていますが、アイデアは得られます。
さて、たくさんのピックアップ、「たくさん」とは何ですか?1秒間に5つのことを掘ることができます。これは、サーバーで更新する必要のある数十の数値であり、サーバーはそれらがセルと重なっている他のプレイヤーにそれらを送信する。コンピューターにとって、これは非常にばかげた量のデータであり、無視できる量の計算です。同じセルに何百人/何千人ものプレイヤーがいる場合、それが課題になる可能性があります(その場合、パーティショニングが粗すぎます)。
サーバーは、ピックアップの回転やそのような詳細を知る必要も、気にする必要もありません。なぜだろうか?
クライアントは実際には気にしません。これは、クライアントがその場で補うことができる単なる見た目だからです。
サーバーの観点から必要なのは、あなたがいるノードで(30、40、50)を掘っていたことを知ることであり、これにより、例えばタイプ5の3つのオブジェクト、または3のカウントです。これですべてです。また、関心のある領域を後でグリッドセル上で移動する人に送信されるデータにその情報が含まれます(それまでにまだ存在していると仮定します)。
クライアントは、そこに生成された3つのオブジェクト、何とか言った。これで、クライアントが「D」のある場所にASCIIアートマップを表示するか、回転する汚れの山を表示するかは、すべて同じです。パイルの回転が異なるかどうか、またはプレーヤーに近いものだけが回転するかどうかも同じです。モニターに表示されるのは単なるもので、他の人には影響しません。
そのため、近くの汚れの山だけを回転させたいという具体的なケースでは、知っているすべてのオブジェクトの範囲チェックを行うことができます。データセットは大きくないため、すべてに対してブルートフォースでも機能します。
パーティションのサイズに応じて、あまりにも遠くにあるグリッドセルを簡単に取り除くことができます(する必要があります)。
もちろん、セルをさらに分割して、非常にスマートなものを使用することもできます。必要に応じてkdツリーを使用しますが、大きな利益は期待しません。Manhattan distaceで整理することも、自分の小さなグリッドで整理することもできますが、なぜですか?
距離チェック(実際には二乗距離ですが、あなたにとっては同じです)は、2回の乗算と加算(MUL、MADDに最適化されているため、実際には2つの操作のみ)で、その後に分岐または条件付き移動が続きます。これは、グリッドセル全体を一度に削除しない他の操作とほぼ同じくらい高速です。実際、これはGPUでも実行できることです...
同じ位置に対して数百、またはせいぜい数千の距離チェックを行う方法を見ると(2乗距離は問題なく機能します)、その計算を実行するだけで問題はありません。連続したメモリに対する友好的な反復、および条件付きの移動により、コストは安くなります。(疑似コード)のようなものrot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
。これは、フレームあたり数百の値の配列に対する1回の繰り返しです。コンピューターはそれを行うことにあまり関心がなく、連続したロードとストア、単純なALU、ブランチなし、数千回の反復です。
これは(多対1)サーバーの問題と同じクラス(多対多)ではありません。本当に、クライアントは問題ではありません。
minecraft:dirt
)およびcount(30)。プレーヤーがそれを拾うのに十分近い場合、プレーヤーのインベントリにできるだけ多くのカウントを追加します。プレーヤーに6個のアイテムだけのスペースがあり、30のスタックが地面にある場合、プレーヤーは6をピックアップし、地面のカウントのスタックは24に減らされます