← Back to documentation

Server documentation

QuantumHy

In Development

Hytale • Version 0.2.1

Установка, ключи конфига, как работают адаптивный радиус чанков и сущностей, глобальный LOD-куллинг и совместимость с LeanCore.

Установка, настройка и поведение QuantumHy во время работы.


Обзор

QuantumHy это серверный мод для FPS в Hytale. Клиент нативный и не моддится, но сервер решает, сколько каждому клиенту приходится отрисовывать, поэтому QuantumHy урезает это по каждому игроку. Каждые несколько секунд он замеряет плотность сущностей вокруг каждого игрока, сглаживает её и использует, чтобы уменьшить две вещи: радиус обзора в чанках у клиента и радиус стриминга сущностей по игроку. Глобальная настройка LOD сущностей вдобавок отбрасывает мелкие и дальние сущности раньше. На открытом пространстве всё возвращается к собственному потолку игрока; QuantumHy никогда не раздувает обзор дальше того, что запросил игрок. Он помогает только там, где установлен, и никогда на удалённом сервере, к которому вы просто подключаетесь.


Установка

  1. Скачайте QuantumHy-0.2.1.jar на вкладке Files в CurseForge
  2. Поместите JAR в папку mods/ вашего сервера (или %AppData%\Hytale\UserData\Mods\ на Windows)
  3. Запустите сервер. Конфиг генерируется как QuantumHy.json в папке данных плагина
  4. Следите за серверным логом по строке setup и решениям каждого прохода (см. Проверка работы)

Как это работает

Каждый проход (по умолчанию 5с) QuantumHy выполняет работу по игроку в потоке владеющего мира:

  1. Замер плотности. Считает сущности в чанках вокруг игрока (квадрат densityScanChunkRadius чанков в каждую сторону) и делит на число просканированных загруженных чанков, получая сущности на чанк. Нормальный мир в покое около 1 - 1,5 на чанк.
  2. Сглаживание. Значение на чанк проходит через экспоненциальное скользящее среднее (densitySmoothing), чтобы у игрока, проходящего через кратковременную толпу, обзор не дёргался.
  3. Превращение в коэффициент урезания. На уровне densityLowPerChunk или ниже коэффициент равен 0 (без урезания). На densityHighPerChunk или выше он равен 1 (полное урезание). Между ними масштабируется линейно.
  4. Применение к двум рычагам. Тот же коэффициент масштабирует радиус обзора в чанках (вниз, к minClientViewRadius) и, при включённом adaptEntityRadius, радиус стриминга сущностей в блоках (вниз, к minEntityViewBlocks). Рычаг сущностей это главный выигрыш в местах с обилием мобов, так как он управляет тем, как далеко сервер стримит сущности, независимо от чанков.

Оба рычага снова поднимаются на открытом пространстве. Пока игрок ещё стримит чанки (только зашёл, бежит), урезание удерживается, чтобы клиенту не велели сбросить чанки, которые он занят прогрузкой. Поскольку запись радиуса обзора также снижает значение, которое возвращает геттер, QuantumHy запоминает максимальное виденное значение по игроку и возвращается к нему, чтобы обзор корректно восстанавливался.

entityLodAggressiveness отдельный: это единый множитель для всего сервера на LOD-куллинг сущностей движка, применяемый один раз при запуске и восстанавливаемый при выключении. Более высокие значения отбрасывают мелкие и дальние сущности раньше для всех.


Настройка

Файл времени работы: QuantumHy.json в папке данных плагина, создаётся при первом запуске.

КлючПо умолчаниюЧто делает
enabledtrueГлавный выключатель. При false QuantumHy не трогает ни один радиус обзора.
verboseLogtrueЛогирует каждый проход с плотностью и решением по обзору каждого игрока.
tickIntervalSeconds5Как часто он перепроверяет каждого игрока.
initialDelaySeconds20Ждать столько после старта до первого прохода.
targetClientViewRadius0Жёсткий потолок в чанках. 0 означает без потолка, только адаптация по плотности.
minClientViewRadius6Никогда не опускать никого ниже этого радиуса в чанках.
maxClientViewRadius32Потолок для жёсткого лимита (собственный радиус обзора игрока всё равно выигрывает).
densityScanChunkRadius4Сколько чанков в каждую сторону считать сущности.
densityLowPerChunk2.0Сущностей на чанк на этом уровне или ниже: полный радиус.
densityHighPerChunk8.0Сущностей на чанк на этом уровне или выше: опускается до минимума.
densitySmoothing0.4Вес новейшей выборки в EMA, в (0, 1]. Меньше — глаже; 1.0 отключает.
adaptEntityRadiustrueТакже уменьшать радиус стриминга сущностей по игроку, не только чанки.
minEntityViewBlocks48Нижняя граница радиуса сущностей, в блоках (16 блоков = 1 чанк).
entityLodAggressiveness1.5Глобальный LOD-куллинг сущностей. 1.0 это значение движка; выше отбрасывает мелкие/дальние раньше.
minViewRadiusDelta2Минимальное изменение (чанки) перед отправкой обновления, чтобы избежать дёрганья.
respectStreamingGracetrueУдерживать урезание, пока игрок ещё стримит чанки.
streamingBacklogThreshold8Сколько прогружаемых чанков считается «ещё стримит».
leanCoreTakeovertrueЕсли LeanCore установлен, перехватить у него радиус обзора.
yieldToLeanCoreViewRadiusfalseНаоборот: полностью оставить радиус обзора клиента за LeanCore.

Запуск вместе с LeanCore

QuantumHy и LeanCore оба могут задавать радиус обзора клиента, а должен только один. По умолчанию QuantumHy берёт его на себя: при запуске он обнаруживает LeanCore и отключает управление радиусом обзора у LeanCore (viewRadiusGovernanceEnabled, liteViewRadiusEnabled, motionViewRadiusBoostEnabled), а затем сам ведёт радиус. LeanCore сохраняет радиус симуляции, пропускную способность чанков и память. Никаких изменений конфига ни на одной из сторон не нужно. LeanCore это необязательная зависимость: когда его нет, QuantumHy просто работает самостоятельно.

  • leanCoreTakeover: false оставляет LeanCore в покое. Тогда оба могут спорить за радиус обзора.
  • yieldToLeanCoreViewRadius: true заставляет QuantumHy полностью держаться в стороне от радиуса обзора клиента и оставляет его за LeanCore.

Рекомендации

  • Одиночный или ваш собственный сервер: оставьте значения по умолчанию. Дальность обзора теряется только когда реально людно.
  • Хотите FPS везде: установите targetClientViewRadius на 12-16, чтобы ограничить дальность обзора даже на открытом пространстве.
  • Фермы мобов / тяжёлые ивенты: держите adaptEntityRadius: true; именно это удерживает кадры, когда на экране сотни сущностей.
  • Когда начнёте доверять ему, установите verboseLog: false, чтобы приглушить лог.

Проверка работы

  1. Запустите сервер и найдите строку setup: QuantumHy 0.2.1 setup. config: verboseLog=true tickInterval=5s ... densityLow=1.0/ch densityHigh=4.0/ch baseline=10% ... entityLod=2.00x ...
  2. Затем строку старта runtime: QuantumHy runtime started (interval=5s, hardCap=0, min=6, max=32, scan=4, entityRadius=true).
  3. Если LeanCore присутствует: LeanCore detected: took over the client view radius (governance turned off). Иначе: LeanCore not detected after 3 checks: QuantumHy owns the client view radius standalone.
  4. При verboseLog=true каждый проход логирует одну строку на игрока. Чтение: Durkz_z 312/81ch 3.9/ch~2.7 cl 14->13 ent 448->404 [density] означает 312 сущностей в 81 чанке (3,9 на чанк, сглажено до 2,7), радиус обзора в чанках идёт с 14 на 13, радиус сущностей идёт с 448 на 404 блока, причина density.
  5. На открытом пространстве причина показывается как [open], и оба значения держатся у потолка; в толпе они падают, с [density-min] когда достигают пола.

Лицензия

Лицензия MIT