Skip to content

Основано на ветке jrpm после слияния (включает функции pulsexlb и собственные оптимизации jrpm). Значения параметров по умолчанию взяты из src/table/settings/network_settings.ini, рекомендуется опираться на реальное нагрузочное тестирование.

1. Реализованные оптимизации производительности (данная версия) ​

ОптимизацияКоммитОписание
Настраиваемое количество параллельных загрузок4716b925network.content_download_parallel (по умолч. 4, 1-8): количество одновременно загружаемых файлов, заменяет жёстко заданное 4
Несколько зеркал + файловый параллелизмd4c45740 (F1)network.content_mirrors через запятую, повтор при сбое зеркала, откат к старому протоколу
Совместимость сервера с несколькими версиямиcb9848b7Сервер может одновременно принимать клиенты jrpm / оригинальный jgrpp / pulsexlb

2. Ключевые параметры производительности сервера (система jgrpp) ​

НастройкаПо умолч.ДиапазонЗначениеРекомендации
network.sync_freq1000-100Частота синхронизации кадров (обнаружение desync). Больше = меньше трафика, меньше = раньше обнаружение рассинхронизацииДля стабильности в сети можно снизить до 20-50; при частых desync уменьшать
network.frame_freq00-100Частота отправки кадров команд. Больше = меньше трафика/CPU, но выше задержка операцийОбычно 0-3; на многолюдных серверах до 5, после нагрузочного тестирования
network.commands_per_frame21-65535Лимит команд клиента за кадр (защита от спама/злоумышленников)При большом количестве игроков/частых операциях можно поднять до 4-8
network.commands_per_frame_server161-65535Лимит команд самого сервера за кадрОбычно не требуется изменять
network.bytes_per_frame81-65535Средний лимит байт на кадр (формирование трафика)При хорошем канале можно поднять до 16-32, ускоряет синхронизацию больших карт
network.bytes_per_frame_burst2561-65535Лимит пиковых байт (допускает кратковременные всплески)Поднимать вместе с предыдущим параметром, например 512
network.max_init_time600-32000Таймаут инициализации клиента (tick)При большом количестве игроков со слабым соединением можно увеличить
network.max_join_time5000-32000Таймаут подключения клиента (загрузка карты + синхронизация) (tick)Для больших карт/медленных каналов увеличить до 1000+
network.max_download_time10000-32000Таймаут загрузки карты (tick)Для больших карт (4096+) рекомендуется 2000+
network.max_lag_time8000-32000Максимальная допустимая задержка клиента (tick)При большом количестве игроков с высокой задержкой увеличить, но это повышает риск desync

Примечание: единица max_*_time — игровые tick (1/74 сек ≈ 13.5ms); bytes_per_frame — средние байты окна синхронизации за кадр.

3. Рекомендуемая стартовая конфигурация сервера (многопользовательская игра) ​

ini
[network]
max_clients = 32            ; или по необходимости
max_companies = 15
frame_freq = 3              ; 0 = отправлять команды каждый кадр (максимальная плавность); 3 = компромисс
sync_freq = 50              ; более раннее обнаружение рассинхронизации
commands_per_frame = 8
bytes_per_frame = 16
bytes_per_frame_burst = 512
max_join_time = 1000
max_download_time = 2000
max_lag_time = 1200
content_download_parallel = 4   ; параллельность загрузки контента на стороне клиента

4. Направления будущих оптимизаций производительности (по приоритету) ​

  1. HTTP транспортный пул потоков + Range-блочная загрузка (идея Openttd-Cluster 0007) Текущее состояние: F1 уже реализовал «файловый параллелизм» (одновременная загрузка нескольких файлов). 0007 добавляет пул потоков на HTTP-уровне + CURLOPT_RANGE для блочной загрузки, что может ускорить одиночные большие файлы (гигантские сценарии .tar.gz). Два подхода взаимодополняемы, но затрагивают одни и те же файлы, рекомендуется добавление после стабилизации F1.

  2. Оптимизация отправки карты Проверить, включено ли сжатие карты по умолчанию в jrpm (zstd/lzma); для больших карт можно сравнить время разных алгоритмов сжатия.

  3. Среда выполнения Rust-сервера (долгосрочная архитектурная справка) otc-engine от Openttd-Cluster (Admin/RCON, метрики Prometheus, кластерный failover, веб-панель, мост снимков) требует полной интеграции Rust-проекта через FFI, что является модернизацией уровня «сервер следующего поколения», а не слиянием на уровне патчей; jrpm пока остаётся чистым C++ единым бинарником.

  4. Производительность симуляции игры

    • Для больших карт с большим количеством ТС обратить внимание на параметры economy/linkgraph (linkgraph_settings.ini);
    • Для экстремальной производительности изучить классы settings_game.economy. и параметры лимитов pathfinder (настройки pathfinding).

5. Рекомендации по проверке ​

  • Открыть сервер openttd-jrpm -D -c server.cfg, протестировать с несколькими клиентами jrpm: время подключения, стабильность синхронизации кадров (без сообщений desync), загрузка CPU/памяти;
  • Загрузка контента: установить content_download_parallel=8 и сравнить время загрузки набора NewGRF;
  • Тестирование при слабом соединении: комбинация max_lag_time и sync_freq для нахождения стабильной границы.

Последнее обновление: