Skocz do zawartości

Naprawa polecenia 'reload q' powodującego awarię rdzenia gry

Opublikowano

bugfix.webp.0a739ad15af71c44f5367650b6c9e164.webp

 

Witam wszystkim, 🤚

 

Wprowadzenie

Funkcja 'reload q' do przeładowywania wszystkich zadań na serwerze ma krytyczny błąd. Na serwerze testowym możesz nawet nie zauważyć żadnego błędu, ale na serwerze produkcyjnym gdzie jest duża ilość graczy już tak. Gdy gracz będzie miał otworzone zadanie zawierające przycisk i jednocześnie administrator serwera uruchomi polecenie 'reload q' bez wcześniejszego zamknięcia przez gracza okna z zadaniem, rdzeń gry ulegnie awarii po ponownym kliknięciu przycisku przez gracza. 

 

System zadań bazuje na mechanice 'zawieszania i wznowienia'. Oznacza to, że podczas przetwarzania zadania, gdy napotkamy instrukcje wymagające interakcji z graczem, takie jak 'wait()' czy 'select()', przetwarzanie jest chwilowo zawieszone, a aktualny stan zadania zapisywany w dedykowanej zmiennej. Po otrzymaniu odpowiedzi od gracza, przetwarzanie jest wznowione od miejsca, w którym zostało zawieszone.

 

Komplikacje pojawiają przy użyciu komendy 'reload q'. Ta funkcja usuwa wszystkie zadania z pamięci, by następnie wczytuje je ponowie. Konflikt następuje, gdy po tej operacji gracz interaguje z przyciskiem zadania: serwer stara się odtworzyć zawieszony stan zadania za pomocą uprzednio wspomnianej zmiennej. Niestety, zmienna ta pełni funkcję wskaźnika wskazującego na konkretną pozycję w pamięci, gdzie przechowywane są rzeczywiste dane.

 

Z racji operacji przeładowania, te określone miejsca w pamięci stają się niedostępne. Gra, nieświadoma tej zmiany (wskaźnik nadal wskazuje pewną pozycję), dąży do kontynuowania zadania. Konflikt pojawia się, gdy gra próbuje korzystać z danych, do których wskaźnik miał prowadzić, co skutkuje awarią.

 

 

Rozwiązanie:

Aby wyeliminować opisany problem, konieczne jest wyczyszczenie wszystkich wskaźników dla każdego gracza.

 

 

Prezentacja błędu:

Spoiler

 

Rozwiązanie błędu:

Spoiler

 

Implementacja:

📁 Lokalizacja pliku: 'game -> questmanager.cpp'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'game -> questmanager.h'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamEvent.cpp'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamPhaseGame.cpp'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStream.h'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

📁 Lokalizacja pliku: 'root -> interfacemodule.py'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

📁 Lokalizacja pliku: 'root -> game.py'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

Edytowane przez Sevence
Aktualizacja rozwiązania

Featured Replies

Opublikowano

mocne mocne

  • 2 tygodnie później...
Opublikowano

Bardzo przydatna rzecz !

  • 4 tygodnie później...
Opublikowano

💘

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...