Reliable network event overflow w FiveM: znajdź skrypt i napraw to

Gracze wyrzuceni z Reliable network event overflow? Skrypt wysyła zbyt dużo danych zdarzenia. Znajdź zasób, zmniejsz ładunki, używaj zdarzeń latent i state bags.

Gracz jest wyrzucony z serwera, lub cały serwer zaczyna się timeout'ować, z wiadomością takiej:

text
Reliable network event overflow

FiveM utrzymuje ograniczoną kolejkę niezawodnych zdarzeń sieciowych dla każdego połączenia. Gdy skrypt ją wypełnia szybciej, niż połączenie może wysłać, gracz jest wyrzucony. Przyczyna jest prawie zawsze jeden zasób. Oto jak go znaleźć i naprawić.

Co się dzieje

Każdy TriggerClientEvent i TriggerServerEvent jest niezawodną wiadomością: musi dotrzeć, w porządku. Jeśli wysyłasz wiele z nich, lub bardzo duże, kolejka dla tego gracza rośnie. Gdy się przepełni, połączenie jest odcięte.

Typowe wzory:

  • Duża tabela wysłana w jednym zdarzeniu: pełna lista pojazdów, przedmiotów, graczy, lub cała konfiguracja.
  • Pętla wyzwalająca zdarzenie na każdym takcie lub co kilka milisekund.
  • Zdarzenie wysłane do wszystkich (-1) wiele razy na sekundę.
  • Skrypt wysyłający te same dane raz za razem, gdy się nie zmieniły.
lua
-- bad: sends everything, to everyone, every 100 ms
CreateThread(function()
    while true do
        Wait(100)
        TriggerClientEvent('myscript:update', -1, GetAllData())
    end
end)

Znajdź zasób

Wiadomość o błędzie nie wymienia skryptu, więc musisz zmierzyć.

  1. Spójrz na konsolę serwera wokół czasu wyrzuceń. Wiele identycznych nazw zdarzeń, lub zasób, który uruchomił się tuż przed problemami, to wskazówka.
  2. Użyj profiler. Wbudowany profiler rejestruje krótką sesję i pozwala ci otworzyć ją w przeglądarce. W konsoli serwera:
text
profiler record 500
profiler view

Sprawdzaj dokładne komendy dla kompilacji serwera, ponieważ mogą się zmieniać między wersjami. Nagranie pokazuje, które zasoby i zdarzenia zabierają czas, i pomaga ci znaleźć ciężki.

  1. Zatrzymaj zasoby jeden po drugim na serwerze testowym. Jeśli wyrzucenia się zatrzymają po zatrzymaniu zasobu, go znalazłeś.
  2. Przeszukaj kod dla TriggerClientEvent i TriggerServerEvent wewnątrz pętli, i dla zdarzeń wysłanych z -1.

Wskazówka: problem często zaczyna się po dodaniu nowego skryptu, lub po aktualizacji skryptu. Sprawdzaj co się zmieniło najpierw.

Naprawa 1: wyślij mniejsze ładunki

Wyślij tylko to co się zmieniło, nie cały zestaw danych.

lua
-- bad: the whole table
TriggerClientEvent('shop:sync', src, allShops)

-- better: only the changed entry
TriggerClientEvent('shop:updateOne', src, shopId, shops[shopId])

Usuwaj pola, których klient nie potrzebuje, wysyłaj id zamiast całych obiektów, i pozwól klientowi żądać szczegóły, gdy ich potrzebuje.

Naprawa 2: wysyłaj rzadziej

Wyzwalaj zdarzenia, gdy coś się dzieje, nie na czasomierz. Jeśli potrzebujesz czasomierza, spowolnij go i pomiń, gdy nic się nie zmieniło.

lua
local last = nil

CreateThread(function()
    while true do
        Wait(2000)
        local data = GetData()
        if data ~= last then
            last = data
            TriggerClientEvent('myscript:update', -1, data)
        end
    end
end)

Wysyłaj do graczy, którzy tego potrzebują, nie do -1, gdy tylko niektórzy gracze się martwią.

Naprawa 3: zdarzenia latent dla dużych danych

Gdy naprawdę musisz wysłać dużo danych, takie jak duża konfiguracja lub obraz, użyj zdarzenia latent. Wysyła dane w tle z prędkością, którą ustawiasz, w bajtach na sekundę, zamiast wypełniać normalną kolejkę.

lua
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)
lua
-- client -> server
TriggerLatentServerEvent('myscript:bigData', 50000, bigTable)

Zdarzenie dotrze później, więc użyj go tylko dla danych, które nie są czasowe. Wybierz prędkość, która nie nasycą połączenie gracza.

Naprawa 4: state bags dla współdzielonego stanu

Jeśli dane są stanem encji lub gracza (flaga, wartość, status), state bag jest często lepszy niż zdarzenia. FiveM replikuje zmiany za ciebie, i wysyła tylko to co się zmieniło.

lua
-- server
Player(src).state:set('isCuffed', true, true)

-- client, anywhere
local cuffed = LocalPlayer.state.isCuffed

State bags są dla małych wartości, nie dla dużych tabel. Przeczytaj FiveM state bags wyjaśnione, aby zrozumieć, jak działają, i Client i server zdarzenia w FiveM dla podstaw zdarzeń.

Jeśli nie możesz edytować skryptu

Jeśli skrypt jest płatnym lub chronionym zasobem, nie możesz zmienić jego kod. Zgłoś problem autorowi z rezultatem profiler i czasem wyrzuceń. Będą wiedzieć, które zdarzenie jest zbyt duże. Do tej pory, zatrzymanie zasobu lub obniżenie jego współczynnika odświeżania w jego konfiguracji, jeśli je ma, to jedyne obejście.

Lista kontrolna

Symptom Naprawa
Reliable network event overflow wyrzucenie Znajdź skrypt wysyłający zbyt dużo danych
Wyrzucenia zaczęły się po dodaniu skryptu Zatrzymaj ten zasób i testuj ponownie
Duża tabela w jednym zdarzeniu Wysyłaj tylko zmienione dane lub id
Zdarzenie w szybkiej pętli Wysyłaj na zmianę, spowolnij czasomierz
Zdarzenie wysłane do -1 stale Wysyłaj do graczy, którzy tego potrzebują
Duży ładunek, który nie jest pilny TriggerLatentClientEvent lub TriggerLatentServerEvent
Stan encji lub gracza Używaj state bags

Szybkie odpowiedzi

Co powoduje Reliable network event overflow?

Zasób wysyła zdarzenia szybciej lub z większą liczbą danych niż połączenie może dostarczyć. Duże tabele wysyłane w jednym zdarzeniu, lub pętla, która wyzwala zdarzenia co kilka milisekund, są typowymi przyczynami.

Czy Reliable network event overflow jest spowodowany zbyt wieloma graczami?

Nie bezpośrednio. Więcej graczy sprawia, że jest bardziej prawdopodobne, ponieważ skrypt wysyłający do wszystkich mnoży ruch. Przyczyna wciąż jest zasób, który wysyła zbyt dużo danych.

Czym jest zdarzenie latent?

Zdarzenie latent wysyła swoje dane w tle z prędkością, którą wybierzesz, więc nie załamuje normalnej kolejki zdarzeń. Używaj go dla dużych ładunków, które nie są pilne.

Skrypty bez tego problemu

Mic PhoneSkładany telefon, który rozkłada się w tablet i działa też na prawdziwym telefonie gracza.Zobacz skrypt →CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →

Czytaj dalej