Poszedłem na serwerze w maynkraft ale różni Kicks

POMOC - Ten gracz jest już na SERWERZE | BUKKIT W języku angielskim - Twój ...

Jak nie pisać wielką serwer

  • Programowanie,
  • Rozwój gry
    Ci, którzy widzieli mój poprzedni artykuł (i to jest raczej związane z tematem), wiesz, że na więcej niż jeden i pół roku, muszę rozwijać własną implementację serwera Minecraft, zaprojektowane, a przede wszystkim na pełnym obciążeniu. Jednak w naszej pracy wykorzystujemy tę samą drogę i Server Standard (Bukkit) dla szeregu mini-serwerów, po prostu zrobić to odmiana. I tak, w obliczu kolejnej wersji serwera, który był 5 razy gorszy niż poprzednie, nie mogłem tego znieść, i postanowiłem napisać ten artykuł.

    Artykuł jest bardziej jak historia niż na materiał nauczania, więc jest mało prawdopodobne, będziesz zbierać z niego użytecznych umiejętności kodowania, ale mam nadzieję, że ktoś wydaje się interesujące, a nawet użyteczne. Ale jeśli go zobaczyć kilka przykładów kodu i, nie otwieraj tego artykułu, to nie o to chodzi. To, miejmy nadzieję, będzie następnym artykule.

    Nie musisz nic wiedzieć na temat maynkrafte a zwłaszcza jego serwerze, w tym artykule chcę tylko powiedzieć, jak oryginalny serwer Minecraft, jak również jego „wiążąc» - Bukkit, dlaczego taki system nie działa i nie powinno być. Nie udaję się doskonałą wiedzę na temat rozwoju serwerów, a nie twierdzą, że mój serwer jest napisany poprawnie i najlepszy. Ja tylko dzielę doświadczenie, oparte na dwóch latach pracy z serwerem od znanego Mojang i pół latach rozwoju serwera. Wszystkie informacje tutaj jest moja osobista opinia, a artykuł ma na celu poszerzyć horyzonty, a nawet nauki i mogą być przedmiotem zainteresowania zarówno początkujących, jak i zaawansowanych profesjonalistów.

    Zacznijmy najczystszej ( „Vanilla») serwera Minecraft, ale raczej z tego, co jest zaangażowany w ogóle. Pozycje danych przetwarzanych przez serwer:

    • Kawałki - dla tych, którzy nie wiedzą, że cały świat jest podzielony na kawałki Minecraft powierzchni 1616 metrów sześciennych i wysokości w zależności od ustawień. Wszystkie kawałki w promieniu graczy pojawiają załadowana w pamięci serwera i są HashMap-e, każdy serwer „tick” każda porcja jest przetwarzane. W tym czasie, wykonaj następujące czynności: wszystkie aktywne fragmenty (te, które znajdują się w pewnej odległości od graczy) poruszają się po kolei. Na każdy kawałek jest wykonywane przetwarzanie pogody (pour śnieg, piorun), jak również losowy przetwarzanie zablokuj - wszystkich wybranych kilkadziesiąt losowych bloków fragmencie, to jest sprawdzane, czy te bloki są aktualizowane (wg rodzaju urządzenia) potrzebne i nazywany jest specjalna funkcja w wybranym bloku.
    • Płytki - są specjalne bloki, które są przetwarzane każdego kleszcza, a nie przez przypadek. bloki danych są pieca (materiał Aktualizacja stanu wypalenia pozostałego paliwa, musi to być zrobione w sposób jednolity, a nie przypadkowo, jak teak innych jednostek), jak również istnieją spavner mobov (bloki że ikra mobov wokół siebie) Kotły eliksiry i podobne rzeczy. Są one przechowywane na liście (lista), która jest wypełniona podczas ładowania klocek lub podczas instalowania nowej płytki w pracy i uzyskać nad każdym cyklu po kolei.
    • Pilne bloków - są, oczywiście, więc nie są znane, ale mimo to bloki, które muszą być przetwarzane „pilne”, czyli w następnym cyklu, lub z niewielkim opóźnieniem (również w cyklach, wszystko jest uważany w cyklach, nawet w czasie, nawet Allah ), a nie przez przypadek, ponieważ losowe bloki są przetwarzane co kilka minut na średniej. Obsługiwane podobnie jak płytki, ale opóźnić, ile muszą obsługiwać cykle mogą zostać określone. Zadania przetwarzania są zwykle generowane podczas pracy serwera z powodu działania odtwarzacza lub innych bloków. W szczególności, tak przetwarzane Redstone który musi reagować szybko na zmiany zewnętrznych bloków pożaru, przepływającej wody, i tym podobne.
    • Aktualizacja światło - Minecraft używa oświetlenia statycznego, podzielone na bloki. Każda jednostka ma swoje własne poziomy światła od 15 do 0. W blokach ich zmiana oświetlenia powinny być przeliczone, algorytm nie jest bardzo skomplikowane, ale rekurencyjna, a także istnieją dwa rodzaje światła - z bloków (pochodnie ognia itp) oraz z nieba, oni powinien być obliczony niezależnie, czyli dwa razy na każdej zmianie (jeśli niebo w świecie, w Pustki nie).
    • Podmiot - to prawie wszystkie obiekty. Moby, gracze, ulubione przedmioty leżące wokół na podłodze, wózki, rowery, obrazy, piorun, strzały, i tak dalej. Są one przechowywane w jednym wielkim liście, a z kolei nazywają kleszcza function (), jest sprawdzana przed nim, a nie tego, czy umarł, czy martwy, a następnie są usuwane z listy i z pamięci serwera, odpowiednio.
    • moby Spawn - również jedno działanie. Moby tarło w określonym promieniu od gracza, losowo wybranym punkcie w kawałku, a opiera się na kilku zmian w różnych kierunkach jest zaznaczone, czy jest możliwe, aby umieścić tłum, a on stworzony
    • Gracze przetwarzania - wszystkie pakiety, które są wysyłane do graczy mają być przetwarzane, jest oczywiste.
    • Załadunek i generacja kawałki - jeśli nie jest próbą zablokowania dostępu do fragmentu, który nie istnieje w pamięci fragment musi być ładowane z dysku, jeśli nie znajduje się na dysku, to musi być generowane. Nie trzeba wyjaśniać, że dysk twardy jest prawie zawsze wąskie gardło. Generacja kawałek bardziej skomplikowany niż załadowaniem.
    • Zapisywanie Chunk - zachowując ogólny serwer lub po prostu gdy kawałek nie był używany przez dłuższy czas i może być rozładowywane, gdy kawałki trzeba zapisać na dysku - przekonwertować do strumienia i zapisać do pliku.
    Czytaj więcej:   TWORZENIE DVD-Video na DVD LAB PRO PROGRAMU

    Wydawałoby się, że wszystko jest w porządku i nie ma nic karnego, wszystko zrobione całkiem dobrze i nie mam nic do dodania. Problem polega na tym: wszystko to są przetwarzane w tym samym nurcie . Najnowsze wersje Mojang czytać trochę o gwintowanych kawałki i kawałki nauczyli się zapisać na dysku w oddzielnym wątku. Na pewno jest to przełom, bo to był kawał gardłem, dawno temu serwer utrzymuje się przez 15 minut iw tym czasie całkowicie wiszący, a teraz nie ma takiego. Jednak problem nie jest rozwiązany.

    Można zapytać, co to za problem? Aż zrobić: główny logiki aplikacji w jednym strumieniu, to jest bardzo wygodne do programu, nie trzeba się martwić o synchronizacji i inne problemy aplikacji równoległych. Problem polega na tym, że jeśli serwer ma więcej niż 40 osób, to ma już 15 lat, kiedy 70 osób zamiast standardowych 20 cykli, potem 10, czy 100 - wtedy zwisa do niesamowitej wartości. Dzieje się tak pomimo faktu, że rzeczywiście potężny 6-rdzeniowy Core i7 i 64GB pamięci RAM! I gdzie mam zamiar umieścić te zasoby, jeśli 12 jest zajęta na mocy tych dwóch?

    Nie rant, dam przykład:
    Na serwerze 223 odtwarzacza zasięg wzroku jest wybierany na tyle mała pamięć jest 46577 kawałki 524 „pilne” blokowe 87 Redstone i tłoki blokuje 11240 Entity Objects, 4274 Podmiot animals 19 wózków i łodzi 717 inny podmiot, gracze, którzy są również jednostki i zastosować odpowiednie leczenie.
    Liczba płytek i światła aktualizować mój serwer nie wyświetla informacje (nie muszę go), ale można go, wiele z nich wierzy.

    Sam traktowanie zwierząt strasznie trudny proces - regularnie wykonywać wyszukiwarki Pathfinding inny podmiot wokół, mają AI (w nowszych wersjach dość zaawansowany), a więc procesu 4000 zwierząt - mają dużo pracy.

    Czytaj więcej:   niedalekiej LOCK dla Mac

    Bypass 3 miliony jednostek (z grubsza przetwarzane losowych bloków z ilością kawałków) - nie jest zadaniem trywialnym.

    11 tysięcy pozycji trzeba przenieść, czy jakieś inne działania, wysyłać aktualizacje na ich sytuację graczy i tak dalej.

    I to wszystko, czego potrzebujesz do zrobienia w ciągu 50 milisekund, inaczej zacznie zwalniać, bo stawka jest obliczana w cyklach. Jeśli serwer sprawia mniej cykli na sekundę niż powinien, a następnie, na przykład, moby zaczynają chodzić powoli i gwałtownie. Plus obliczenia w cyklach jest oczywista - jeśli serwer podvisnet lub nie będzie ogromny zbiór śmieci (serwer bo w Javie), to nie będzie działać, tak że wózek jedzie z pełną prędkością w następnym cyklu zamieni się w szybko zmieniającym się małym przedmiotem, i konieczne jest, aby obliczyć swój projekt złożone algorytmy.

    Jednocześnie istnieje również Bukkit!
    Bukkit - jest to „wrapper” dla serwera waniliowym. Dodaje API do tworzenia wtyczek jest super wygodny dla rozwoju wtyczek i zrobić naprawdę wysoką jakość. Ale, z grubsza rzecz biorąc, sytuacja się pogorszy. Jeśli gracz wysyła pakiet, przeniósł się trochę i odwrócił głowę ... i stworzył wydarzenie zostanie wysłana do wszystkich wtyczek, które je obsługują. I podczas gdy funkcji przetwarzania ruch i tak jest dość skomplikowana. Kiedy jednostka Lohmann czy instalacja jest taka sama, jak w stu innych działań, które tworzy odtwarzacza lub samego serwera, w tym macha ręką, zmiana statusu Redstone, przepływ wody, tarło moby, AI, tysiące z nich ... To znaczy, jak to było, system jest dobry, ale tworzy kilka dodatkowych połączeń w przetwarzaniu wszystkich.

    Na szczęście, niektórzy deweloperzy nauczyli się wyciągnąć wtyczkę twardą logiką swoich wtyczek w osobnym wątku. Jasne i dobrymi przykładami są OreObfuscator i Dynmap wtyczek. Pierwszy „czysty” gracz wysłał dodatkowych bloków danych, które gracz nie da się oszukać patrzeć przez ściany. Czyni to w osobnym wątku, dodając pakiety do kolejki i przetwarza je oddzielnie od logiki serwera. Drugi generuje dynamiczny przeglądarki map również bardzo wysokiej jakości jest wykonany. W ogóle, chwalę się do nich, że nie załadować główny przepływ silniej.

    Istnieje również plug-in, który zmniejsza ilość rzeczy, które procesy serwera na cykl. Skupia szereg elementów bazowych rozładowuje moby ogranicza kawałki przetwarzania. To bardzo fajne, żaden serwer nie może obejść się bez tej wtyczki - NoLagg.

    Jak zrobić dobry uczynek (moim zdaniem)
    Od dawna cierpiał z tego wszystkiego, kiedy pół roku temu, nasz on-line wzrosła do 100, a prędkość spadł do 0,5-1 cykli na sekundę. Staraliśmy się zrobić serwer optymalizacji edytować kod, starając się usunąć jak najwięcej nadmiar, zmieniła się w niektórych miejscach nie pracują w cyklach iw kilka sekund (na przykład w piecu. Na Bukkit jest wtedy również dodać ... w ciągu kilku miesięcy). W końcu dotarliśmy do strasznych niestabilność serwera i postanowił pluć na wszystko.

    Czytaj więcej:   pliki wyjściowe PHP w zmiennej

    Jedynym rozwiązaniem, które może dostarczyć nam z wygodnymi internetowych tak wielu graczy, co chcieliśmy był skalowalny serwer. Nie sądzę, muszę wyjaśnić, że przepływ z istotą procesu nie jest skalowalny, może działać tylko na jednym procesorze lokalnym jednocześnie, a jej wydajność jest ograniczona przez wydajność rdzenia. Rdzeń w procesorze jest teraz całkiem wydajne, ale również dużo pracy i sprawiają, wielordzeniowe procesory dzisiaj nie jest czas, aby zrobić coś wielowątkowe.

    Podzielić istniejącego serwera do wielu strumieni nie jest możliwe. Wielowątkowe programowanie - kawałek cienki, złożona, wymagająca dużej wiedzy kodu z którym do pracy, a także w istniejącej aplikacji prawie zbudowany. Kod powinien być napisany od podstaw.

    Tak narodził serwer, na podstawie którego zostało ustanowione tyle przepływy: świat jest podzielony na kawałki 64x64 kawałki i każdy kawałek przetwarza kawałki w jeden strumień, jeden potok przetwarzania pilne bloki, jeden strumień do Redstone i tłoków, jednego strumienia dla mobov, jeden strumień obiektów, jeden strumień do samochodów ciężarowych, jeden wątek obsługuje inny podmiot oraz inne informacje o świecie, jeden strumień przetwarza światło, czterech wątków w różnych częściach świata, ocalić świat na płycie, pojedyncza karta strumień renderuje promocje strumieniowych z utrzymaniem serwerów i Koman Dr statystyki aktualizacje konsoli. Dla graczy używanych system, który umożliwia przetwarzanie pakietów umieszczone na osobnym wątku dla każdego gracza, lub na basenie wątku, albo na oddzielne strumienie dla każdego gracza. W tym przypadku, wszystkie mogą być podzielone na kilka strumieni: jednego do ten sam typ przedmiotów co najmniej 20 różnych nitek. A także Netty (NIO) jako silniku sieciowym, w przeciwieństwie do standardowych I / O.

    Opracowanie stabilnej wersji serwera, który nie posiada wszystkie funkcje, kosztują około 8 miesiącach pracy mam jedną bez posiadania doświadczenia. Cały kod jest przeznaczony do asynchronicznego dostępu do wszystkich danych. Ale było warto - mamy niedawno ustanowił rekord na 559 osób, które nie stój w jednym miejscu, Laga i wystąpił w Fraps, przeszedł bardzo dużą imprezę z Redstone, a jednocześnie czuć się komfortowo.

    Morał z tej historii jest taki: jeśli można oczekiwać, że projekt będzie w żaden sposób popularny i pomyśleć trochę teoretycznie jest możliwe, że serwer będzie w żaden sposób wiele osób ... nie są skąpi na utworzenie skalowalnej architekturze.

    Czekam na wasze zgniłych pomidorów, sugestie dotyczące poprawy tego artykułu, jak również sugestie dotyczące tego, co chcesz zobaczyć w następnym artykule, który kiedykolwiek będzie.

    myśli strumień może zawierać błędów ortograficznych, ponieważ Jest napisany w tym samym oddechu.

    ZDECYDOWANE - Jeśli dostęp do serwera przez 2 sek gniewu | BUKKIT rosyjski ...


    Wybierz swój język

    polskiangielski niemiecki hiszpański francuski włoski portugalski turecki arabski ukraiński szwedzki węgierski bułgarski estoński Chiński (uproszczony) wietnamski rumuński tajski słoweński słowacki serbski malajski norweski łotewski litewski koreański japoński indonezyjski hinduski hebrajski fiński grecki holenderski Czech duński chorwacki Chiński (tradycyjny) Filipińska urdu Azeybardzhansky ormiański Białoruski bengalski gruziński kazachski Kataloński mongolski rosyjski Tadzhitsky Tamil'skij telugu Uzbetsky


    Dodaj komentarz

    Twój e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *