Tutorial BennuGD para Sega Dreamcast – Gestión de Memoria RAM

Después de la introducción con el apartado sonoro para BennuGD para Dreamcast, pasamos a un tema mucho más importante que incluso debería haberse publicado antes, pero como estoy siguiendo un orden de acontecimientos, ha tocado ahora.

Y este tema no es otro que la administración y gestión de la memoria RAM en BennuGD para Dreamcast.

ADMINSITRACIÓN DE MEMORIA EN BENNUGD

BennuGD, auto administra en cierta medida, la memoria RAM de la consola. Aparentemente cuando empezamos a trabajar todo va genial.

Las diferentes vías para almacenar elementos en la RAM, pueden ser varias, ya sea por la propia declaración de variables, funciones o procesos, etc. En este aspecto se puede decir que no hay problema, porque no reflejan un gran impacto en la RAM.

EL PROBLEMA

El problema o hándicap viene dado cuando comenzamos a cargar ficheros en la RAM, ficheros como audio, gráficos, etc. Tenemos que tratar muy bien la cantidad de ficheros y tamaño de cada uno que vayamos a usar en nuestro código, ya que cuanto mayor sea su tamaño, más memoria RAM (recordemos que la Dreamcast tiene 16Mb) ocupada.

Esto es lo normal en cualquier desarrollo, si empiezas a añadir elementos, estos evidentemente se alojarán en memoria. Lo normal sería también que podamos ir liberando la memoria o administrándola, es decir, si cargo un gráfico y este ya no lo voy a usar más, liberarlo de memoria para que su especio quede libre y así seguir teniendo RAM para usar.

Process main()
Private
   int assetId = 0;
   int audioId = 0;
Begin
   assetId = LOAD_FPG("/cd/asset_file_01.fpg");
   audioId = LOAD_SOUND("/cd/music01.mod");
End

Pues bien, esto en BennuGD para Dreamcast no funciona. ¿Cómo? … Lo que lees.

Después de debatir en los foros oficiales de BennuGD y de hacer varias pruebas entre varios usuarios, se demostró que las funciones que existen para cargar elementos en la RAM, funcionan perfectamente, pero las funciones que eliminan elementos de la RAM (como por ejemplo UNLOAD_FPG()) en Dreamcast no eliminan nada de RAM e incluso llegan a provocar que el programa se interrumpa por completo y el juego de un error interno.

Process main()
Private
   int assetId = 0;
   int audioId = 0;
Begin
   assetId = LOAD_FPG("/cd/asset_file_01.fpg");
   audioId = LOAD_SOUND("/cd/music01.mod");

   UNLOAD_FPG(assetId);
   UNLOAD_SOUND(audioId);
End

Esto es un problema enorme, para quien quiera desarrollar un juego de nivel medio/alto o con un poco más de inquietud. El problema por lo visto reside en la fragmentación de la RAM de la consola y cómo trabaja BennuGD con ella y al parecer no hay pensamiento de solucionarlo a corto plazo.

LA SOLUCIÓN

Sabiéndolo de antemano, tu única solución es la de reducir lo máximo todos los recursos de tu juego (assets) y optimizar mucho tu código para que quede siempre algo de RAM libre, no hay otra. Tendrás que jugar mucho con esos elementos y que tus recursos no saturen la RAM. ¿Cómo puedes reducir el tamaño de tus recursos?

1. Trabaja con ficheros FPG de 8bits y no de 16 o 32. Este proceso es algo completo, que redactaré y publicaré más adelante.
2. Reduce la calidad de tus ficheros de audio. Como comenté en el post anterior, optimiza tus ficheros de efectos especiales (sfx) y trabaja con música de tipo tracker.
3. Elimina los includes de ficheros que no utilices.
4. Optimiza tu código. Elimina re-declaración de variables o procesos. Elimina las variables que no uses y si puedes, intenta usar la misma para ciertas cosas, por ejemplo, ya que solo podrás reproducir una canción a la vez, para acceder a ella o reproducir otra posteriormente, utiliza una única variable para recoger su Identificador, es decir:

Process main()
Private
   int audioId = 0;
Begin
   audioId = LOAD_SOUND("/cd/music01.mod");
   PLAY_SOUND(audioId);

   Repeat
      frame;
   Until(key(_space))

   audioId = LOAD_SOUND("/cd/music02.mod");
   PLAY_SOUND(audioId);

   Loop
      frame;
   End
End

Puedes aprovechar esto mismo para los ficheros de gráficos .fpg

Si te interesa saber como crear ficheros dpf de 8 bits con la mayor compresión posible y que funcione en la Dreamcast, visita de nuevo esta web dentro de unos días, ya que estoy preparando un manual sobre el asunto. Al final, te puedes tomar esta carga o problema que nos da BennuGD como un reto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *