Masz dwie bardzo różne rzeczy do zarządzania:
Serwer musi zarządzać całym światem w autorytatywny sposób. W tym celu konieczna jest komunikacja z N klientami (gdzie N jest „masywny”).
Klient mógł w zasadzie wiedzieć o całym świecie, ale nie musi . Dla klienta wystarczy wiedzieć o tym, co znajduje się w pobliżu gracza. Zakładając na przykład dość zgrubne podziałanie podobne do siatki, musiałby znać tylko komórkę gracza i 26 komórek wokół odtwarzacza (lub 8 komórek, jeśli masz siatkę 2D). Lepsza jest nieco drobniejsza siatka, ale masz pomysł.
Teraz dużo przetworników, co to jest „dużo”? Kopiesz może 5 rzeczy na sekundę, to może dwa tuziny liczb, które muszą zostać zaktualizowane na serwerze, a serwer może być zmuszony przekazać je innemu graczowi, którego obszar zainteresowania pokrywa się z twoją komórką. W przypadku komputera jest to dość absurdalna ilość danych i nieistotna ilość obliczeń. Może stać się wyzwaniem, gdy w tej samej komórce znajdują się setki / tysiące graczy (wtedy twoje parowanie jest zbyt szorstkie).
Serwer nie musi wiedzieć ani przejmować się obrotami przetworników ani takimi szczegółami. Dlaczego miałoby to
Klient tak naprawdę nie przejmuje się tym, ponieważ jest to po prostu oko, które klient może nadrobić w locie.
Z punktu widzenia serwera niezbędna jest wiedza, że kopałeś (30, 40, 50) w węźle, w którym się znajdujesz, i decyduje, że spawnuje to np. Trzy obiekty typu 5 lub jeden obiekt typu 7 z liczba 3. To wszystko, na czym mi zależy i to wszystko, co ci mówi. Będzie również zawierać tę informację w danych wysyłanych do kogoś, kto później przesunie swój obszar zainteresowania nad komórką siatki (zakładając, że do tego czasu nadal tam jest).
Klient zostaje poinformowany o pojawieniu się tam trzech obiektów, bla bla. Teraz, niezależnie od tego, czy klient wyświetla mapę ASCII-art, na której jest teraz „D”, czy pokazuje wirującą kupę brudu, wszystko jest takie samo. Niezależnie od tego, czy stosy mają różne obroty, czy tylko te znajdujące się w pobliżu gracza obracają się tak samo. To tylko rzeczy wyświetlane na monitorze, nie mają wpływu na nikogo innego.
Tak więc w konkretnym przypadku, w którym chcesz obracać tylko stosy brudu w pobliżu, możesz po prostu sprawdzić zasięg wszystkich znanych ci obiektów. Ponieważ zestaw danych nie jest duży, nawet brutalna siła na wszystko będzie działać.
Możesz (i powinieneś) w zależności od rozmiaru partycjonowania, trywialnie przyciąć komórki siatki, które są zbyt daleko.
Możesz oczywiście dalej dzielić komórkę na partycje i używać czegoś super inteligentnego. Jeśli chcesz, użyj drzewa kd, ale nie spodziewaj się wielkich zysków. Możesz przycinać rzeczy na Manhattanie lub sortować swoje rzeczy na małej siatce ... ale dlaczego?
Kontrola odległości (naprawdę do kwadratu odległość, ale jest taka sama dla ciebie) to tylko dwa mnożenia i dodatek (zoptymalizowany do MUL, MADD, więc tak naprawdę tylko dwie operacje), po którym następuje ruch rozgałęzienia lub warunkowy. Jest to prawie tak szybkie, jak każda inna operacja, która nie przycina jednocześnie całych komórek siatki. W rzeczywistości jest to coś, co można nawet zrobić na GPU ...
Widząc, jak będziesz mieć kilkaset lub co najwyżej kilka tysięcy kontroli odległości względem tej samej pozycji (odległość kwadratowa działa dobrze), naprawdę nie masz problemów z wykonaniem tych obliczeń, tym bardziej, że jest to raczej pamięć podręczna - przyjazna iteracja nad ciągłą pamięcią, a przy ruchach warunkowych jest tanio brudna. Coś jak (pseudokod) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. To jedna iteracja na tablicy kilkuset wartości na ramkę. Komputer nie mógł się tym mniej przejmować, to ciągłe ładunki i sklepy, prosta ALU, żadnych oddziałów i tylko kilka tysięcy iteracji.
To (wiele do jednego) nie jest tą samą klasą problemu (wiele do wielu) jak na serwerze. Naprawdę klient nie jest problemem.
minecraft:dirt
) i liczba (30), więc gdy gracz jest wystarczająco blisko, aby go podnieść, wystarczy dodać jak najwięcej z ekwipunku gracza. Jeśli gracz ma tylko miejsce na 6 przedmiotów, a stos 30 leży na ziemi, gracz podniesie 6, a stos na ziemi zmniejszy się do 24.