Opublikowano 21 Października 20232 l 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 Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto ➕ 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
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto