¿Cómo uno, programáticamente hablando, crea un juego como ‘No Man’s Sky’? ¿Qué tipo de problemas deben resolverse?

Bueno, supongo que estás hablando del aspecto de la generación procesal. También debo agregar que no tengo detalles sobre cómo funciona No Man’s Sky, pero puedo describir algunas técnicas de procedimiento que probablemente se utilizaron.

La base del sistema es probablemente un generador de números seudoaleatorio sembrado. Las computadoras no pueden generar números verdaderamente aleatorios (las computadoras son, por definición, sistemas deterministas), por lo que se utiliza un algoritmo, como Mersenne Twister, que genera números en una serie con pocos o ningún patrón aparente. El truco es que estos algoritmos ingresan un valor de “semilla”, y la serie de números de salida siempre será la misma para cualquier semilla dada. En la mayoría de las aplicaciones con generación de números aleatorios, sería una idea terrible ejecutar varias veces con la misma semilla (y, por lo tanto, tener la misma serie de resultados aleatorios), por lo que se utiliza algún método para hacer que la semilla sea lo más probable posible que sea diferente en diferentes carreras; generalmente tomándolo de alguna fuente aleatoria externa, como la hora actual en milisegundos.

Pero para la generación de procedimientos, especialmente de una experiencia compartida, puede hacer lo contrario. Al usar a propósito una semilla predecible , puede convertir un número en una serie grande y aparentemente aleatoria, pero de manera repetible . Y NMS podría usar esto fácilmente; cuando visita un nuevo sistema, el generador de números pseudoaleatorios se siembra con un número de identificación estándar para ese sistema. Desde ese punto, se puede tomar cualquier número de números “aleatorios” de ese generador para describir lo que hay en el sistema. Pero debido a la semilla predecible, cualquier otra persona que visite el sistema verá lo mismo , porque dada la misma semilla, el algoritmo generará los mismos números “aleatorios”. No tengo idea exactamente qué alcance utiliza NMS para generar los diferentes niveles de juego que admite (galaxia, sistema, planeta), pero estoy bastante seguro de que un PRNG sembrado se usa en alguna parte.

Sin embargo, vale la pena mencionar que Hello Games se dio una serie de grandes problemas de diseño al hacerlo de esta manera. En primer lugar, hicieron que el alcance fuera tan grande que no pueden verificar todos los sistemas y planetas o secuencias de ellos mismos. (Los PRNG no tienen que usarse solo para mapas masivos). En segundo lugar, enfatizaron la experiencia compartida, lo que significa que no pueden ajustar el contenido de un sistema en función del historial de reproducción.

Uno de los ejemplos más obvios de esto es el aspecto de supervivencia del juego, del que algunos jugadores se quejaron. Tome el plutonio como ejemplo. El plutonio es esencial como combustible para los propulsores de su nave espacial. Pero, ¿qué pasaría si se te acabara y aterrizases en un planeta sin ninguno disponible? Estarías atrapado en ese planeta permanentemente. Originalmente, algunos planetas serían ricos en plutonio, y otros no tendrían ninguno. Pero si lo hicieron, porque Hello Games no puede visitar todos los sistemas o combinaciones de ellos, no pueden garantizar que el jugador no termine en 3 sistemas seguidos sin Plutonio y prácticamente se garantiza que terminará. atrapado. No pueden hacer lo que harían muchos juegos: manipular el sistema para garantizar que se generará algún planeta con Plutonio si no tienes ninguno, porque podrías estar en un sistema que otra persona descubrió anteriormente y no vio Plutonio allí, y eso rompería la experiencia compartida. Dado que la única forma de recuperarse de estar atrapado sería volver a cargar un salvamento, pero no querían esa mecánica en NMS (presumiblemente para crear una experiencia inmersiva sin problemas), su única opción es poner Plutonio en cada planeta para que no -uno puede quedar atrapado. Lo que ya ha atraído quejas sobre cómo hace que los planetas sean demasiado similares y dañe el aspecto de supervivencia del juego.

(Incidentalmente, “¿qué pasaría si fallaras?” Es una gran pregunta para preguntar sobre cualquiera de los aspectos de diseño de NMS que fueron eliminados. Como batallas a gran escala. Normalmente cuando mueres en combate espacial reaparecerás con tu tumba en el planeta más cercano. ¿Cómo funciona eso en una batalla a gran escala? ¿Eventualmente puedes desgastar a un ejército enemigo con copias infinitamente reaparecidas de ti mismo?)

De todos modos, una vez que tienes tu PRNG, generar un sistema estelar es bastante fácil. Extraiga valores del PRNG para la naturaleza del sistema, las frecuencias de asteroides y las coordenadas de los planetas. Aplique algunos algoritmos de comprobación de cordura deterministas (y por lo tanto predecibles) para espaciar los planetas. Obviamente, hay mucho más que puede hacer para agregar detalles como órbitas, apariciones de planetas, estaciones espaciales, etc., pero ese es el principio básico.

Ahora, ¿qué tal si aterrizamos en un planeta? Bueno, cualquiera que haya visto uno mirará una de las vistas alejadas del planeta y pensará instantáneamente en un fractal de plasma (o algoritmo de cuadrado de diamante ). Es la forma mejor establecida de generar un paisaje a partir de un valor semilla. Sin embargo, NMS es un poco más sofisticado que eso: también genera características como cuevas y ríos. Esos no están tan bien documentados: supongo que la generación de cuevas se realiza seleccionando grandes áreas “altas” en el plasma y luego volviendo a ejecutar un plasma más pequeño u otro generador de fractales para que quepa en el área, pero habría mucho de complejidad adicional en eso.

Siguiente paso, Flora. Hay muchos algoritmos existentes para sembrar un paisaje basado en plasma con flora, pero NMS parece ser más sofisticado que la mayoría de ellos. La técnica básica es probablemente la misma: extraiga valores de su PRNG para identificar parches donde existan cosas particulares, pero esta es la parte del juego que requeriría la mayor sintonía para tener sentido.

Tanto las plantas como los animales en NMS implican la generación de mallas de procedimiento , generando un objeto 3D a partir de partes basadas en un número de semilla. Este es un campo en expansión y, desafortunadamente, aunque hay mucha documentación disponible, no hay mucho con qué jugar. El único software que conozco que permite la generación de mallas procesales controladas por el usuario sin programación es .werkkzeug , una herramienta de escena de demostración que ahora tiene más de 10 años. Además, necesita texturas para esas mallas, pero la generación de texturas de procedimiento es una de las formas mejor establecidas de generación de procedimientos y hay muchas herramientas para jugar: juegue con el Diseñador de sustancias para tener una idea de cómo los valores se pueden integrar juntos para hacer texturas.

Debo mencionar que la generación de paisajes también se ha realizado anteriormente, aunque no suele ser en tiempo real o en el tipo de alcance que tiene NMS. Había una herramienta brillante para el usuario final llamada Pandromeda MojoWorld, pero lamentablemente parece haber muerto, aunque todavía puede encontrar archivos de lo que generó. E-On Vue es similar y moderno, pero como se mencionó, no es en tiempo real. Si los programadores de Hello Games fueran muy listos, y sospecho que lo son, harían que el algoritmo del generador comience a ejecutarse mientras conduces por impulsos hacia un planeta. No puede cambiar fácilmente su destino sin desconectarse de la unidad de pulso y 10–20 segundos es mucho tiempo para una computadora moderna, por lo que es una gran oportunidad para que la computadora trabaje en el planeta que le ha dicho por adelantado Te diriges hacia.

Así que espero que esto haya brindado una visión general de algunas de las características de generación de procedimientos que NMS probablemente usa y alguna apreciación del “estado del arte”. La generación de procedimientos es un campo de investigación activo y la generación de algunos aspectos toca la inteligencia artificial moderna (¿puedes generar una historia de manera procesal?), Por lo que es un campo realmente interesante para explorar si tienes interés en la programación.

(¿Ah, y poder ver un planeta en la distancia y volar hacia él en una órbita realista? Si eres un viejo cascarrabias como yo, lo ignorarás como lo que hizo Starglider 2 en 1988). absoluto según los estándares modernos, pero cuando salió ese juego fue el NMS de la época).

Si desea una buena visión general de alto nivel de los entornos de juego de procedimientos (del tipo que programó Elite), vea si puede encontrar copias usadas de Infinite Game Universe: Mathematical Techniques and Infinite Game Universe, Volumen 2: Diseño de niveles, Terreno y Sonido. Parece que las copias usadas son solo un par de dólares en Amazon. Están algo anticuadas (las leí hace 15 años), pero cubren lo básico. Lee las partes que te interesan. El mayor problema que tuvieron los revisores con los dos libros es que no detallan lo suficiente, pero eso puede ser un beneficio si está buscando aprender los conceptos básicos básicos del contenido procesal.

A pesar del nombre “infinito”, el sistema no es infinito. Está limitado por los límites del valor numérico máximo que el software puede representar para una cosa. También está limitado por los límites de almacenamiento del servidor. Lo que está sucediendo es que el servidor no está creando todos los mundos por adelantado, sino que los está generando sobre la base de un algoritmo. La compañía cuenta con un número limitado de jugadores en un momento dado para manejar e incluso aquellos limitados a un cierto número de mundos en un momento dado. Sospecho que hay un montón de “zonificación” con un juego de este tamaño. Mi empresa está evitando la zonificación tanto como sea posible para el mapa mundial principal y activando nuevas instancias de servidor cuando el número de personas alcanza un punto crítico. Estamos utilizando el motor Unreal para nuestro juego y los problemas técnicos son probablemente similares a “No Man’s Sky”. Los manuales de ese motor están en línea (incluso el motor) y están disponibles para su examen y experimentación de forma gratuita para que pueda tener una idea de cómo funciona todo esto. Consulte las secciones sobre replicación del servidor y otras cosas relacionadas con el modo multijugador. Es bastante estándar para este tipo de cosas.

Necesitas un algoritmo que genere partes aleatorias y diversas, pero interesantes del juego. Esto puede ser difícil de equilibrar adecuadamente.

Además, debido a la inmensidad del juego, se deben crear muchos elementos, tanto visuales como de audio.

Las otras partes del juego no son realmente tan únicas y este juego en particular puede no ser el mejor ejemplo de cómo se hace, pero aún así, debe desarrollarse una progresión compleja y equilibrada (Tal vez un mejor juego para inspirarse en estos aspectos de el juego es Ark: Evolved. En realidad también es multijugador, pero eso no es asunto mío)

Bueno, si quieres saber cómo hacer un juego como No Man’s Sky. Este juego está hecho por mundos generados por procedimientos, lo que significa que el mundo cambia cada vez que lo juegas, y produce más mundos de acuerdo con el algoritmo programado por un desarrollador. La forma más fácil de aprender cómo hacer mundos generados por procedimientos es saber cómo hacer habitaciones o mazmorras generadas por procedimientos.

El problema que debe resolverse antes de crear un juego como No Man’s Sky es cómo lo creará. El motor del juego también es importante en este caso, así que te sugiero que uses Unreal Engine para hacer un juego así, ya que tiene muchos tutoriales sobre cómo hacerlo.

More Interesting

¿Por qué el método Java Vector's contiene () parece no llamar a mi método igual () personalizado?

¿Podría la Academia haber creado Swift?

En la práctica, ¿con qué frecuencia se realiza el análisis promedio de la complejidad del tiempo del caso?

¿Cuáles son los pasos principales de la arquitectura de software?

¿En qué aspectos el mundo real del software es más complejo que el campo de los algoritmos?

¿Con qué frecuencia te sorprende una optimización de rendimiento?

¿El soporte técnico es una marca de por vida para un desarrollador de software?

¿Qué me estoy perdiendo como ingeniero de software, si no estoy trabajando en una empresa líder como Google, Facebook, etc.?

¿Cuáles son algunos buenos libros para aprender patrones de diseño utilizando un enfoque de solución de problemas?

¿Quiénes son responsables de probar el código de automatización, desarrollador o probador?

¿Qué es el modelo de proceso de software?

¿Cómo puede un ingeniero de control de calidad o de prueba convertirse en una SDET?

¿Alguna de las principales compañías tecnológicas de EE. UU. Ha comenzado a contratar desarrolladores en el extranjero en respuesta a la escasez de mano de obra de Silicon Valley y el aumento de los salarios?

¿Qué lenguajes de programación que combinan bien deberían aprender para el desarrollo de inteligencia artificial, la ciencia de datos y el desarrollo de software?

¿Cuáles son los mayores errores conocidos de los programadores?