Análisis en profundidad: mejora del sistema de animación y combate

16 de febrero de 2024
|
General

¡Saludos, aventureros!

Vamos a mejorar nuestro viejo sistema de animaciones y combate para aumentar su rendimiento en zonas con muchos jugadores junto al lanzamiento de Season of the GuardianNo está nada mal, Este sistema, que hemos apodado cariñosamente Slayer Script, nos permitirá introducir cambios en los combates con más facilidad a partir de ahora. Hemos hecho todo lo posible por conservar las sensaciones del juego, pero queremos conocer lo que opináis de los cambios. Acompañad a Kevin Christensen, director técnico, para analizar en profundidad el proceso de desarrollo, los retos y lo que el sistema significa para el futuro de New World.

Slayer Script

Slayer Script es un idioma de comandos basado en C++. Se compila de forma nativa y New World lo carga dinámicamente para ofrecer el mejor rendimiento posible y actualizar las secuencias de comandos al instante. Puede iniciar eventos (aparición de enemigos, reproducción de sonidos...), respuestas a eventos (cuando muere un enemigo, cuando un jugador entra en un cuarto...), reproducir animaciones, controlar movimientos y mucho más. Se puede concentrar mucho en pocas líneas de código.

Proceso de desarrollo

New World tiene una enorme cantidad de objetos que hay que actualizar con frecuencia, por lo que no es fácil usar los idiomas de secuencias tradicionales. Estos idiomas, como Lua, se deben interpretar, lo que impide aprovechar optimizaciones de hardware. Aunque el rendimiento de la ejecución de Lua es bueno, en New World habría que usarlo para cientos de objetos. El sobrecoste y el gasto de memoria serían excesivos. Necesitábamos la solución más rápida posible que tuviese un impacto dentro de lo aceptable en el ritmo de desarrollo.

El sistema de comandos de personajes original funcionó bien durante el desarrollo, pero el crecimiento de New World creó problemas de adjudicación de rendimiento, memoria y tiempo de ejecución. Así, el Slayer Script se convirtió en un proyecto paralelo alternativo. Redujo el coste a unas pocas adjudicaciones y su código compilado de forma nativa es muy compacto, lo que reduce significativamente la memoria necesaria.

La idea inicial era usar el Slayer Script para controlar al jugador, que es el objeto de New World más pesado. Gran parte del diseño se centró en leer las acciones del jugador y controlar las animaciones. Esta tarea iba a llevar mucho tiempo, pero resultó que el primer equipo en usar el Slayer Script fue el de expediciones, que no necesitaba ni las acciones del jugador ni animaciones. Fue entonces cuando el idioma cambió a una finalidad más general. Hace muy poco tiempo que usamos el Slayer Script para su propósito original.

Objetivos

Hemos convertido a mano más de 400 acciones al nuevo sistema para garantizar que la jugabilidad no cambia. Nuestros objetivos eran:

  • Utilizar C++ compilado nativamente para que fuese lo más rápido posible.

  • Reducir los estados que hay que almacenar para aligerar el peso en memoria.

  • Mejorar la adaptabilidad con una arquitectura que tuviese menos impacto en la ejecución de nuevos comportamientos.

  • Permitir los cambios en caliente para facilitar el desarrollo.

  • Simplificar las correcciones de errores.

Al final, la reducción del uso de memoria fue el problema más fácil de resolver. Slayer Script fue diseñado para almacenar el estado en una ubicación y todo el comportamiento se creó de forma que se pudiese compartir con todas las instancias de una secuencia de comandos.

La adaptabilidad será un trabajo continuo. Incluso C++ se puede usar de forma ineficaz. Hay que tener cuidado al añadir nuevas funciones, pero C++ tiene muchas opciones de control del rendimiento y de la ejecución de operaciones.

En el sistema anterior era difícil corregir errores. Creamos herramientas para esto, pero no podíamos analizar la ejecución paso a paso. Ahora, cualquier diseñador con un depurador puede establecer puntos de parada, inspeccionar la memoria y analizar los pasos de ejecución de la secuencia. Depurar el sistema anterior suponía un gran gasto de tiempo debido al proceso. Seguirá siendo difícil para secuencias complejas, pero al menos el método es simple.

Desafíos

El principal obstáculo ha sido mantener la velocidad de producción. Los diseñadores necesitan poder ver con rapidez el resultado de su trabajo. Con un idioma compilado, esto significaba cerrar el juego, hacer los cambios, compilar y volver a ejecutar el juego. Slayer Script está creado en un módulo que se puede cargar con el juego abierto. Recargar módulos de forma dinámica puede ser delicado, así que sus referencias a objetos se deben liberar antes de cerrarlo y recuperar al recargarlo. Si hay algún error, el juego y las herramientas se pueden quedar colgados.

Con C++, el coste de memoria y rendimiento del sistema tiene un gran potencial desde el principio. Este idioma está hecho para desarrollar aplicaciones potentes, por lo que debe ser lo más eficiente posible. Tiene madurez y muchas herramientas que ayudan a desarrollar y medir el rendimiento.

Otro de los retos fue ocultar las complejidades de C++ de los usuarios de Slayer Script. En ocasiones es un idioma difícil de utilizar, pero, al usarlo en secuencias de comandos, no debería ser más complejo que otros. Todavía tenemos mucho que mejorar en este aspecto y seguiremos trabajando para ello.

Esperamos vuestros comentarios del PTR de Season of theNo está nada mal, Gracias por vuestro apoyo y nos vemos en Aetérnum.

Compartir