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.
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:
Rozwiązanie błędu:
Implementacja:
📁 Lokalizacja pliku: 'game -> questmanager.cpp'
🔍 Szukaj
➕ Dodaj
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'game -> questmanager.h'
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamEvent.cpp'
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamPhaseGame.cpp'
🔍 Szukaj
➕ Dodaj
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStream.h'
🔍 Szukaj
➕ Dodaj
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'root -> interfacemodule.py'
🔍 Szukaj
➕ Dodaj
📁 Lokalizacja pliku: 'root -> game.py'
🔍 Szukaj
➕ Dodaj
Edytowane przez Sevence
Aktualizacja rozwiązania