Em nosso blog já temos
Ao longo de seus 9 anos de história (contando a partir da data de lançamento), o Minecraft conquistou um número incrível de fãs e inimigos entre jogadores comuns e geeks. O conceito simples de um mundo feito de blocos evoluiu de uma simples forma de entretenimento para um meio universal de comunicação e criação de vários objetos do mundo real.
Além da construção, o jogo tem a capacidade de criar
Mas não vamos falar mais sobre o que exatamente os players criam, mas vamos dar uma olhada na parte do servidor do aplicativo e destacar os problemas (às vezes muito complexos) que podem surgir durante a operação sob carga. Vamos fazer já uma reserva que falaremos apenas da Edição Java.
Tipos de servidores
A opção mais simples é um servidor integrado ao cliente do jogo. Criamos um mundo, apertamos um botão e o servidor ficou acessível pela rede local. Esta opção não suporta nenhuma carga grave e, portanto, nem a consideraremos.
Baunilha
Mojang Studios está distribuindo a parte do servidor do jogo como um aplicativo Java gratuitamente
Essa abordagem tem uma séria desvantagem, ou seja, a falta de recursos prontos para uso para conectar plug-ins 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 tem um consumo bastante grande de RAM para cada jogador conectado.
bukkit
Um aplicativo de servidor criado por entusiastas baseado na versão Vanilla
Instalar o Bukkit não é difícil; as instruções correspondentes estão no recurso
Spigot MC
Para facilitar a vida dos desenvolvedores de plugins, houve a necessidade de uma API para interagir com o mundo do jogo. Este é exatamente o problema que os criadores resolveram.
Atualmente, o SpigotMC é desenvolvido e usado ativamente. Ele suporta todos os plugins criados para o Bukkit, mas não é compatível com versões anteriores. Para contornar a remoção do DMCA, um método elegante chamado BuildTools foi inventado. Esta ferramenta elimina a necessidade de distribuir um aplicativo compilado e permite aos usuários compilar Spigot, CraftBukkit e Bukkit a partir do código-fonte. Tudo isso torna a proibição do DMCA inútil.
Papel MC
Tudo parecia legal e o Spigot se tornou uma ótima opção. Mas isso não foi suficiente para alguns entusiastas, e eles criaram seu próprio fork do Spigot “com esteróides”. Sobre
PaperMC tem excelente compatibilidade, então plug-ins escritos para SpigotMC podem funcionar facilmente no PaperMC, mas sem suporte oficial. A compatibilidade com versões anteriores do SpigotMC também está presente. Agora que listamos as diversas opções para a criação de um servidor, vamos passar aos problemas de desempenho que podem surgir.
Problemas e soluções
A principal coisa que você precisa entender é que tudo relacionado ao processamento do mundo do jogo será processado apenas em um núcleo de computação do servidor físico. Portanto, se de repente você tiver um servidor excelente com uma dúzia de núcleos de computação, apenas um será carregado. Todos os outros ficarão praticamente ociosos. Esta é a arquitetura do aplicativo e não há nada que você possa fazer a respeito. Portanto, ao escolher um servidor, você deve prestar atenção não ao número de núcleos, mas à frequência do clock. Quanto maior for, melhor será o desempenho.
Quanto à questão da capacidade de RAM, devemos partir dos seguintes indicadores:
- número planejado de jogadores;
- número planejado de mundos no servidor;
- o tamanho de cada mundo.
Deve-se lembrar que uma aplicação Java sempre precisa de uma reserva de RAM. Se você espera um consumo de memória de 8 gigabytes, então na verdade você precisa de 12. Os números são relativos, mas a essência não muda.
Para iniciar a parte do servidor, recomendamos usar os sinalizadores especificados no artigo
Gerando um mapa de blocos
“Você realmente acha que a lua só existe quando você olha para ela?” (Albert Einstein)
Servidor completamente novo. Assim que o jogador se conectar com sucesso pela primeira vez, o personagem do jogo aparecerá no ponto de encontro geral (spawn). Este é o único lugar onde o mundo do jogo é pré-gerado pelo servidor. Ao mesmo tempo, a parte do cliente analisa as configurações e o parâmetro principal é a distância de desenho. É medido em pedaços (a área do mapa tem 16×16 e 256 blocos de altura) Quantos pedaços são indicados há exatamente quantos serão solicitados ao servidor.
O servidor armazena um mapa global do mundo e, se ainda não houver blocos gerados nele no momento em que o personagem do jogo aparece, o servidor os gera e armazena dinamicamente. Isto não só requer grandes recursos computacionais, mas também aumenta constantemente o tamanho do mapa mundial. Em um dos servidores anarquistas mais antigos
Gerar um mundo em torno de um jogador não é um problema. Gerar um mundo em torno de centenas de jogadores causará pequenas lentidão no servidor por um curto período de tempo, após o qual a carga diminuirá. Gerar um mundo a uma distância de renderização do cliente em torno de mil jogadores já é capaz de “derrubar” o servidor e tirar todos os clientes dele devido a um timeout.
No software de servidor existe um valor como TPS (Ticks por Servidor - ticks por segundo). Normalmente, 1 ciclo de clock é igual a 50 ms. (1 segundo do mundo real equivale a 20 ticks do mundo do jogo). Se o processamento de um tick aumentar para 60 segundos, o aplicativo do servidor será fechado, expulsando todos os jogadores.
A solução é limitar o mundo a certas coordenadas e realizar a geração preliminar de blocos. Assim, eliminamos a necessidade de geração dinâmica durante o jogo, e o servidor precisará apenas ler um mapa existente. Ambos os problemas podem ser resolvidos com um único plugin
A maneira mais fácil é definir o limite mundial na forma de um círculo em relação ao ponto de desova (embora você possa fazer qualquer formato) com um comando:
/wb set <радиус в блоках> spawn
Se o personagem do jogador tentar cruzar a fronteira, ele será empurrado vários blocos para trás. Se isso for feito várias vezes dentro de um tempo limitado, o infrator será teletransportado à força para o ponto de desova. A pré-geração do mundo é feita de forma ainda mais simples, com o comando:
/wb fill
Como esta ação pode afetar potencialmente os jogadores no servidor, certifique-se de confirmar:
/wb confirm
No total, foram necessárias aproximadamente 5000 horas para gerar um mundo com um raio de 40 blocos (~2 bilhões de blocos) em um processador Intel® Xeon® Gold 6240. Portanto, se você deseja pré-gerar um mapa maior, esteja ciente de que esse processo levará um tempo razoável e o TPS do servidor será seriamente reduzido. Além disso, lembre-se de que mesmo um raio de 5000 blocos exigirá aproximadamente 2 GB de espaço em disco.
Apesar de a versão mais recente do plugin ter sido desenvolvida para o Minecraft versão 1.14, foi descoberto experimentalmente que ele funciona muito bem nas versões subsequentes. Uma lista completa de comandos com explicações está disponível
Blocos problemáticos
Há uma grande variedade de blocos no Minecraft. No entanto, gostaríamos de chamar a atenção dos leitores para um bloco como TNT. Como o nome sugere, este bloco é um explosivo (nota do editor - este é um item de jogo do mundo virtual e este item não tem nada com explosivos reais). Sua peculiaridade é tal que no momento da ativação a força da gravidade começa a atuar sobre ele. Isso força o servidor a calcular todas as coordenadas se neste momento o bloco começar a cair.
Se houver vários blocos de TNT, a detonação de um bloco causa a detonação e a ativação da gravidade nos blocos vizinhos, espalhando-os em todas as direções. Toda essa bela mecânica do lado do servidor parece uma série de operações para calcular a trajetória de cada bloco, bem como a interação com os blocos vizinhos. A tarefa consome muitos recursos, o que qualquer pessoa pode verificar facilmente. Gere e detone um cubo a partir de blocos de TNT com tamanho de pelo menos 30x30x30. E se você pensava que tinha um computador para jogos bom e poderoso, você se enganou muito 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Um “experimento” semelhante em um servidor com Intel® Xeon® Gold 6240 levou a uma grave queda de TPS e 80% de carga de CPU durante todo o tempo de detonação do bloco. Portanto, se algum jogador conseguir fazer isso, o problema de desempenho afetará todos os jogadores do servidor.
Uma opção ainda mais difícil - Cristais de Borda. Mesmo assim, se o TNT explodir sequencialmente, os Edge Crystals detonarão todos ao mesmo tempo, o que em teoria pode interromper completamente a operação do aplicativo do servidor.
Este cenário só pode ser evitado proibindo completamente o uso desses blocos no mundo do jogo. Por exemplo, usando o plug-in
Conclusão
Gerenciar adequadamente um servidor de jogo não é uma tarefa fácil. Dificuldades e diminuição do desempenho estarão esperando por você a cada passo, especialmente se você não levar em conta a própria mecânica de jogo. É impossível prever tudo, porque os jogadores podem por vezes ser muito criativos ao tentar forçar o servidor a fazer algo para o qual não foi concebido. Somente um equilíbrio razoável entre riscos e restrições estabelecidas permitirá que o servidor opere continuamente e não reduza seu desempenho a valores críticos.
Durante a quarentena, alguns de nossos funcionários sentiram falta de seus escritórios favoritos e decidiram recriá-los dentro do Minecraft. Você também tem a chance de nos visitar sem arriscar sua saúde ou perder tempo na estrada.
Para fazer isso, convidamos todos para o nosso servidor minecraft.selectel.ru (cliente versão 1.15.2), onde foram recriados os data centers Tsvetochnaya-1 e Tsvetochnaya-2. Não se esqueça de concordar em baixar recursos adicionais, eles são necessários para a correta exibição de alguns locais.
Missões, códigos promocionais, ovos de Páscoa e comunicação agradável esperam por você.
Fonte: habr.com