Server documentation
QuantumHy
In DevelopmentHytale • Version 0.2.1
Установка, ключи конфига, как работают адаптивный радиус чанков и сущностей, глобальный LOD-куллинг и совместимость с LeanCore.
Установка, настройка и поведение QuantumHy во время работы.
Обзор
QuantumHy это серверный мод для FPS в Hytale. Клиент нативный и не моддится, но сервер решает, сколько каждому клиенту приходится отрисовывать, поэтому QuantumHy урезает это по каждому игроку. Каждые несколько секунд он замеряет плотность сущностей вокруг каждого игрока, сглаживает её и использует, чтобы уменьшить две вещи: радиус обзора в чанках у клиента и радиус стриминга сущностей по игроку. Глобальная настройка LOD сущностей вдобавок отбрасывает мелкие и дальние сущности раньше. На открытом пространстве всё возвращается к собственному потолку игрока; QuantumHy никогда не раздувает обзор дальше того, что запросил игрок. Он помогает только там, где установлен, и никогда на удалённом сервере, к которому вы просто подключаетесь.
Установка
- Скачайте QuantumHy-0.2.1.jar на вкладке Files в CurseForge
- Поместите JAR в папку mods/ вашего сервера (или
%AppData%\Hytale\UserData\Mods\на Windows) - Запустите сервер. Конфиг генерируется как QuantumHy.json в папке данных плагина
- Следите за серверным логом по строке setup и решениям каждого прохода (см. Проверка работы)
Как это работает
Каждый проход (по умолчанию 5с) QuantumHy выполняет работу по игроку в потоке владеющего мира:
- Замер плотности. Считает сущности в чанках вокруг игрока (квадрат
densityScanChunkRadiusчанков в каждую сторону) и делит на число просканированных загруженных чанков, получая сущности на чанк. Нормальный мир в покое около 1 - 1,5 на чанк. - Сглаживание. Значение на чанк проходит через экспоненциальное скользящее среднее (
densitySmoothing), чтобы у игрока, проходящего через кратковременную толпу, обзор не дёргался. - Превращение в коэффициент урезания. На уровне
densityLowPerChunkили ниже коэффициент равен 0 (без урезания). НаdensityHighPerChunkили выше он равен 1 (полное урезание). Между ними масштабируется линейно. - Применение к двум рычагам. Тот же коэффициент масштабирует радиус обзора в чанках (вниз, к
minClientViewRadius) и, при включённомadaptEntityRadius, радиус стриминга сущностей в блоках (вниз, кminEntityViewBlocks). Рычаг сущностей это главный выигрыш в местах с обилием мобов, так как он управляет тем, как далеко сервер стримит сущности, независимо от чанков.
Оба рычага снова поднимаются на открытом пространстве. Пока игрок ещё стримит чанки (только зашёл, бежит), урезание удерживается, чтобы клиенту не велели сбросить чанки, которые он занят прогрузкой. Поскольку запись радиуса обзора также снижает значение, которое возвращает геттер, QuantumHy запоминает максимальное виденное значение по игроку и возвращается к нему, чтобы обзор корректно восстанавливался.
entityLodAggressiveness отдельный: это единый множитель для всего сервера на LOD-куллинг сущностей движка, применяемый один раз при запуске и восстанавливаемый при выключении. Более высокие значения отбрасывают мелкие и дальние сущности раньше для всех.
Настройка
Файл времени работы: QuantumHy.json в папке данных плагина, создаётся при первом запуске.
| Ключ | По умолчанию | Что делает |
|---|---|---|
enabled | true | Главный выключатель. При false QuantumHy не трогает ни один радиус обзора. |
verboseLog | true | Логирует каждый проход с плотностью и решением по обзору каждого игрока. |
tickIntervalSeconds | 5 | Как часто он перепроверяет каждого игрока. |
initialDelaySeconds | 20 | Ждать столько после старта до первого прохода. |
targetClientViewRadius | 0 | Жёсткий потолок в чанках. 0 означает без потолка, только адаптация по плотности. |
minClientViewRadius | 6 | Никогда не опускать никого ниже этого радиуса в чанках. |
maxClientViewRadius | 32 | Потолок для жёсткого лимита (собственный радиус обзора игрока всё равно выигрывает). |
densityScanChunkRadius | 4 | Сколько чанков в каждую сторону считать сущности. |
densityLowPerChunk | 2.0 | Сущностей на чанк на этом уровне или ниже: полный радиус. |
densityHighPerChunk | 8.0 | Сущностей на чанк на этом уровне или выше: опускается до минимума. |
densitySmoothing | 0.4 | Вес новейшей выборки в EMA, в (0, 1]. Меньше — глаже; 1.0 отключает. |
adaptEntityRadius | true | Также уменьшать радиус стриминга сущностей по игроку, не только чанки. |
minEntityViewBlocks | 48 | Нижняя граница радиуса сущностей, в блоках (16 блоков = 1 чанк). |
entityLodAggressiveness | 1.5 | Глобальный LOD-куллинг сущностей. 1.0 это значение движка; выше отбрасывает мелкие/дальние раньше. |
minViewRadiusDelta | 2 | Минимальное изменение (чанки) перед отправкой обновления, чтобы избежать дёрганья. |
respectStreamingGrace | true | Удерживать урезание, пока игрок ещё стримит чанки. |
streamingBacklogThreshold | 8 | Сколько прогружаемых чанков считается «ещё стримит». |
leanCoreTakeover | true | Если LeanCore установлен, перехватить у него радиус обзора. |
yieldToLeanCoreViewRadius | false | Наоборот: полностью оставить радиус обзора клиента за 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, чтобы приглушить лог.
Проверка работы
- Запустите сервер и найдите строку setup:
QuantumHy 0.2.1 setup. config: verboseLog=true tickInterval=5s ... densityLow=1.0/ch densityHigh=4.0/ch baseline=10% ... entityLod=2.00x ... - Затем строку старта runtime:
QuantumHy runtime started (interval=5s, hardCap=0, min=6, max=32, scan=4, entityRadius=true). - Если 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. - При
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. - На открытом пространстве причина показывается как
[open], и оба значения держатся у потолка; в толпе они падают, с[density-min]когда достигают пола.
Лицензия
Лицензия MIT