MetsuOS

Construyendo la plena inclusión a través del videojuego

Curso de ZXGM Básico 05 - Calibrando funcionalidad y memoria para nuestro juego 🔴②

Overbooking en el cementerio

En la nueva versión, en 128K no me ha dado problemas, si te los da a ti o en 48K te ocurre aquí tienes un método para depurarlo. Los datos de lo que ocupa cada cosa, son de la versión antigua, si obtienes nuevso datos ¡compartelos para mejorar el artículo!.

Optimizando el uso de memoria en ZXGM

En este quinto capítulo del curso básico de ZX Game Maker (ZXGM), abordamos el problema de memoria llena identificado en el capítulo anterior. Usando el archivo de mapa de memoria generado por el motor (un archivo map.txt en la carpeta output), analizaremos el uso de recursos y probaremos a desactivar funcionalidades una por una para evaluar el ahorro de memoria. Este enfoque nos permite "cincelar" el proyecto eliminando lo innecesario, liberando espacio para elementos esenciales como sprites personalizados y mecánicas de Cursed Zapatilla: La Excéntrica Cruzada de Sir Patillas.

Continuamos con nuestro ejemplo de juego de plataformas inspirado en Ghosts 'n Goblins, Ghouls 'n Ghosts y Cursed Castilla, ajustando parámetros en Tiled para optimizar bajo las limitaciones del ZX Spectrum (48K/128K). El objetivo es lograr un build funcional sin exceder la memoria disponible, preparando el terreno para capítulos futuros.

Este tutorial asume que has seguido el Capítulo Básico 04 y tienes el proyecto "cursed-zapatilla-zxgm" con el problema de memoria.

Requisitos previos

Antes de comenzar, verifica lo siguiente (basado en capítulos anteriores):

Si no tienes el problema de memoria, simúlalo activando todas las funcionalidades en Tiled para reproducirlo.

Paso 1: Analizar el mapa de memoria

ZXGM, basado en Boriel Basic, genera un archivo de mapa de memoria (map.txt) en la carpeta output tras cada build. Este archivo detalla las direcciones de memoria Z80 usadas por código, datos y secciones, ayudando a identificar qué consume más espacio.

  1. Ejecuta un build fallido: En el launcher, ve a Game/Build. Nota el error de memoria excedida.
  2. Abre la carpeta output: Busca el archivo map.txt
  3. Interpreta el mapa de memoria:
    • Es un archivo de texto con la direccion de memoria donde comienza algo y su descripcion.
    • La dirección no debe ser superior a (HEX)C000 (dato obtenido de check-memory.py en /bin)
    • En nuestro caso la direccion de memoria del último bloque es (HEX)C388: .core.__STRLEN, siguiendo el funcionamiento del check-memory.py, si restamos uno de otro nos sale que nos estamos pasando en 904 bytes (<1 KB), parece poco pero teniendo en cuenta que el juego de ejemplo tiene 4 pantallas, me preocupa.
    • Para los calculos voy a usar Online Hex Calculator 🌐 🟡③ que no estoy habituado a restar en Hexadecimal.

Paso 2: Desactivar funcionalidades y medir ahorro

Probaremos desactivando parámetros en Tiled (Mapa > Propiedades Personalizadas), recompilando y revisando el mapa para cuantificar el ahorro. Me enfocare en funcionalidades de alto consumo identificadas en documentación: música, animaciones, enemigos/tiles max, modos avanzados en primer lugar, pero vamos a hacer un diagnostico completo dirigido al diseño de juegos posteriores.

Registro los ahorros en esta tabla:

¡CUIDADO! si relizas tus propias pruebas ten cuidado de guardar el mapa en tiled a disco antes de compilar o parecerá que todo es "gratis" XD

Funcionalidad Desactivada Ahorro (B y KB) Notas Impacto en Juego
musicEnabled 405B (0.4KB) - Sin música AY
newBeeperPlayer 54B (0.05KB) - FX básicos
maxAnimatedTilesPerScreen (de 10 a 5) 0B (0KB) No tiene impacto en tamaño del juego aunque segurametne lo tenga en el rendimiento. Menos animaciones en los tiles
maxEnemiesPerScreen (de 5 a 3) 512B (0.5KB) 256B por enemigo extra, algo a tener MUY en cuenta Menos enemigos
goalItems (de 66 a 6) 0B (0KB) No tiene impacto Menos objetos a recoger
itemsEnabled 39B (0.03KB) Evaluamos si visualizar o no cosas en el marcador tiene impacto significativo (asumimos que las funciones equivalentes para otros elementos funcionan igfual). No se muestra el marcador de Items
hiScore 413B (0.4KB) Esta funcionalidad se lleva un buen pellizco de memoria. No hay puntuación in-game ni el guardado de la misma para que aparezca en la pantalla de menú
messagesEnabled 359B (0.35KB) Era previsible que algo llamado "Mensajes" ocupara algo de espacio. No hay mensajes de ayuda al interactuar con diferentes elementos del juego.

En un proceso normal se Itera hasta que quepa en 48K/128K, pero va ir mas allá, tomaremos la tabla y razonaremos los cambios de configuración que realizaremos.

Paso 3: Reevaluación de la configuración

Los tres elementos que más han impactado han sido la musioca AY (de la que por razones obvias no queremos prescindir), los dos enemigos extra por pantalla (que de momento quitaremos para dejar un maximo de 4) , la funcionalidad Hi-Score (que deactivaremos por ahora, seria deseable, pero no a ese coste) y Mensajes (que tambien desactivaremos aumentando la carga de información en el manual y/o pantalla de intro).

Lo ganado con Mensajes lo invertimos en un enemigo más por pantalla, que creo dará bastante juego, sabiendo que podemos (aunque no queremos), reducir uno mas si fuese necesario.

En lo personal si me toca reducir más me planteare si reduzco un enemigo o intento optimizar el codigo internamente (de nuevo probablemente esté siendo naif pero debo intentarlo llegado el caso).

Otros elementos que ahora considero irrenunciables como el IDLE, los evaluaremos para su desactivación si y solo si no queda otro remedio, cosa que veremos mas adelante en el desarrollo.

Con esto deberiamos ganar los 900 bytes que nos faltan compilar, y espero no tener que tocar aspectos de memoria durante el proceso de desarrollo (intuyo que estoy siendo naif al desear esto, en 8bits la pelea es contra la memoria xD)

Si todo va bien ahora, en el proximo capítulo empezamos a crear screens (y me da que a llorar por falta de memoria, tambien jajaja).

Paso 4: Verificación post-optimización

  1. Recompila final: Game/Build sin errores.
  2. Prueba en emulador: Carga .tap, verifica carga sin crashes.
  3. Revisa mapa.txt: Confirma uso < límite (HEX)C000

Parece que, por ahora, prueba superada.

Parece que esta vez si

Solución de problemas comunes

Consulta la documentación y en el grupo Telegram ZXGM cuya direccion podrás encontraren ella.

Conclusión

Hemos optimizado Cursed Zapatilla liberando memoria al desactivar funcionalidades no esenciales, usando el mapa de memoriap para guiar. Ahora, con espacio, procedemos a agregar pantallas escenarios y sprites en próximos capítulos. ¡El cincel está afilado!

Referencias Bibliográficas

One More Thing

Un escenario de retrocomputación del siglo 24

¡Desbloquea el poder de MetsuOS y descubre que la privacidad y la seguridad son la clave para desencadenar tu verdadero potencial en línea!

Contenido registrado en Safe Creative

Logo Safe Creative
¡Usa el código de promocional 7ZYM4Z y ahorrate unos eurillos en tu suscripcion de Safe Creative!

MetsuOS Needs You!

Apoyanos en este proyecto difundiendolo en tus redes, o mejor, haznos una donación a la cuenta paypal para poder dedicar más tiempo y recursos a el. No olvides comentarnos que parete te interesa más junto con tu donación.

En este momento, además de mantener los servicios, estoy centrado en crear la siguiente iteración del software que me permite hacer todo esto y creando una biblioteca personal física para poder contrastar contenido.

Sobre el sistema de validez de un contenido en MetsuOS

Empezando a incorporar los niveles de validación de un contenido (también llamada sabiduría o niveles de conocimiento) ⚫🔴 🟡 🟢 🔵⚪ ¿Qué són?

Sobre la categorización de los tipos de conocimiento

La Metsukeología (de Metsuke vision global y logos conocimiento) es la ciencia que estudia el conocimiento como un conjunto potencial de conocimiento del que podemos obtener, procesar o percibir partes concretas dentro de un marco contextual específico, y cuyo contexto general real está muy por encima de lo que somos capaces, como especie, de percibir, procesar e integrar de forma completa (definición en progreso).

La Metsucología (de Metsu aniquilación - en este contexto en forma de colapso - , logos conocimiento) es la ciencia que estudia como extraemos verdades percibidas - colapsadas - como conocimiento desde nuestra perspectiva real (tanto epistemológico como gnoseológico) al tomar una parte específica del conocimiento metsukeológico potencial enmarcado en un contexto concreto, obligando a colapsar el conocimiento potencial en conocimiento específico (definición en progreso).

Mas sobre el contexto

DISCLAIMER: Mi consideración de anticientífico respecto al consenso científico es una hipotesis de trabajo propia, que supone que toda asignación de validez, incluso aquella derivada de la conclusión por acumulación de evidencia NO debe ser supeditada a debate, ni acuerdo, debe ser algo probabilistico sin intervención del ego humano. Podría estar equivocado y, en este punto, es donde se aplicaría entonces ese mismo consenso que ahora considero no valido (incluso dañino)

Existen indicadores para algunas cuestiones adicoinales como los siguientes:

Cuando hablamos de un contenido que incluye un texto que hace referencia a otro.

También aplicaremos el Sistema de fiabilidad de fuentes y credibilidad de contenidos de la OTAN 🔴②, este sistema incluye una valoración de la fiabilidad de la fuente de A a F (siendo A la de mayor fiabilidad) y una varloración de credibilidad del contenido de 1 a 6 (siendo 1 la mayor credibilidad).

En MetsuOS la agregaremos al final uniendo amos valores como si fuera una coordenada. Por ejemplo: ⚫①-D4 o 🟡③-B2. Esto ayudarña a contextualizar la información sobre la solidez del conocimiento al que se hace referencia en cada momento.

Hay que tener en cuenta que, cuando hay elementos subjetivos o parcialmente subjetivos, el punto de referencia seré yo mismo. Quizá más adelante pueda objetivizar esto más (seria lo deseable), pero en tanto no tenga herramientas que me lo permitan, debo ceñirme al principio de honestidar intelectual, y esperar que mis sesgos dañen lo menos posible la información (en parte este es el nudo gordiano que pretendo resolver, y por ello es dificil resolverlo a priori).

Así de forma resumida, podríamos decir que esta definición es nivel 🔴② (Rojo2 xD) ¿Crees que me dejo algo? Si es así por favor ayudame a mejorarlo contactándome a través de X (Twitter) en mi cuenta, @metsuke 🌐

Consulta la versión completa de la descripcion en ⚫🔴🟡🟢🔵⚪ (🔴②) Un poco más de detalle