hitch warning (skok czasu klatki)
Coś na moment zamroziło serwer. Gracze czują to jako przycięcie. To objaw, a nie awaria.
Zrób najpierw to
Kilka przy starcie jest normalnych. Ciągłe w trakcie gry znaczą, że trzeba przyjrzeć się jakiemuś skryptowi.
Co to znaczy
Coś zablokowało wątek główny na tyle czasu. To NIE jest błąd: nic nie padło i nic się nie wysypało. To środowisko zgłasza, że jedna klatka trwała znacznie dłużej, niż klatka powinna, co gracze czują jako zamrożenie.
Traktuj to jako objaw z doczepioną liczbą. Poniżej mniej więcej 100 ms to zwykle szum ze startu; utrzymujące się zacięcia powyżej 200 ms w normalnej grze to prawdziwy problem.
Co to powoduje
Uszeregowane według tego, jak często są odpowiedzią.
- 1
Synchroniczne zapytanie do bazy na serwerze
Cały tick czeka na MySQL. Brakujący indeks zamienia to z niewidocznego w kilkaset milisekund.
- 2
Ciężka praca przy starcie zasobu
Parsowanie dużej konfiguracji JSON, budowanie wielkiej tablicy, wczytywanie setek propsów. Zacięcia wyłącznie przy starcie są zwykle nieszkodliwe.
- 3
Ciasna pętla bez Waita
while true do ... endbez oddania sterowania blokuje scheduler, dopóki się nie skończy. - 4
Strumieniowanie wielu zasobów naraz
Żądanie wielu modeli albo słowników animacji w tej samej klatce.
- 5
Wolny handler zdarzenia
Zdarzenie odpalające się per gracz, robiące prawdziwą pracę, na pełnym serwerze.
Jak poznać, który jest twój
resmon 1
w konsoli klienta pokazuje CPU per zasób. Na serwerze txAdmin i wbudowany profiler wskazują zasób. Dopasuj moment zacięcia do tego, co się wtedy działo: fala wejść, restart zasobu albo konkretna akcja gracza.
Gdzie szukać
Zasób, na który wskazuje resmon, a potem jego wątki i jego wywołania bazodanowe.
Jak to naprawić
Oddawaj sterowanie w długich pętlach, rób zapytania asynchronicznie i indeksuj to, po czym filtrujesz:
-- blokujące
local rows = MySQL.query.await('SELECT * FROM users')
-- nieblokujące
MySQL.query('SELECT * FROM users WHERE identifier = ?', { id }, function(rows)
-- ...
end)
-- zawsze oddawaj sterowanie
CreateThread(function()
while true do
Wait(500) -- nigdy tego nie pomijaj
end
end)Wciąż utknąłeś na własnym kodzie?
Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.
bug_reportOtwórz Server FixerDla tego rodzaju błędu Script Optimizer znajduje to, co kosztuje cię klatki, i przepisuje.