QuantumHy
AtivoHytale • Version 0.4.0
O QuantumHy deixa seu cliente mais fluido no Hytale cortando o quanto o servidor manda ele desenhar, e ajusta isso por jogador conforme onde você está. Em área aberta você mantém sua visão cheia; num lugar cheio e pesado ele recolhe as coisas pra seu FPS não despencar.
O cliente do Hytale é nativo, então nenhum mod mexe no renderizador. O que um mod de servidor pode fazer é decidir o quanto cada cliente precisa desenhar, e esse é o truque inteiro: menos chunks e entidades na visão significam menos coisas pra desenhar, o que significa mais frames.
Dois limites honestos. Ele só ajuda onde está instalado (seu mundo solo, seu próprio servidor, ou um servidor que o use), não num servidor que você só entra. E ele nunca empurra sua visão além do que você pediu: seu próprio raio de visão é o teto, o QuantumHy só puxa pra baixo.
Desempenho
Joguei a mesma sessão duas vezes no Hytale 0.7.0: uma sem o QuantumHy e outra com o QuantumHy 0.4.0 na config padrão. Mesmo mundo, mesmo caminho, mesmas configurações do cliente, mesmo PC. Os frame times vêm direto do cliente do Hytale, capturados com o PresentMon (a ferramenta de captura dentro do CapFrameX).
PC de teste
| Componente | Especificação |
|---|---|
| CPU | AMD Ryzen 5 3600 |
| GPU | NVIDIA GeForce GTX 1650 4GB |
| RAM | 16 GB (2×8 GB) |
O que eu fiz em cada parte
- Voo rápido (60 s): voei em linha reta sobre terreno que ninguém tinha carregado, bem mais rápido do que dá pra correr, então chunks novos precisam ser gerados e enviados o tempo todo.
- Multidão de mobs (90 s): parei e spawnei uns 150 animais ao meu redor (ovelhas, vacas, porcos, cabras, galinhas, javalis).
- Efeitos (60 s): fiquei na multidão e spamei explosões, fogo e partículas de impacto em cima dela.
- Voltas (60 s): dei voltas ao redor da multidão com efeitos mais leves ainda rolando, então a câmera fica varrendo os mobs.
- Voo de volta (60 s): voltei voando pelo mesmo caminho.
Resultados
| Parte | Sem QuantumHy (média / 1% low) | QuantumHy 0.4.0 (média / 1% low) | Frames acima de 50 ms |
|---|---|---|---|
| Voo rápido | 65 / 7 | 142 / 48 | 40 → 1 |
| Multidão de mobs | 75 / 21 | 128 / 73 | 6 → 0 |
| Efeitos | 76 / 41 | 121 / 79 | 0 → 0 |
| Voltas | 54 / 19 | 115 / 58 | 12 → 0 |
| Voo de volta | 58 / 15 | 107 / 42 | 30 → 1 |
| Sessão inteira | 66 / 14 | 123 / 56 | 88 → 2 |
1% low é a média do 1% de frames mais lentos, o número que mostra o quanto os travamentos pesam.
De onde vêm os frames
- Sem o QuantumHy o cliente desenhou uma visão de 24 chunks e recebeu todo mob num raio de 768 blocos. Com o QuantumHy ficou em 12 chunks e mobs até 48 blocos (de umas 190 entidades visíveis pra umas 50). Essa é a troca: você vê menos longe, e a multidão para de custar frames.
- No voo rápido a borda da visão carrega um pouco atrás de você, porque ninguém se move tão rápido no survival. Correr normal (7 blocos/s) fica bem dentro do que o stream de chunks acompanha.
- Uma sessão por configuração, então diferenças abaixo de ~5% seriam ruído. As diferenças acima não são.
Como funciona
A cada poucos segundos o QuantumHy conta as entidades nos chunks ao redor de cada jogador como medida do custo de render, suaviza esse sinal e o transforma num único fator de redução. Esse fator move duas alavancas ao mesmo tempo:
- O raio de visão em chunks, pra parar de transmitir terreno distante quando está movimentado.
- O raio de stream de entidades em blocos, pra o servidor parar de mandar mobs distantes. Isso é independente dos chunks e é de onde vem a maior parte do ganho quando você está olhando pra uma multidão.
O raio não volta no instante em que a área parece vazia. O expand espera a carga ficar calma, pelo menos metade do disco de density carregado, você parado (não voando) e o mundo sem hitch. Enquanto está em streaming ou no join, os cortes ficam segurados pra o cliente não ser mandado a descartar chunks que está ocupado carregando. No shrink cheio o raio de entidades cai ao piso num passe.
Recursos
- Raio de visão em chunks adaptativo guiado pela densidade local de entidades, limitado ao seu próprio raio
- Raio de stream de entidades adaptativo em blocos, a grande alavanca em áreas cheias de mobs
- Freeze de expand até carga, cobertura e MSPT estarem calmos (sem dente de serra 6↔13)
- Opt-out persistente por jogador via
/q optimize off, sem afetar os demais jogadores - Override global opcional de LOD de entidades, desligado por padrão, para admins que querem um culling mais forte no mundo inteiro
- Suavização de densidade pra a visão de quem se move não ficar oscilando
- Tomada de controle automática do LeanCore pra os dois mods nunca brigarem pelo raio de visão
- Log detalhado opcional no servidor que explica cada decisão por jogador a cada passada (off por padrão)
- Checagem de update no boot, só para operadores ou
durkz.quantumhy.admin(opt-out comcheckForUpdates) - Limite da distância de desenho do cliente pra o cliente parar de desenhar o que o servidor parou de enviar
- Alívio pra cliente sobrecarregado: um cliente que fica pra trás recebe raio menor e envio de chunks mais suave
- Orçamento de efeitos distantes pra partículas e sons 3D; efeitos perto de você sempre passam
- Atenção à memória do LeanCore: raio menor enquanto o LeanCore reporta o heap apertado
- Extras opcionais, desligados por padrão: menos updates de posição pra entidades distantes, merge de itens mais largo sob pressão no servidor
Instalação
- Baixe QuantumHy-0.4.0.jar na aba Files da CurseForge
- Coloque o JAR na pasta mods/ do servidor, ou no solo Windows:
%AppData%\Hytale\UserData\Mods - Inicie o servidor. A config é criada como QuantumHy.json na pasta de dados do plugin
Comandos
/q status
/q optimize on
/q optimize off
/q help
Aliases: /quantumhy, /qhy. Jogadores veem apenas o próprio estado de otimização em /q status; admins e o console do servidor veem o estado completo do runtime.
Config
As configurações do servidor ficam no QuantumHy.json, criado no primeiro boot. As escolhas dos jogadores ficam no PlayerPreferences.json. Os padrões funcionam de cara: sem teto fixo de visão, adapta só quando está cheio. Defina targetClientViewRadius acima de 0 pra trocar distância de visão por FPS em todo lugar. Defina checkForUpdates como false pra pular a checagem de versão no boot. Referência completa das chaves: documentação.
Permissões
durkz.quantumhy.admin: receber avisos de update in-game e ver o/q statuscompleto. Operadores do servidor herdam isso via*.
Rodando com o LeanCore
Se você roda o LeanCore junto, o QuantumHy resolve a sobreposição pra você. Os dois podem ajustar o raio de visão do cliente e só um deve, então o QuantumHy assume: no boot ele detecta o LeanCore, desliga a governança de raio de visão do LeanCore e passa a controlar o raio ele mesmo. O LeanCore continua fazendo todo o resto (raio de simulação, throughput de chunks, memória). Você não precisa tocar na config do LeanCore. Defina leanCoreTakeover como false pra deixar o LeanCore em paz, ou yieldToLeanCoreViewRadius como true pra deixar o LeanCore manter o raio de visão.
Recomendado
- Solo ou seu próprio servidor: deixe os padrões. Você só perde distância de visão quando está realmente cheio.
- Quer FPS em todo lugar: defina
targetClientViewRadiusentre 12 e 16 pra limitar a distância de visão até em área aberta. - Prefere os limites originais do servidor: use
/q optimize off. Sua escolha persiste após reiniciar. - Ligue
verboseLogsó pra diagnosticar; o padrão é off. - Deixe
checkForUpdatesligado a menos que você não queira o aviso de JAR novo para operadores.
Limitações conhecidas
- O QuantumHy não consegue ler o FPS do cliente. Ele reage à densidade local de entidades, ao estado de streaming, à pressão de entidades visíveis e ao MSPT do servidor.
/q optimize offdesliga os ajustes de visão e stream de entidades daquele jogador. Controles globais ativados explicitamente por um admin ainda afetam o mundo.
Licença
Licença MIT
Para donos de servidor
Precisa de permissões, comandos e config?
O guia completo cobre cada permissão, comando de admin, exemplos LuckPerms e todas as opções de configuração.
Ler documentação do servidor