No noso blog xa temos
Ao longo dos seus 9 anos de historia (a contar desde a data de lanzamento), Minecraft gañou un número incrible de fans e odiadores tanto entre os xogadores comúns como entre os frikis. O concepto sinxelo dun mundo feito de bloques evolucionou dunha simple forma de entretemento a un medio universal para comunicarse e crear diversos obxectos do mundo real.
Ademais da construción, o xogo ten a capacidade de crear
Pero non falemos máis sobre o que crean exactamente os xogadores, senón que vexamos a parte do servidor da aplicación e destaquemos os problemas (ás veces moi complexos) que poden xurdir durante o funcionamento baixo carga. Fagamos unha reserva de inmediato que só falaremos da edición Java.
Tipos de servidores
A opción máis sinxela é un servidor integrado no cliente do xogo. Creamos un mundo, pulsamos un botón e o servidor fíxose accesible a través da rede local. Esta opción non pode soportar ningunha carga grave e, polo tanto, nin sequera a consideraremos.
Vainilla
Mojang Studios está distribuíndo a parte do servidor do xogo como unha aplicación Java de balde
Este enfoque ten un serio inconveniente, é dicir, a falta de capacidades listas para conectar complementos que amplían a funcionalidade do servidor e permiten non só automatizar moitos procesos, senón tamén optimizar o rendemento. Ademais, o servidor oficial ten un consumo de RAM bastante grande para cada xogador conectado.
bukkit
Unha aplicación de servidor creada por entusiastas baseada na versión Vanilla
Instalar Bukkit non é difícil; as instrucións correspondentes están no recurso
SpigotMC
Para facilitarlles a vida aos desenvolvedores de complementos, era necesario contar cunha API para interactuar co mundo do xogo. Este é exactamente o problema que resolveron os creadores.
Actualmente, SpigotMC desenvólvese e úsase activamente. Admite todos os complementos creados para Bukkit, pero non é compatible con el. Para evitar a eliminación da DMCA, inventouse un método elegante chamado BuildTools. Esta ferramenta elimina a necesidade de distribuír unha aplicación compilada e permite aos usuarios compilar Spigot, CraftBukkit e Bukkit a partir do código fonte. Todo isto fai que a prohibición da DMCA sexa inútil.
PaperMC
Todo parecía xenial, e Spigot converteuse nunha gran opción. Pero isto non foi suficiente para algúns entusiastas, e crearon o seu propio garfo de Spigot "con esteroides". Activado
PaperMC ten unha excelente compatibilidade, polo que os complementos escritos para SpigotMC poden funcionar facilmente en PaperMC, pero sen soporte oficial. A compatibilidade con versións anteriores con SpigotMC tamén está presente. Agora que enumeramos as distintas opcións para crear un servidor, pasemos aos problemas de rendemento que poidan xurdir.
Problemas e solucións
O principal que debes entender é que todo o relacionado co procesamento do mundo do xogo procesarase só nun núcleo informático do servidor físico. Entón, se de súpeto tes un excelente servidor cunha ducia de núcleos informáticos, só se cargará un. Todos os demais estarán practicamente inactivos. Esta é a arquitectura da aplicación e non podes facer nada respecto diso. Polo tanto, ao elixir un servidor, debes prestar atención non ao número de núcleos, senón á frecuencia do reloxo. Canto máis alto sexa, mellor será o rendemento.
En canto ao tema da capacidade da memoria RAM, debemos partir dos seguintes indicadores:
- número previsto de xogadores;
- número planificado de mundos no servidor;
- o tamaño de cada mundo.
Hai que lembrar que unha aplicación Java sempre necesita unha reserva de RAM. Se esperas un consumo de memoria de 8 gigabytes, entón tes que ter 12. Os números son relativos, pero a esencia non cambia.
Para iniciar a parte do servidor, recomendamos usar as bandeiras especificadas no artigo
Xeración dun mapa de bloques
"De verdade pensas que a lúa só existe cando a miras?" (Albert Einstein)
Servidor completamente novo. Tan pronto como o xogador se conecta con éxito por primeira vez, o personaxe do xogo aparece no punto de reunión xeral (spawn). Este é o único lugar onde o servidor xera previamente o mundo do xogo. Ao mesmo momento, a parte do cliente mira a configuración e o parámetro clave é a distancia de debuxo. Mídese en anacos (a área do mapa é de 16×16 e 256 bloques de alto). Cantos anacos se indican é exactamente cantos se solicitarán ao servidor.
O servidor almacena un mapa global do mundo, e se aínda non hai bloques xerados nel no punto de aparición do personaxe do xogo, entón o servidor xeraos e gárdaos de forma dinámica. Isto non só require grandes recursos informáticos, senón que tamén aumenta constantemente o tamaño do mapa mundial. Nun dos servidores anarquistas máis antigos
Xerar un mundo arredor dun xogador non é un problema. Xerar un mundo ao redor de centos de xogadores provocará pequenas ralentizacións do servidor durante un curto período de tempo, despois do cal a carga diminuirá. Xerar un mundo a distancia de renderización do cliente ao redor de mil xogadores xa é capaz de "soltar" o servidor e botar a todos os clientes fóra del debido a un tempo de espera.
No software do servidor hai un valor como TPS (Ticks por servidor - ticks por segundo). Normalmente, 1 ciclo de reloxo é igual a 50 ms. (1 segundo do mundo real é igual a 20 ticks do mundo do xogo). Se o procesamento dun tick aumenta a 60 segundos, a aplicación do servidor pecharase, expulsando a todos os xogadores.
A solución é limitar o mundo a determinadas coordenadas e realizar a xeración preliminar de bloques. Así, eliminamos a necesidade de xeración dinámica durante o xogo, e o servidor só necesitará ler un mapa existente. Ambos problemas pódense resolver cun único complemento
O xeito máis sinxelo é establecer o límite do mundo en forma de círculo en relación ao punto de aparición (aínda que podes facelo de calquera forma) cun comando:
/wb set <радиус в блоках> spawn
Se o personaxe do xogador tenta cruzar a fronteira, será afastado varios bloques. Se isto se fai varias veces nun tempo limitado, o infractor será teletransportado pola forza ao punto de aparición. A pre-xeración do mundo faise aínda máis sinxela, co comando:
/wb fill
Dado que esta acción podería afectar aos xogadores do servidor, asegúrate de confirmar:
/wb confirm
En total, levou aproximadamente 5000 horas xerar un mundo cun radio de 40 bloques (~2 mil millóns de bloques) nun procesador Intel® Xeon® Gold 6240. Polo tanto, se quere xerar previamente un mapa máis grande, teña en conta que este proceso levará un tempo decente e o TPS do servidor reducirase seriamente. Ademais, recorda que incluso un radio de 5000 bloques requirirá aproximadamente 2 GB de espazo en disco.
A pesar de que a última versión do complemento foi desenvolvida para a versión 1.14 de Minecraft, descubriuse experimentalmente que funciona moi ben nas versións posteriores. Dispoñible unha lista completa de comandos con explicacións
Bloques problemáticos
Hai unha gran variedade de bloques en Minecraft. Non obstante, queremos chamar a atención dos lectores sobre un bloque como TNT. Como o nome indica, este bloque é un explosivo (Nota do editor: este é un elemento de xogo do mundo virtual e este elemento non ten nada con explosivos reais). A súa peculiaridade é tal que no momento da activación comeza a actuar sobre ela a forza da gravidade. Isto obriga ao servidor a calcular todas as coordenadas se neste momento o bloque comeza a caer.
Se hai varios bloques de TNT, entón a detonación dun bloque provoca a detonación e a activación da gravidade nos bloques veciños, dispersándoos en todas as direccións. Toda esta fermosa mecánica no lado do servidor parece unha gran cantidade de operacións para calcular a traxectoria de cada bloque, así como a interacción cos bloques veciños. A tarefa é moi intensiva en recursos, que calquera pode comprobar facilmente. Xera e detona un cubo a partir de bloques de TNT que teña polo menos un tamaño de 30x30x30. E se pensabas que tiñas un ordenador de xogos bo e potente, estabas moi equivocado 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
Un "experimento" similar nun servidor con Intel® Xeon® Gold 6240 levou a unha grave caída do TPS e a carga da CPU do 80 % durante todo o tempo de detonación do bloque. Polo tanto, se algún xogador é capaz de facelo, o problema de rendemento afectará a todos os xogadores do servidor.
Unha opción aínda máis difícil - Cristais de borde. Con todo, se TNT explota secuencialmente, entón os cristais Edge detonan todos ao mesmo tempo, o que en teoría pode deter completamente o funcionamento da aplicación do servidor.
Este escenario só se pode evitar prohibindo completamente o uso destes bloques no mundo do xogo. Por exemplo, usando o complemento
Conclusión
Xestionar correctamente un servidor de xogos non é unha tarefa fácil. As dificultades e a diminución do rendemento agardarán por ti a cada paso, especialmente se non tes en conta a propia mecánica de xogo. É imposible prever todo, porque ás veces os xogadores poden ser moi creativos ao tentar forzar o servidor a facer algo para o que non estaba destinado. Só un equilibrio razoable entre riscos e restricións establecidas permitirá que o servidor funcione continuamente e non reduza o seu rendemento a valores críticos.
Durante a corentena, algúns dos nosos empregados perderon as súas oficinas favoritas e decidiron recrealas dentro de Minecraft. Tamén tes a oportunidade de vir visitarnos sen arriscar a túa saúde nin perder o tempo na estrada.
Para iso, convidamos a todos ao noso servidor minecraft.selectel.ru (versión cliente 1.15.2), onde se recrearon os centros de datos Tsvetochnaya-1 e Tsvetochnaya-2. Non esquezas aceptar descargar recursos adicionais, son necesarios para a visualización correcta dalgunhas localizacións.
Agardan por ti misións, códigos promocionais, ovos de Pascua e unha agradable comunicación.
Fonte: www.habr.com