
En nuestro blog ya , cómo crear tu propio servidor de Minecraft, pero han pasado 5 años desde entonces y muchas cosas han cambiado. Compartimos con ustedes formas actualizadas de crear y optimizar la parte del servidor de este popular juego.
A lo largo de su historia de 9 años (si contamos desde la fecha de lanzamiento), Minecraft ha ganado una increíble cantidad de fanáticos y detractores tanto entre jugadores comunes como entre entusiastas. La simple concepción de un mundo de bloques se ha convertido de un simple entretenimiento en un medio universal para la comunicación y la creación de diversos objetos del mundo real.
Además de la construcción, el juego también permite crear , que permiten implementar algoritmos completos dentro de Minecraft. En YouTube hay muchos videos impresionantes donde las personas, dedicando una gran cantidad de esfuerzo y tiempo, han creado una copia de un dispositivo electrónico o han construido una copia detallada de y imaginarias. Todo está limitado solo por la imaginación del jugador y las posibilidades del universo del juego.

Pero no hablemos más sobre lo que los jugadores crean, y veamos la parte del servidor de la aplicación y abordemos los problemas (a veces bastante complejos) que pueden surgir durante el funcionamiento bajo carga. Cabe aclarar que solo hablaremos de la edición Java.
Tipos de servidores
La opción más simple es el servidor integrado en el cliente del juego. Creas un mundo, presionas un botón, y el servidor se vuelve accesible a través de la red local. Este tipo de opción no puede soportar ninguna carga seria, por lo que no lo consideraremos.
Vanilla
La compañía Mojang Studios distribuye la parte del servidor del juego en forma de una aplicación Java de forma gratuita . Esto permite crear tu propio y personal mundo, haciéndolo accesible para conectarse desde cualquier punto del planeta. Para aquellos que hacen esto por primera vez, hay un excelente , disponible en la Wiki del juego correspondiente.
Este enfoque tiene una seria desventaja: la falta de opciones «listo para usar» para conectar plugins que amplían la funcionalidad del servidor y permiten no solo automatizar muchos procesos, sino también optimizar el rendimiento. Además, el servidor oficial consume bastante memoria RAM por cada jugador conectado.
Bukkit
La aplicación de servidor creada por entusiastas basada en la versión Vanilla amplió significativamente las capacidades del juego al permitir el soporte de plugins y mods (modificaciones). Esto no solo permitió añadir nuevos bloques al juego, sino también realizar diversas manipulaciones que no están disponibles en el software original. Curiosamente, esta aplicación requería mucha menos memoria.
Instalar Bukkit no es particularmente complicado, hay una guía correspondiente en el recurso . Pero esto no tiene sentido, ya que desde 2014 el equipo de Bukkit se disolvió, los desarrolladores del proyecto se convirtieron en empleados de Mojang Studios, y ha sido abandonado. Así, Bukkit está efectivamente muerto, y tiene sentido prestar atención a los siguientes dos proyectos.
SpigotMC
Para facilitar la vida a los desarrolladores de plugins, se requería una API para interactuar con el mundo del juego. Esta fue la tarea que resolvieron los creadores de , tomando el núcleo de Bukkit y reformulándolo para lograr una mejor fiabilidad y rendimiento. Sin embargo, del proyecto fue bloqueado debido a la Ley de Derechos de Autor en la Era Digital (), y no es posible descargar los fuentes desde allí.
Actualmente, SpigotMC se desarrolla activamente y se utiliza. Soporta todos los plugins creados para Bukkit, sin embargo, no es compatible con ellos. Para eludir la prohibición del DMCA Takedown, se ideó una forma elegante llamada BuildTools. Esta herramienta elimina la necesidad de distribuir la aplicación compilada y permite a los usuarios compilar Spigot, CraftBukkit y Bukkit desde el código fuente. Todo esto hace que la prohibición del DMCA sea inútil.
PaperMC
Aparentemente, todo está bien, y Spigot se convirtió en una excelente opción. Pero a algunos entusiastas les pareció poco, y crearon su propio fork de Spigot 'esteroides'. En se indica como clave que “es estúpidamente rápido”. La comunidad desarrollada permite abordar rápidamente las preguntas que surgen, y la API extendida permite crear interesantes complementos. Puedes iniciar PaperMC con un simple comando que se encuentra en .
PaperMC es totalmente compatible, por lo que los complementos desarrollados para SpigotMC funcionarán fácilmente en PaperMC, aunque sin soporte oficial. También existe compatibilidad hacia atrás con SpigotMC. Ahora que hemos enumerado las diferentes opciones para crear un servidor, pasemos a los problemas de rendimiento que pueden surgir.
Problemas y soluciones
Lo principal que debes entender es que todo lo relacionado con el procesamiento del mundo del juego se manejará solo en un núcleo de procesamiento físico del servidor. Así que aunque tengas un servidor excelente con una docena de núcleos de procesamiento, solo estará ocupado uno. Los demás estarán esencialmente inactivos. Así es la arquitectura de la aplicación, y no hay nada que puedas hacer al respecto. Por lo tanto, al elegir un servidor, debes prestar atención no al número de núcleos, sino a la frecuencia del reloj. Cuanto más alta sea, mejor será el rendimiento.
En cuanto a la cantidad de memoria RAM, se debe considerar lo siguiente:
- el número planeado de jugadores;
- el número planeado de mundos en el servidor;
- el tamaño de cada mundo.
Recuerda que las aplicaciones Java siempre necesitan un margen de memoria. Si calculas un consumo de memoria de 8 gigabytes, en realidad deberías tener 12. Las cifras son indicativas, pero la esencia no cambia.
Para iniciar la parte del servidor, recomendamos utilizar los flags especificados en el artículo . Esta 'magia negra' permite ajustar el 'recolector de basura' del servidor y optimiza el uso de la memoria RAM. No se debe asignar más memoria de la que realmente consume el servidor durante los picos de jugadores.
Generación del mapa de bloques
“¿Realmente crees que la Luna existe solo cuando la miras?” (Albert Einstein)
Servidor completamente nuevo. La primera vez que un jugador se conecta con éxito, el personaje aparece en el punto de recolección común (spawn). Este es el único lugar donde el mundo del juego es pre-generado por el servidor. En ese momento, la parte del cliente verifica la configuración y un parámetro clave es la distancia de renderizado. Se mide en chunks (un área de 16×16 y una altura de 256 bloques). Cuantos más chunks se especifiquen, más se solicitarán al servidor.
El servidor almacena el mapa global del mundo, y si aún no hay bloques generados en el punto de aparición del personaje, el servidor los genera dinámicamente y los guarda. No solo esto requiere grandes recursos computacionales, sino que también aumenta constantemente el tamaño del mapa del mundo. En uno de los servidores anárquicos más antiguos, (2builders2tools) el tamaño del mapa ya ha superado los 8 Tb, y el límite del mundo se encuentra en 30 millones de bloques. Este servidor está relacionado con miles de historias y merece un artículo separado o una serie de artículos.
Generar el mundo alrededor de un jugador no es un problema. Sin embargo, generar el mundo alrededor de cientos de jugadores causará pequeñas interrupciones en el servidor durante un corto período, después del cual la carga disminuirá. La generación del mundo a la distancia de renderizado del cliente alrededor de mil jugadores puede llegar a 'causar caídas' en el servidor y desconectar a todos los clientes por timeout.
En el software del servidor existe un valor llamado TPS (Ticks per Server — ticks por segundo). Normalmente, 1 tick es igual a 50 ms. (1 segundo del mundo real es equivalente a 20 ticks del mundo del juego). Si el procesamiento de un tick aumenta a 60 segundos, la aplicación del servidor se cerrará, desconectando a todos los jugadores.
La solución es limitar el mundo a ciertas coordenadas y realizar una generación previa de bloques. De esta manera, eliminamos la necesidad de generación dinámica durante el juego, y al servidor solo le bastará leer el mapa ya existente. Ambas cuestiones se resuelven con un solo plugin .
Es más fácil establecer el límite del mundo en forma de círculo en relación con el punto de spawn (aunque se puede hacer de cualquier forma) con un solo comando:
/wb set <радиус в блоках> spawnSi un personaje del juego intenta cruzar la frontera, será rechazado varios bloques hacia atrás. Si esto se intenta varias veces en un corto periodo de tiempo, el infractor será teletransportado forzosamente al punto de aparición. La pre-generación del mundo se realiza aún más fácilmente con el comando:
/wb fillDado que esta acción puede afectar potencialmente a los jugadores en el servidor, no olvide confirmar la ejecución:
/wb confirmEn total, la generación de un mundo con un radio de 5000 bloques (~40 mil millones de bloques) tomó aproximadamente 2 horas en una CPU Intel® Xeon® Gold 6240. Por lo tanto, si desea iniciar la pre-generación de un mapa más grande, tenga en cuenta que este proceso tomará un tiempo considerable y el TPS del servidor se reducirá drásticamente. Además, recuerde que incluso un radio de 5000 bloques requerirá aproximadamente 2 GB de espacio en el disco duro.
A pesar de que la versión más reciente del plugin fue desarrollada para la versión 1.14 de Minecraft, se ha comprobado que funciona perfectamente en versiones posteriores. Una lista completa de comandos con explicaciones está disponible .
Bloques problemáticos
Hay una gran variedad de bloques en Minecraft. Sin embargo, nos gustaría centrar la atención de los lectores en un bloque específico, que es TNT. Como su nombre indica, este bloque es un explosivo (nota de la redacción: este es un objeto de juego en un mundo virtual y no tiene relación con explosivos reales). Su característica es que al activarse, comienza a ser afectado por la gravedad. Esto hace que el servidor calcule todas las coordenadas, cuando en ese momento el bloque comienza a caer.
Si hay varios bloques de TNT, la detonación de un bloque provoca la detonación y la activación de la gravedad en los bloques vecinos, esparciéndolos por todas partes. Toda esta hermosa mecánica del lado del servidor se manifiesta como múltiples operaciones para calcular la trayectoria de cada bloque y su interacción con los bloques vecinos. Esta tarea es extremadamente intensiva en recursos, lo que cualquiera puede comprobar. Genere y detone un cubo de bloques de TNT, con un tamaño de al menos 30x30x30. Y si creías que tenías una buena computadora de juegos, te has equivocado 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Un "experimento" similar en un servidor con Intel® Xeon® Gold 6240 resultó en una caída seria de TPS y una carga del 80% en el CPU durante todo el tiempo de detonación de bloques. Por lo tanto, si alguno de los jugadores logra hacer algo similar, el problema de rendimiento afectará a todos los jugadores que se encuentren en el servidor.
Una variante aún más estricta — Cristales del End. Si TNT explota secuencialmente, los Cristales del End detonan todos al mismo tiempo, lo que teóricamente puede detener completamente la aplicación del servidor.
Se puede evitar este escenario solo prohibiendo completamente el uso de estos bloques en el mundo del juego. Por ejemplo, mediante un plugin . Ten en cuenta que este plugin por sí solo no funciona sin otro plugin . Así que primero instala WorldEdit y luego WorldGuard.
Conclusión
La gestión adecuada de un servidor de juego no es una tarea fácil. Las dificultades y la disminución del rendimiento estarán al acecho en cada paso, especialmente si no se considera la mecánica del propio juego. No es posible preverlo todo, ya que los jugadores a veces son muy ingeniosos en sus intentos de hacer que el servidor realice tareas para las que no fue diseñado. Solo un equilibrio razonable entre riesgos y restricciones impuestas permitirá que el servidor funcione de manera continua y no disminuya su rendimiento a valores críticos.
En cuarentena, algunos de nuestros empleados extrañaron sus oficinas favoritas y decidieron recrearlas dentro de Minecraft. Tú también tienes la oportunidad de visitarnos, sin arriesgar tu salud y sin perder tiempo en el camino.
Para ello, invitamos a todos los interesados a nuestro servidor minecraft.selectel.ru (versión del cliente 1.15.2), donde se han recreado los centros de datos Floral-1 y Floral-2. No olvides aceptar la descarga de recursos adicionales, son necesarios para mostrar correctamente algunas ubicaciones.
Te esperan misiones, códigos promocionales, "easter eggs" y agradables charlas.
Fuente: habr.com
