Tutorial Wwise en Español - Parte VII: Optimizacion

Note for my english readers: Sorry this article is not in your language but I wanted to write something for the spanish speaking community since there aren’t many resources on game audio in my native tongue. If I see that there is demand, I would be happy to translate this into english although most of the content can be found in Audiokinetic’s official resources.

Introducción

Llegamos ya a la ultima parte de esta serie, espero que te haya servido de ayuda para entender Wwise un poco mejor. En esta última entrega vamos a ver como podemos optimizar el uso de memoria y CPU para que el sonido de nuestro juego sea lo más eficiente posible.

Como la optimizacion sólo tiene sentido cuando tenemos un proyecto de mayores dimensiones, vamos a usar uno de los proyectos del curso oficial de Wwise. Los puedes encontrar en este link. Una vez lo descargues, abre el proyecto de Wwise de la leccion 7. Echa un ojo al proyecto e intenta entender para que sirve cada cosa y como funcionan los distintos eventos y objetos sonoros, con todo lo que has aprendido ya deberias poder moverte por aqui con comodidad.

Usando diferentes bancos

Una de las formas mas obvias de optimizacion es el uso de bancos. Hasta ahora, hemos puesto todos los sonidos en un mismo banco, pero para un juego completo esto no es una solucion muy eficiente. Una buena opcion podria ser tener una banco “master” o “main” que siempre cargamos y luego bancos específicos por cada nivel o area del juego. En general, siempre que en un juego haya una pantalla de carga, esta es una buena oportunidad para cargar bancos.

En el caso del proyecto que tenemos, no hay creado ningún banco todavia por lo que empezaremos por crear un banco “main” o principal que alojará los sonidos que queremos siempre disponibles. También vamos a crear otro banco para un nivel concreto del juego. Vamos a ello.

Dentro del Layout “Designer”, ve a la pestaña “SoundBanks”. Verás que bajo la “Default Work Unit”, no existe ningún banco. Crea dentro de ella un banco llamado “Main” y otro llamado “DCP_the_core”. Te recuerdo que estos nombres deben ser exactos puesto que el juego está llamándolos desde el código.

Una vez creados, ve al layout “SoundBanks” (o pulsa F7). Si despliegas la “Default Work Unit”, verás los dos bancos que hemos creado. Por ahora están vacíos, ya que debemos especificar qué eventos queremos asociar con ellos. Por ello, bajo la columna “Data Size”, aparece un tamaño de “0”. Fíjate también que podemos determinar un tamaño máximo por cada banco (“Max Size"), aunque por ahora el tamaño no está limitado por lo que aparece como infinito.

En algunas ocasiones, especialmente en juegos para consolas, sabremos mas o menos con cuanta memoria contamos para el audio del juego por lo que podremos espcificar el tamaño máximo de los bancos, o al menos hacer una aproximación. Vamos a establecer un tamaño de 9.000.000 para el banco “Main” y de 6.000.000 para el “DCP_the_core”.

Ahora podemos asignar los eventos a cada banco. En la parte inferior izquierda de este layout, verás que podemos ver todos los eventos del proyecto. Si te fijas, verás que todos los eventos del nivel que estamos construyendo (“DCP_the_core”) tienen un prefijo “DCP” que nos indica que pertenecen a este nivel. Esta es una forma muy conveniente de nombrar a los eventos ya que de esta manera, queda claro que solo son usados en este nivel. Arrástralos al banco. El resto de eventos pueden ir al banco “Main”.

Verás que por ahora, el tamaño no ha cambiado. Esto es por que necesitamos construir los bancos primero. Selecciona la plataforma e idioma y haz click en “Generate All” para construirlos. Una vez hecho esto, como puedes ver, nuestros bancos son demasiado grandes para el límite que habíamos puesto. Ten en cuenta, que esto no nos impediría en ningún caso usar estos bancos en el juego. El límite de tamaño es simplemente una constricción que nos hemos puesto nosotros mismos para que sea más fácil mantenernos en el gasto de memoria que nos hemos propuesto. Veamos entonces cómo reducir el tamaño de nuestros bancos.

Ajustes de conversion (calidad de audio y incluir/excluir audio)

He comentado varias veces en entregas anteriores que es importante usar en Wwise audio en su calidad original (a ser posible sin comprimir y en wav). El principal motivo es que cuando construimos nuestros bancos, Wwise no usa los archivos tal cual, sino que los convierte en un formato comprimido dependiendo de la calidad que le indiquemos. Por ello, esta conversión es uno de las formas más fáciles de reducir nuestros bancos.

Desde el layout “Designer”, ve a la pestaña “SharedSets” que recordarás de cuando vimos las curvas de atenuación. Verás que una de las secciones aquí es “Conversion Settings”. Bajo la “Default Work Unit” vamos a crear un nuevo ajuste de conversión llamado “SFX”.

Este será el ajuste que usemos para nuestros efectos de sonido. Primero, vamos a ver a qué elementos en concreto queremos aplicarlo. Volvemos a la pestaña “Audio” y verás un Actor-Mixer llamado “Weapons”. Selecciónalo y ve a la pestaña “Conversion”. Esta es una de las pocas pestañas que nos quedaba por ver en este panel.

Una vez aquí, podemos cambiar la configuración de conversión para este Actor-Mixer en concreto. Verás que por defecto, de usa el “Default Conversion Settings” que es el SharedSet que se crea en cualquier proyecto de Wwise vacío. Pero nosotros queremos usar el nuestro por lo que haz click en el botón con las dos flechas (>>) y elige el que acabamos de crear (“SFX”).

Una vez elegido, haz click en “Edit…”. En esta ventana podemos ver los ajustes de conversión y todos los objetos que ser verían afectados. Hay muchas cosas distintas que se pueden aplicar para reducir el tamaño de los archivos. Podemos convertir archivos stereo en mono, bajar la frecuencia de muestreo o cambiar el formato de compresión. Verás también que podemos elegir distintos ajustes para cada plataforma (windows, mac, consolas, etc…) Esto es muy útil ya que ciertas plataformas pueden ofrecernos más espacio que otras y así podemos estar listos para cada una de ellas desde el mismo proyecto de Wwise.

En nuestro caso, lo que más rápidamente va a reducir nuestro tamaño es el formato, Por ahora, verás “PCM”, lo cual significa que no estamos aplicando ninguna compresión al audio. Cambia esto por un formarto “Vorbis”, que es un formato comprimido como lo es mp3.. Esta opción nos permitirá construir bancos más ligeros sacrificando sólo un poco de calidad de sonido. Por defecto, la calidad es “4” y este valor es un buen compromiso entre tamaño y fidelidad, pero se puede cambiar si es necesario. Una vez listo, haz click en “Convert…” en la parte central derecha.. Elige tus plataformas (si ves mas de una, elige todas) y “OK”. Ahora podemos ver el tamaño original de cada archivo de audio y el convertido. Verás que los archivos son ahora notablemente más ligeros.

Para ver el impacto que esto tiene en nuestros bancos, vuelve al layout “SoundBanks” y construye de nuevo. Nuestro banco “Main” ya cumple con los requisitos que habíamos establecido mientras que nuestro otro banco especíco del nivel es aún demasiado grande. Esto los solucionaremos en breve pero mientras hay un par de conceptos con los que es importante que te quedes.

Por un lado, este SharedSet de conversión que hemos creado se pueden aplicar a cualquier otro conjunto de sonidos por lo que esta sistema es muy cómodo a la hora de asignar distintos niveles de compresión a distintos elementos. Por ejemplo, podríamos usar unos ciertos ajustes para nuestros efectos sonoros, otros para el diálogo del juego y finalmente otros para la música.

Por otro lado, ten en cuenta que en todo momento, puedes elegir si prefieres monitorizar un objeto sonoro con sus archivos sonoros asociados originales o ya convertidos. Al reproducir cualquiera de estos objetos, verás que el transporte tiene un botón que dice “Original”. Si el botón está encendido (como en la imagen inferior) esto implica que estás monitorizando el audio sin ninguna compresión. Si lo apagas, estarás oyendo el audio ya comprimido lo cual te puede dar una mejor idea de cómo sonará realmente en el juego.

Streaming

Normalmente, mientras se juega, los archivos de audio se cargan el la memoria RAM de forma que se pueda acceder a ellos de forma muy rápida. Esto es una buena solución para archivos pequeños ya que los necesitamos muy rápido (sonido de pasos, disparos, etc…) pero no ocupan demasiado espacio en al RAM.

En el caso de archivos de sonido grandes como ambientes o música esta solución no es tan adecuada ya que llenaremos la RAM demasiado y ten en cuenta que también la necesitamos para los gráficos. Por ello, en el caso de estos archivos grandes podemos llamarlos directamente desde el disco duro y así liberar RAM.

Hagamos esto con la música de nuestro juego para ahorrar memoria. Si recuerdas cuando construimos el banco de nuevo, aun nos pasábamos de nuestro límite ya que este representa a la memoria RAM del usuario final.

En el layout “Designer”, busca la musica (“Cube Main Theme”). En la pestaña general del “Property Editor” verás a la derecha “Stream”. Selecciona esta opción. No es necesario cambiar los ajustes. Una vez hecho, vuelve a contruir los bancos y ahora si que estamos dentro de los límites de memoria que nos hemos marcado, ya que el objeto no se cargará en RAM.

Optimizando gasto en CPU

Hasta ahora, todos los ajustes que hemos hecho nos han permitido usar menos memoria pero otro aspecto que podemos usar es el uso de la CPU. Cuando el juego está funcionando hay una serie de cálculos constantes que se hacen como la distancia entre objetos, transformar sonidos usando EQ o reverbs o simplemente reproducir un objeto sonoro.

Cada uno de estos objetos ocupa una “Voice” o voz. Cada una de estas voces es la unidad mas pequeña posible que canaliza un determinado sonido. Como te puedes imaginar un juego usará muchas voces, cientos de ellas, pero siempre tendremos un límite físico a cuantas de ellas podemos usar a al vez. Esto dependerá de la potencia de la CPU del usuario, que puede ser no muy grande, por lo que nuestro trabajo consiste en crear el mejor sonido posible usando una carga mínima en la CPU.

Algo que podemos ajustar para limitar el uso de voces es dejar de usarlas si el sonido contenido en ellas está demasiado distante a la jugadora y por lo tanto apenas se oye. Vamos a ver cómo podemos controlar esto. Haz click en “Project > Project Settings” o Shift + K. Verás dos opciones importantes “Volume Threshold” y “Max Voice Instances”

La primera controla a qué volumen dejará de existir cada voz mientras que la segunda especifica cuantas voces pueden existir a la vez. Como puedes ver, esto es ajustable por plataforma, permitiéndonos de nuevo optimizar el gasto de CPU para usuarios en consolas o móviles. Vamos a cambiar el umbral de volumen a -50 y las voces máximas a 40.

Como puedes imaginar, con esto estamos reduciendo el rango dinámico de nuestro juego. Ahora la diferencia entre el sonido más fuerte y el más débil será de 50dB como mucho. Reducir el numero de voces también reduce drásticamente el gasto de CPU aunque esto puede ser un problema por que en el momento en el que Wwise se quede sin voces puede dejar de disparar sonidos que son muy importantes como los diálogos. Por otro lado, ciertos eventos como una ametralladora van a usar montones de voces y esto puede hacer que nos quedemos rápidamente sin ellas.

Ve al Actor-Mixer llamado “Weapons” y a la pestaña “Advanced Settings” (que por cierto es la última que nos quedaba por ver).

Verás que aqui podemos establecer un límite para el número de instancias que queremos de un sonido o conjunto de sonidos. Haz click en “Limit sound instances to:”, elige 25 y “Globally”. Esto significa que en el juego nunca habrá más de 25 instancias de objetos sonoros de este Actor-Mixer lo que nos garantiza que no acapare procesamiento de CPU.

Por otro lado, podemos también querer darle una prioridad alta a ciertos sonidos como la música. Para ello, ve al objeto que contiene la música y en la misma pestaña, dale una prioridad de 80. Con esto le decimos a Wwise que si necesita voces para nuevos sonidos que se están disparando, la música nunca sea parada.

Sumario

¡Y esto es todo! En esta séptima y última parte, hemos visto cómo optimizar el uso de CPU y memoria, lo cual es crucial para que nuestro juego funcione lo mejor posible en cualquier plataforma.. Si tienes dudas o cualquier problema, puedes escribirme a contactme [ arroba ] javierzumer.com. Mientras tanto, dejo por aquí un glosario con todos los conceptos que he ido introduciendo en esta parte.

  • Conversion Settings: Objeto de tipo “SharedSets” que nos permite elegir cómo queremos compirmir el audio en nuestros bancos.

  • Stream: Cuando un objeto sonoro se repoduce en este modo, no se está cargando en la RAM sino que se llama directamente desde el disco duro, lo cual nos permite ahorrar espacio en memoria.

  • Voces: La unidad mas pequeña que canaliza un determinado sonido. Cada objeto sonoro que reproduce en el juego usa una voz.

  • Prioridad: Valor que podemos establecer para un objeto sonoro o un conjunto de ellos y establece cuándo un sonido será eliminado para dejar espacio a otro nuevo. Los objetos sonoros de más alta prioridad serán eliminados los últimos.