Надежное переполнение сетевого события в FiveM: найдите скрипт и исправьте это
Игроки выкинуты с Reliable network event overflow? Скрипт отправляет слишком много данных события. Найдите ресурс, уменьшите полезные нагрузки, используйте latent события и state bags.
Игрок выбрасывается с сервера или весь сервер начинает истекает время, с сообщением вроде этого:
Reliable network event overflowFiveM держит ограниченную очередь надежных сетевых событий для каждого соединения. Когда скрипт заполняет её быстрее, чем соединение может отправить, игрок выпадает. Причина почти всегда один ресурс. Вот как его найти и исправить.
Что происходит
Каждый TriggerClientEvent и TriggerServerEvent — это надежное сообщение: оно должно прибыть, в порядке. Если вы отправляете много из них или очень большие, очередь для этого игрока растет. Когда она переполняется, соединение разрывается.
Обычные паттерны:
- Большая таблица, отправленная в одном событии: полный список транспортных средств, предметов, игроков или весь конфиг.
- Цикл, который инициирует событие на каждом тике или каждые несколько миллисекунд.
- Событие, отправленное всем (
-1) много раз в секунду. - Скрипт, который отправляет те же данные снова и снова, когда они не изменились.
-- bad: sends everything, to everyone, every 100 ms
CreateThread(function()
while true do
Wait(100)
TriggerClientEvent('myscript:update', -1, GetAllData())
end
end)Найдите ресурс
Сообщение об ошибке не называет скрипт, поэтому вы должны измерить.
- Посмотрите на консоль сервера примерно в момент выбросов. Много одинаковых имен событий или ресурс, который начался непосредственно перед проблемами, — это подсказка.
- Используйте профилировщик. Встроенный профилировщик записывает короткую сессию и позволяет вам открыть её в средстве просмотра. В консоли сервера:
profiler record 500
profiler viewПроверьте точные команды для вашей сборки сервера, так как они могут изменяться между версиями. Запись показывает, какие ресурсы и события требуют времени и помогает вам определить тяжелый.
- Остановите ресурсы один за другим на тестовом сервере. Если выбросы прекращаются после остановки ресурса, вы нашли его.
- Поищите в коде
TriggerClientEventиTriggerServerEventвнутри циклов и события, отправленные с-1.
Совет: проблема часто начинается после того, как вы добавляете новый скрипт или после обновления скрипта. Сначала проверьте, что изменилось.
Исправление 1: отправляйте меньшие полезные нагрузки
Отправьте только то, что изменилось, а не весь набор данных.
-- bad: the whole table
TriggerClientEvent('shop:sync', src, allShops)
-- better: only the changed entry
TriggerClientEvent('shop:updateOne', src, shopId, shops[shopId])Удалите поля, которые клиенту не нужны, отправляйте ids вместо целых объектов и позвольте клиенту запросить детали, когда ему это нужно.
Исправление 2: отправляйте реже
Инициируйте события, когда что-то происходит, а не на таймере. Если вам нужен таймер, сделайте его медленнее и пропустите его, когда ничего не изменилось.
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)Отправляйте игрокам, которым это нужно, а не на -1, когда заботятся только некоторые игроки.
Исправление 3: latent события для больших данных
Когда вы действительно должны отправить много данных, такие как большой конфиг или изображение, используйте latent событие. Оно отправляет данные в фоне с установленной вами скоростью в байтах в секунду, вместо заполнения нормальной очереди.
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)-- client -> server
TriggerLatentServerEvent('myscript:bigData', 50000, bigTable)Событие прибывает позже, поэтому используйте её только для данных, которые не зависят от времени. Выберите скорость, которая не насыщает соединение игрока.
Исправление 4: state bags для общего состояния
Если данные — это состояние сущности или игрока (флаг, значение, статус), state bag часто лучше, чем события. FiveM репликирует изменения для вас и отправляет только то, что изменилось.
-- server
Player(src).state:set('isCuffed', true, true)
-- client, anywhere
local cuffed = LocalPlayer.state.isCuffedState bags предназначены для малых значений, а не для больших таблиц. Прочитайте FiveM state bags объяснено как они работают и Client и server события в FiveM для основ событий.
Если вы не можете отредактировать скрипт
Если скрипт — это платный или защищенный ресурс, вы не можете изменять его код. Сообщите о проблеме автору с результатом профилировщика и временем выбросов. Они будут знать, какое событие слишком большое. До тех пор, остановка ресурса или снижение его частоты обновления в его конфиге, если он у него есть, является единственным обходным путем.
Контрольный список
| Симптом | Исправление |
|---|---|
Выброс Reliable network event overflow |
Найдите скрипт, который отправляет слишком много данных |
| Выбросы начались после добавления скрипта | Остановите этот ресурс и тестируйте снова |
| Большая таблица в одном событии | Отправляйте только измененные данные или ids |
| Событие в быстром цикле | Отправляйте при изменении, замедлите таймер |
Событие, отправленное на -1 постоянно |
Отправляйте игрокам, которым это нужно |
| Большая полезная нагрузка, которая не срочна | TriggerLatentClientEvent или TriggerLatentServerEvent |
| Состояние сущности или игрока | Используйте state bags |
Короткие ответы
Что вызывает Reliable network event overflow?
Ресурс отправляет события быстрее или с большим количеством данных, чем соединение может доставить. Большие таблицы, отправленные в одном событии, или цикл, который инициирует события каждые несколько миллисекунд, являются обычными причинами.
Вызывается ли Reliable network event overflow слишком большим количеством игроков?
Не напрямую. Больше игроков делает это более вероятным, потому что скрипт, который отправляет всем, умножает трафик. Причина все еще ресурс, который отправляет слишком много данных.
Что такое latent событие?
Latent событие отправляет свои данные в фоне с выбранной вами скоростью, поэтому оно не засоряет нормальную очередь события. Используйте её для больших полезных нагрузок, которые не срочны.
Скрипты без этой проблемы
Mic PhoneСкладной телефон, который раскладывается в планшет и работает и на настоящем телефоне игрока.Смотреть скрипт →
CCTV Security CamerasУстанавливаемые камеры, планшет с мультиэкраном в реальном времени и распечатанные фото-улики.Смотреть скрипт →
Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →