THE ORB
Uruchamiam studio

hitch warning (skok czasu klatki)

Coś na moment zamroziło serwer. Gracze czują to jako przycięcie. To objaw, a nie awaria.

groupsPrzycięcia i skoki lagówcodePotrzebny programista

Zrób najpierw to

Kilka przy starcie jest normalnych. Ciągłe w trakcie gry znaczą, że trzeba przyjrzeć się jakiemuś skryptowi.

bug_reportWklej zamiast tego całą konsolę

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. 1

    Synchroniczne zapytanie do bazy na serwerze

    Cały tick czeka na MySQL. Brakujący indeks zamienia to z niewidocznego w kilkaset milisekund.

  2. 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. 3

    Ciasna pętla bez Waita

    while true do ... end bez oddania sterowania blokuje scheduler, dopóki się nie skończy.

  4. 4

    Strumieniowanie wielu zasobów naraz

    Żądanie wielu modeli albo słowników animacji w tej samej klatce.

  5. 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 Fixer

Dla tego rodzaju błędu Script Optimizer znajduje to, co kosztuje cię klatki, i przepisuje.

Błędy, które chodzą z tym w parze