THE ORB
Uruchamiam studio

Limit tempa state bagów / state bagi się nie replikują

Skrypt aktualizuje współdzielone informacje o wiele za często, więc część tych aktualizacji jest wyrzucana.

groupsWartości wyglądają źle albo są spóźnionecodePotrzebny programista

Zrób najpierw to

Tu potrzebna jest zmiana w skrypcie — powinien aktualizować, gdy coś się zmienia, a nie bez przerwy.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

State bagi mają limit tempa na encję. Zapis szybszy niż limit oznacza, że aktualizacje są porzucane, dławione, a w złych przypadkach serwer spędza cały czas na replikacji. Nic nie zgłasza błędu — wartość po prostu nie dociera na klienta albo dociera z opóźnieniem.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Zapis state baga w każdym ticku

    Limit istnieje dokładnie po to, żeby to powstrzymać. Paliwo, prędkość i pozycja zapisywane w każdej klatce będą dławione.

  2. 2

    Bardzo duże wartości

    Cały ekwipunek w state bagu jest replikowany do każdego w zasięgu przy każdej zmianie. Dane tej wielkości przy dowolnej częstotliwości to problem.

  3. 3

    Wiele bagów na jednej encji

    Kilkadziesiąt kluczy na tej samej encji, każdy replikowany osobno.

  4. 4

    Replikowane, choć nie musiało być

    :set(key, value, true) replikuje. Stan wyłącznie lokalny powinien przekazywać false.

  5. 5

    Odczyt baga na kliencie, który nie widzi encji

    Poza zasięgiem znaczy brak baga. To nie limit tempa, ale ten sam objaw "wartości tam nie ma".

Jak poznać, który jest twój

Zapisz raz i odczytaj: jeśli pojedynczy zapis dociera, a pętla zapisów nie, chodzi o limit tempa. Jeśli nie dociera żaden, encja jest poza zasięgiem.

Gdzie szukać

Każde .state:set w zasobie i to, jak często się wykonuje.

Jak to naprawić

Zapisuj tylko przy zmianie i tylko to, co musi przejść przez sieć:

local last
CreateThread(function()
    while true do
        Wait(1000)                          -- nie 0
        local fuel = math.floor(GetFuel(veh))
        if fuel ~= last then                -- tylko przy zmianie
            last = fuel
            Entity(veh).state:set('fuel', fuel, true)
        end
    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 Skaner bezpieczeństwa oznacza obsługę zdarzeń, która do tego prowadzi.

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