Назад к блогу
Tutorial2 мин чтения

Оптимизация скриптов FiveM: Сократите resmon, сохраняйте плавный FPS

Оптимизируйте скрипты FiveM для высокого FPS и низкой нагрузки resmon. Используются циклы, многопоточность, NUI, события и настоящие приёмы профилирования, применяемые ведущими серверами с фокусом на производительность.

Agency Scripts

Основатель и ведущий разработчик Agency Scripts

Понимание Resmon и производительности скриптов

Параметр resmon команда в FiveM отображает в реальном времени показатели производительности ресурсов, показывая, сколько миллисекунд каждый скрипт потребляет за тик сервера. Хорошо оптимизированный скрипт должен показывать 0.00 мс в resmon большую часть времени, с кратковременными пиками только при активной обработке событий. Скрипты с постоянно высокими значениями resmon ухудшают производительность сервера, увеличивают рассинхронизацию игроков и могут вызывать неприятные лаги сервера, отпугивающие сообщества. Регулярный профилинг скриптов , первый шаг к поддержанию плавной работы сервера.

Управление потоками и время ожидания

Главный убийца производительности в скриптах FiveM , неправильное управление потоками. Использование Citizen.Wait(0) внутри цикла означает, что ваш код выполняется каждый кадр, что примерно 60 раз в секунду. Большинству задач не нужна такая частота. Увеличьте время ожидания до Wait(500) или Wait(1000) для проверок, которые нужно выполнять периодически, например, обнаружение близости маркеров или проверка зон. Для систем на основе расстояния используйте многоуровневый подход: проверяйте с большими интервалами, когда далеко от точек интереса, и с меньшими, когда рядом.

Отключение ненужных потоков

Вместо постоянного запуска потоков рассмотрите возможность их активации только при необходимости. Используйте события или изменения состояния для запуска и остановки циклов обработки. Например, скрипт рыбалки не должен запускать цикл заброса, когда игрок не находится рядом с водой. Отслеживайте переменную активного состояния и выходите из потока с помощью return когда функция не используется. Этот шаблон может снизить нагрузку вашего скрипта с постоянных 0.50 мс до 0.00 мс в периоды простоя, что является разницей между скриптом, который масштабируется, и тем, который тормозит ваш сервер.

Кэширование и избежание избыточных вызовов

Вызовы нативных функций в FiveM имеют накладные расходы, особенно при повторных вызовах в тесных циклах. Кэшируйте результаты вызовов, таких как GetEntityCoords, GetPlayerPed , и GetPlayerServerId в начале вашей итерации цикла, а не вызывайте их несколько раз за один цикл. Сохраняйте статичные данные, такие как значения конфигурации, позиции маркеров и координаты blip, в локальные переменные при загрузке скрипта. Эта простая техника может значительно сократить время выполнения скрипта и является одним из самых эффективных оптимизаций.

Математические оптимизации

Расчёты расстояний , одни из самых распространённых операций в скриптах FiveM. Замените стандартный #(coords1 - coords2) проверка расстояния с использованием сравнения квадратов расстояний, когда вам нужна только относительная дистанция. Поскольку вычисление квадратного корня дорогостоящее, сравнение квадратов расстояний с квадратами порогов дает тот же результат без затратной математической операции. Кроме того, избегайте вызова GetDistanceBetweenCoords native, когда можно вычислить расстояние на Lua, так как вызовы native несут дополнительную нагрузку по сравнению с чистыми операциями Lua.

Управление сущностями и метками

Создание сущностей, blips и маркеров имеет как затраты на рендеринг, так и на сеть. Удаляйте blips и сущности, когда они больше не нужны, вместо того чтобы оставлять их в игровом мире. Используйте DrawMarker только когда игрок находится в пределах расстояния рендеринга, а не глобально по всей карте. Для скриптов, управляющих множеством сущностей, реализуйте пространственное разбиение, чтобы обрабатывать только близлежащие объекты. Рассмотрите возможность использования стриминговых систем, которые создают и уничтожают сущности в зависимости от близости игрока, а не загружают всё сразу при запуске ресурса.

Готовы начать?

Возьмите скрипты в нашем магазине или заходите в Discord за поддержкой, обновлениями и анонсами.