
No nosso blog, já falamos , sobre como criar seu servidor Minecraft, mas desde então se passaram 5 anos e muitas coisas mudaram. Compartilhamos com você maneiras atualizadas de criar e otimizar a parte do servidor deste jogo tão popular.
Ao longo de seus 9 anos de história (considerando a data de lançamento), o Minecraft conquistou um número impressionante de fãs e críticos, tanto entre jogadores comuns quanto entre entusiastas. O conceito simples de um mundo de cubos se transformou de um entretenimento comum em um ambiente universal para interação e criação de diversos objetos do mundo real.
Além da construção, o jogo permite criar , que possibilitam a execução de algoritmos completos dentro do Minecraft. Existem muitos vídeos impressionantes no YouTube, onde pessoas, dedicando um grande esforço e gastando muito tempo, recriaram cópias de dispositivos eletrônicos ou construíram réplicas detalhadas e . Tudo é limitado apenas pela imaginação do jogador e pelas possibilidades do universo do jogo.

Mas vamos parar de falar sobre o que os jogadores criam e olhar para a parte do servidor da aplicação, iluminando os problemas (às vezes bastante complexos) que podem surgir durante a operação sob carga. Vamos deixar claro que discutiremos apenas a edição Java.
Tipos de servidores
A opção mais simples é o servidor integrado no cliente do jogo. Criou um mundo, apertou um botão, e o servidor fica disponível na rede local. Essa opção não consegue suportar nenhuma carga séria, portanto, nem vamos considerá-la.
Baunilha
A Mojang Studios distribui a parte do servidor do jogo na forma de um aplicativo Java gratuitamente . Isso permite criar seu próprio e mundo pessoal, tornando-o acessível para conexão de qualquer ponto do planeta. Para aqueles que estão fazendo isso pela primeira vez, há um excelente , disponível na Wiki do jogo correspondente.
Esse método tem uma grande desvantagem, que é a falta de opções de conectar plugins, que expandem a funcionalidade do servidor e permitem não apenas automatizar muitos processos, mas também otimizar o desempenho. Além disso, o servidor oficial consome uma quantidade considerável de memória RAM por jogador conectado.
Bukkit
O aplicativo de servidor criado por entusiastas com base na versão Vanilla expandiu significativamente as possibilidades do jogo com suporte a plugins e mods (modificações). Ele permitiu não apenas adicionar novos blocos ao gameplay, mas também realizar várias manipulações que não estavam disponíveis no software vanilla. Curiosamente, esse aplicativo exigia significativamente menos memória.
Instalar o Bukkit não é muito difícil, há um guia disponível no recurso . Mas não faz sentido, já que desde 2014 a equipe do Bukkit se desfez, os desenvolvedores do projeto tornaram-se funcionários da Mojang Studios, e foi abandonado. Portanto, o Bukkit está efetivamente morto, e vale a pena prestar atenção em dois projetos seguintes.
SpigotMC
Para facilitar a vida dos desenvolvedores de plugins, havia a necessidade de uma API para interagir com o mundo do jogo. Esta foi exatamente a tarefa que os criadores , tomaram como base o núcleo do Bukkit e o reformularam para alcançar melhor confiabilidade e desempenho. No entanto, o projeto foi bloqueado devido à Lei de Direitos Autorais na Era Digital (), e não é possível baixar o código-fonte de lá.
Atualmente, o SpigotMC está se desenvolvendo ativamente e é amplamente utilizado. Ele suporta todos os plugins criados para o Bukkit, mas não é compatível com ele. Para contornar a proibição do DMCA Takedown, uma maneira elegante chamada BuildTools foi criada. Esta ferramenta elimina a necessidade de distribuição do aplicativo compilado e permite que os usuários compilen o Spigot, CraftBukkit e Bukkit a partir do código-fonte. Tudo isso torna a proibição do DMCA inútil.
PaperMC
À primeira vista, tudo parece ótimo, e o Spigot se tornou uma excelente opção. Mas alguns entusiastas acharam isso insuficiente e criaram seu próprio fork do Spigot "com esteroides". No principal destaque está que "é incrivelmente rápido". Uma comunidade desenvolvida permite resolver rapidamente questões que surgem, e a API avançada permite criar plugins interessantes. É possível iniciar o PaperMC com um simples comando, conforme indicado em .
A compatibilidade do PaperMC é ótima, então os plugins desenvolvidos para o SpigotMC funcionarão facilmente no PaperMC, embora sem suporte oficial. A compatibilidade retroativa com o SpigotMC também está presente. Agora que listamos as várias opções para criar um servidor, vamos abordar os problemas de desempenho que podem surgir.
Problemas e soluções
A principal coisa que você precisa entender é que tudo o que diz respeito ao processamento do mundo do jogo será tratado apenas em um núcleo de computação físico do servidor. Portanto, mesmo que você tenha um excelente servidor com dezenas de núcleos de computação, somente um estará em uso. Todos os outros permanecerão praticamente ociosos. Essa é a arquitetura do aplicativo e você não pode fazer nada a respeito. Ao escolher um servidor, deve-se prestar atenção não ao número de núcleos, mas à frequência do clock. Quanto mais alta for, melhor será o desempenho.
No que diz respeito à questão da quantidade de memória RAM, devemos partir dos seguintes indicadores:
- número planejado de jogadores;
- número planejado de mundos no servidor;
- tamanho de cada mundo.
É importante lembrar que um aplicativo Java sempre precisa de uma margem de memória RAM. Se você planeja um consumo de memória de 8 gigabytes, na verdade deve ter 12. Os números são aproximados, mas a essência não muda.
Para iniciar a parte do servidor, recomendamos usar as flags mencionadas no artigo . Essa 'magia negra' permite ao servidor ajustar corretamente o 'coletor de lixo' e otimiza o uso da memória RAM. Não deve-se alocar mais memória do que o servidor realmente consome durante os picos de jogadores.
Geração do mapa de blocos
“Você realmente acredita que a Lua existe apenas quando você a observa?” (Albert Einstein)
Servidor completamente novo. Assim que o jogador se conecta com sucesso pela primeira vez, o personagem do jogo aparece em um ponto de coleta comum (spawn). Este é o único local onde o mundo do jogo é gerado previamente pelo servidor. Nesse mesmo momento, o cliente consulta as configurações, e um parâmetro chave é a distância de renderização. Ela é medida em chunks (área do mapa de 16×16 e altura de 256 blocos). A quantidade de chunks especificada será exatamente a quantidade solicitada ao servidor.
O servidor armazena um mapa global do mundo, e se não houver blocos gerados na localização do spawn do personagem do jogo, o servidor os gera dinamicamente e os salva. Além de exigir grandes recursos computacionais, isso também aumenta constantemente o tamanho do mundo. Em um dos mais antigos servidores anárquicos, (2builders2tools) o tamanho do mapa já ultrapassou 8 Tb, e a fronteira do mundo está marcada em 30 milhões de blocos. Este servidor está associado a milhares de histórias e merece um artigo à parte na série de artigos.
A geração do mundo ao redor de um único jogador não é problema. A geração do mundo ao redor de cem jogadores causará pequenas lentidões no servidor por um curto período de tempo, após o qual a carga diminuirá. A geração do mundo na distância de renderização do cliente ao redor de mil jogadores já pode "derrubar" o servidor e desconectar todos os clientes por timeout.
No software do servidor, existe um valor chamado TPS (Ticks per Server — ticks por segundo). Normalmente, 1 tick equivale a 50 ms. (1 segundo do mundo real é igual a 20 ticks no mundo do jogo). Se o processamento de um tick aumentar para 60 segundos, o aplicativo do servidor será encerrado, expulsando todos os jogadores.
A solução é limitar o mundo a coordenadas específicas e executar a geração prévia dos blocos. Dessa forma, eliminamos a necessidade de geração dinâmica durante o jogo, e o servidor apenas precisa ler o mapa existente. Ambas as questões são resolvidas com um único plugin, .
É mais fácil definir a borda do mundo na forma de um círculo em relação ao ponto de spawn (embora possa ser de qualquer forma) com um único comando:
/wb set <радиус в блоках> spawnSe um personagem do jogo tentar cruzar a borda, ele será empurrado de volta por vários blocos. Se isso ocorrer várias vezes em um curto período, o infrator será teleportado forçadamente para o ponto de spawn. A pré-geração do mundo é realizada de maneira ainda mais simples, com o comando:
/wb fillComo esta ação pode potencialmente afetar jogadores no servidor, não se esqueça de confirmar a execução:
/wb confirmNo total, levou aproximadamente 2 horas para gerar um mundo com um raio de 5000 blocos (~40 bilhões de blocos) em um processador Intel® Xeon® Gold 6240. Portanto, se você deseja iniciar a pré-geração de um mapa maior, considere que esse processo levará um tempo considerável, e o TPS do servidor será seriamente reduzido. Além disso, lembre-se de que até um raio de 5000 blocos exigirá cerca de 2 GB de espaço em disco.
Embora a versão mais recente do plugin tenha sido desenvolvida para a versão 1.14 do Minecraft, foi constatado experimentalmente que ele funciona bem nas versões posteriores. A lista completa de comandos com explicações está disponível .
Blocos problemáticos
Existem diversas variantes de blocos no Minecraft. No entanto, gostaríamos de chamar a atenção dos leitores para um bloco específico, que é TNT. Como o nome sugere, este bloco representa um explosivo (nota da redação — este é um item do mundo virtual do jogo e não possui relação com explosivos reais). Sua característica é que, no momento da ativação, a gravidade começa a agir sobre ele. Isso faz com que o servidor calcule todas as coordenadas, caso o bloco comece a cair nesse momento.
Se houver vários blocos de TNT, a detonação de um bloco causa a detonação e a ativação da gravidade em blocos vizinhos, espalhando-os em todas as direções. Toda essa mecânica bonita do lado do servidor se parece com uma infinidade de operações de cálculo da trajetória de cada um dos blocos, bem como das interações com os blocos vizinhos. A tarefa é extremamente exigente em termos de recursos, o que qualquer um pode verificar facilmente. Gere e detone um cubo de blocos de TNT com pelo menos 30x30x30. E se você pensou que tinha um computador de jogos potente, você estava muito enganado 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Um experimento semelhante em um servidor com Intel® Xeon® Gold 6240 resultou em uma queda significativa no TPS e 80% de carga na CPU durante todo o tempo de detonação dos blocos. Portanto, se algum jogador conseguir fazer algo semelhante, o problema de desempenho afetará todos os jogadores no servidor.
Uma opção ainda mais rigorosa — Cristais do Fim. Se o TNT explodir de forma sequencial, os Cristais do Fim detonarão todos ao mesmo tempo, o que na teoria pode até parar a aplicação do servidor.
Evitar esse cenário só é possível proibindo completamente o uso desses blocos no mundo do jogo. Por exemplo, através do plugin . Observe que esse plugin por si só não funciona sem outro plugin chamado . Portanto, instale primeiro o WorldEdit e depois o WorldGuard.
Conclusão
Gerenciar um servidor de jogos de forma eficaz não é uma tarefa simples. Dificuldades e reduções de desempenho estarão à espreita em cada passo, especialmente se não considerarmos a mecânica do próprio jogo. É impossível prever tudo, pois os jogadores às vezes são muito criativos em suas tentativas de forçar o servidor a fazer o que não foi projetado para fazer. Apenas um equilíbrio sensato entre riscos e limitações impostas permitirá que o servidor opere de maneira contínua e mantenha seu desempenho longe de níveis críticos.
Durante a quarentena, alguns de nossos funcionários sentiram falta de seus escritórios favoritos e decidiram recreá-los dentro do Minecraft. Você também tem a chance de nos visitar, sem arriscar sua saúde e sem perder tempo a caminho.
Para isso, convidamos todos os interessados ao nosso servidor minecraft.selectel.ru (versão do cliente 1.15.2), onde os data centers Flower-1 e Flower-2 foram recriados. Não se esqueça de concordar com o download de recursos adicionais, pois eles são necessários para a exibição correta de algumas localizações.
Aguardam por você missões, códigos promocionais, 'easter eggs' e um agradável bate-papo.
Fonte: habr.com
