Przejdź do głównej zawartości

Naprawa lagów Valheim - modyfikacja limitów wysyłania/odbierania

· 4 min aby przeczytać
Josie
Josie
Moderator
James A. Chambers
Legendary Technology Blog

Objawy lagów na serwerach dedykowanych Valheim

Sytuacje doświadczane na serwerze mogą pomóc odnaleźć typ laga, którego doświadczamy i co może go powodować. Na przykład lagi spowodowane zbyt dużym obciążeniem procesora będą miały inne objawy niż opóźnienia spowodowane osiągnięciem przez serwer maksymalnego limitu wysyłania/odbierania.

Zdecydowanie najczęstszym rodzajem lagów serwerów dedykowanych Valheim do tej pory był głównie niski limit wysyłania/odbierania 64KB/s, który jest na stałe zakodowany w serwerze. Oznacza to, że gdy przykładowo przenosimy swoją postać do gęsto zaludnionego obszaru na serwerze, musi on wysłać wszystkie informacje o wszystkich budynkach/graczach przez sztucznie ograniczony, bardzo wąski przewód o przepustowości 64 KB/s.

Objawy lagów typu limit wysyłania/odbierania obejmują takie rzeczy jak skrzynie otwierające się bardzo długo, czasami parenaście sekund lub nigdy się nie otwierające, podczas gdy w tym samym czasie gracze mogą normalnie chodzić. Dzieje się tak, ponieważ pozycje X / Y / Z innych osób to bardzo mała ilość danych w porównaniu do wszystkich przedmiotów / nazw / atrybutów przechowywanych w skrzyni.

Innym często obserwowanym źródłem lagów jest manipulacja terenem. Pomyślmy o oryginalnym terenie jako o jednym dużym kawałku w plikach gry. Valheim ma funkcję, która pozwala modyfikować teren, podnosząc go / obniżając / poziomując itp. Przy każdej edycji terenu gra zapisuje to, co zostało wykonane jako nową modyfikację. Najlepszym sposobem na uniknięcie tych lagów jest ograniczenie modyfikacji terenu w pobliżu bazy.

Modyfikowanie limitu wysyłania/odbierania na serwerze

Jedynym sposobem na zmianę limitu wysyłania/odbierania jest modyfikacja kodu serwera i ponowna kompilacja modułu, który to kontroluje. Upewnij się, że wykonałeś kopię zapasową wszystkiego (zwłaszcza plików świata gry), zanim spróbujesz czegokolwiek! Należy też pamiętać, że nieuniknionym będzie wprowadzać zmiany ponownie przy każdej aktualizacji, ponieważ plik, który zamierzamy zmodyfikować, zostanie zastąpiony przez aktualizacje.

  1. Pobierz narzędzie dnSpy

Pobierz dnSpy-net-win64.zip z oficjalnego repozytorium GitHub.

Użyjemy narzędzia dnSpy do modyfikacji kodu serwera i ponownej kompilacji modułu. Rozpakowujemy folder i uruchamiamy program dnSpy.exe. Otworzy się aplikacja dnSpy.

  1. Modyfikowanie serwera za pomocą dnSpy

W aplikacji przechodzimy do File w lewym górnym rogu i wybieramy Open: dnSpy GUI

Przechodzimy do folderu serwera dedykowanego Valheim, szukamy pliku assembly_valheim.dll w folderze valheim_server_Data\Managed: assembly_valheim.dll file in Managed catalog

Wybieramy plik assembly_valheim.dll i klikamy Otwórz. Zostanie on załadowany do dnSpy.

Po zakończeniu ładowania przechodzimy do menu Edit w dnSpy i klikamy Search Assemblies: dnSpy Edit dropdown menu

W wyszukiwarce wpisujemy ZDOMan: dnSpy Searching for ZDOMan

Po zakończeniu wyszukiwania powinna pojawić się lista wyników podobna do przedstawionej na zdjęciu powyżej. Podwójne kliknięcie jednego z tych wpisów na liście powinno spowodować przejście do sekcji ZDOMan: dnSpy ZDOMan section of assembly

W tym miejscu wprowadzamy zmiany. Musimy tylko zlokalizować wiersz, który ma ograniczenie wysyłania/odbierania. Aby to znaleźć, naciskamy Ctrl + F, aby wyświetlić pole wyszukiwania i szukamy:

sendQueueSize

co powinno spowodować wyświetlenie następujących wierszy: dnSpy - sendQueueSize Variable

Teraz klikamy ten wiersz prawym przyciskiem myszy:

int num = 10240 – sendQueueSize

Klikamy Edit Method (C#).... Otworzy się kolejne okno umożliwiające wprowadzenie zmian w pliku. Zamierzamy zmodyfikować 10240 na wybraną przez nas zmienną. Zalecamy zmianę na 30720, ponieważ zapewni świetną wydajność.

Istnieją dwie instancje tej zmiennej. Druga instancja znajduje się 3 wiersze powyżej podświetlonego wiersza, którego szukaliśmy:

if (!flush && sendQueueSize > 10240)

Zmodyfikuj obie instancje 10240 na 30720.

warning

Ustawienie zbyt wysokiego limitu może spowodować, że serwer przeciąży połączenie internetowe, jeśli mamy dużą liczbę graczy.

Po zmianie obu liczb na żądaną wartość musimy nacisnąć przycisk Compile w prawym dolnym rogu nowego okna. Okno zostanie zamknięte i nastąpi powrót do poprzedniego.

  1. Zapisywanie nowego assembly Nadszedł czas, aby zapisać nasze zmiany w nowym pliku .dll. Wybieramy File -> Save Module…: save assembly

Zmieniamy nazwę pliku na assembly_valheim_modded.dll. Nie nadpisujemy oryginalnego pliku, ponieważ będziemy chcieli wykonać kopię zapasową i upewnić się, że serwer jest wyłączony, zanim to zrobimy. Naciskamy „OK”, aby zapisać nowy plik assembly_valheim_modded.dll.

  1. Utworzenie kopii zapasowej oryginalnego pliku i zastąpienie go nowym Wykonujemy kopię zapasową oryginalnego pliku i zastąpiamy go naszym nowym zmodyfikowanym plikiem. Najpierw upewniamy się, że serwer dedykowany jest wyłączony, w przeciwnym razie plik dll będzie w użyciu. Jest to również dobry moment na zrobienie kopii zapasowej pliku świata.

Wrzucamy nasz nowy plik na serwer do folderu valheim_server_Data\Managed.

Najpierw zmienimy nazwę pliku assembly_valheim.dll na inną aby zachować to jak backup. Wybieramy plik i klikamy Rename, możemy zmodyfikować nazwę dodając np. .backupo valheim_assembly.dll.backup. W ten sposób pozstawiamy oryginalny nie naruszony plik. rename tosthost

Zmodyfikowany wcześniej plik w dnSpy valheim_assembly_modded.dll potrzebuje teraz oryginalnej nazwy czyli valheim_assembly.dll.

Stary plik został zastąpiony nowym. Uruchamiamy serwer normalnie, a zmiany zaczną obowiązywać.

Jeżeli serwer uruchomił się poprwanie i można na niego dołaczyć oznacza to, że modyfikacja została przeprowadzona pomyślnie.

Nie radzisz sobię lub coś ci nie wychodzi? Stwórz wątek na forum.

wskazówka

Pamiętaj, że dla bezpieczeństwa możesz wykonać backup całego serwera w zakładce Backups.

Źródło: https://jamesachambers.com/revisiting-fixing-valheim-lag-modifying-send-receive-limits/