Sie müssen zwei sehr unterschiedliche Dinge verwalten:
Der Server muss die gesamte Welt autoritär verwalten. Dazu ist eine Kommunikation mit N Clients (wobei N "massiv" ist) notwendig.
Der Kunde könnte im Prinzip über die ganze Welt Bescheid wissen, muss es aber nicht . Für den Kunden ist es ausreichend zu wissen, was sich in der Nähe des Spielers befindet. Nehmen wir zum Beispiel eine grobe gitterartige Unterteilung an, müssten nur die Zelle des Spielers und die 26 Zellen um den Spieler herum bekannt sein (oder 8 Zellen, falls Sie ein 2D-Gitter haben). Ein etwas feineres Raster ist besser, aber Sie haben die Idee.
Nun, viele Pickups, was ist "viel"? Sie graben vielleicht 5 Dinge pro Sekunde, das sind vielleicht zwei Dutzend Zahlen, die auf dem Server aktualisiert werden müssen, und der Server muss diese möglicherweise an einen anderen Spieler übertragen, dessen Interessenbereich Ihre Zelle überlappt. Für einen Computer ist dies eine ziemlich lächerliche Datenmenge und ein vernachlässigbarer Rechenaufwand. Es kann zu einer Herausforderung werden, wenn sich Hunderttausende von Spielern in derselben Zelle befinden (dann ist Ihre Aufteilung zu grob).
Der Server muss die Rotation der Tonabnehmer oder solche Details nicht kennen und sich auch nicht darum kümmern. Warum sollte es?
Es ist dem Kunden eigentlich auch egal, da dies nur eine Augenweide ist, die der Kunde im laufenden Betrieb nachholen kann.
Aus Sicht des Servers ist es wichtig zu wissen, dass Sie in dem Knoten, in dem Sie sich befinden, nach (30, 40, 50) gegraben haben, und es entscheidet sich, dass dies z. B. drei Objekte vom Typ 5 oder ein Objekt vom Typ 7 mit sich bringt eine Zählung von 3. Das ist alles, was es interessiert, und es ist alles, was es Ihnen sagt. Diese Informationen werden auch in den Daten enthalten sein, die an jemanden gesendet werden, der sein Interessengebiet später über die Rasterzelle bewegt (vorausgesetzt, dass sie bis dahin noch vorhanden sind).
Dem Klienten werden drei Gegenstände mitgeteilt, die dort erschienen sind, bla bla. Egal, ob der Client eine ASCII-Art-Karte anzeigt, auf der jetzt ein 'D' angezeigt wird, oder ob ein rotierender Schmutzhaufen angezeigt wird, ist alles gleich. Es ist auch egal, ob die Stapel unterschiedliche Rotationen haben oder nur die, die sich in der Nähe Ihres Spielers befinden. Es sind nur Dinge, die auf Ihrem Monitor angezeigt werden und die niemanden betreffen.
In dem konkreten Fall, dass Sie nur in der Nähe befindliche Schmutzhaufen drehen möchten, können Sie einfach eine Reichweitenkontrolle aller Ihnen bekannten Objekte durchführen. Da die Datenmenge nicht groß ist, funktioniert sogar Brute Force auf alles .
Sie können (und sollten) je nach Partitionsgröße zu weit entfernte Rasterzellen trivial entfernen.
Natürlich können Sie Ihre Zelle auch weiter unterteilen und etwas Superintelligentes verwenden. Verwenden Sie einen kd-Tree, wenn Sie wollen, aber erwarten Sie keine großen Gewinne. Sie können Sachen mit Manhattan distace wegschneiden oder Ihre Sachen in einem eigenen kleinen Raster sortieren ... aber warum?
Eine Entfernungsüberprüfung (wirklich quadratische Entfernung, aber für Sie ist es das Gleiche) besteht nur aus zwei Multiplikationen und einer Addition (optimiert für MUL, MADD, also wirklich nur zwei Operationen), gefolgt von einer Verzweigung oder einer bedingten Bewegung. Das geht so schnell wie bei jeder anderen Operation, bei der nicht ganze Gitterzellen gleichzeitig entfernt werden. In der Tat, das ist etwas , dass Sie könnte auch auf der GPU tun ...
Wenn Sie sehen, wie Sie ein paar Hundert oder höchstens ein paar Tausend Entfernungsprüfungen an derselben Position durchführen (quadratische Entfernung funktioniert einwandfrei), haben Sie wirklich keine großen Schwierigkeiten, nur diese Berechnung durchzuführen, noch mehr, da es sich um einen eher cachespezifischen Vorgang handelt. freundliche Iteration über zusammenhängendes Gedächtnis und mit bedingten Bewegungen ist es spottbillig. So etwas wie (Pseudocode) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. Das ist eine Iteration über ein Array von einigen hundert Werten pro Frame. Dem Computer ist das egal, es sind zusammenhängende Ladevorgänge und Speicher, eine einfache ALU, keine Verzweigungen und nur ein paar tausend Iterationen.
Dies (viele-zu-eins) ist nicht die gleiche Problemklasse (viele-zu-viele) wie auf dem Server. Wirklich, der Kunde ist nicht das Problem.
minecraft:dirt
) und eine Zählung (30), sodass der Spieler, wenn er nahe genug ist, um sie aufzunehmen, so viel wie möglich in sein Inventar aufnimmt. Wenn der Spieler nur Platz für 6 Gegenstände hat und ein Stapel von 30 auf dem Boden liegt, nimmt der Spieler die 6 und der Stapel auf dem Boden wird auf 24 reduziert.