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

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):
- Entorno ZXGM configurado con Tiled y el launcher (zxsgm.py).
- Proyecto base de Cursed Zapatilla creado y con build fallido por exceso de memoria.
- Editor de texto para ver el archivo map.txt (e.g., Notepad++ o VS Code).
- Emulador de ZX Spectrum para pruebas post-optimización.
- Acceso a la documentación oficial de ZXGM (enlaces en referencias bibliográficas).
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.
- Ejecuta un build fallido: En el launcher, ve a Game/Build. Nota el error de memoria excedida.
- Abre la carpeta output: Busca el archivo map.txt
- 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
- Recompila final: Game/Build sin errores.
- Prueba en emulador: Carga .tap, verifica carga sin crashes.
- Revisa mapa.txt: Confirma uso < límite (HEX)C000
Parece que, por ahora, prueba superada.

Solución de problemas comunes
- map.txt no generado: Build fallido; revisa logs en terminal.
- Memoria aún excedida: Desactiva más (e.g., keysEnabled, itemsEnabled).
- Emulador crashes: Verifica modo 48K/128K coincide con enabled.
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
- Mis pruebas de campo ⚫①
- Documentación oficial del proyecto 🌐🟡③
- Repositorio de Github de ZX Game Maker 🌐🟡③ .
- Página de Itch.io del proyecto 🌐🟡③
One More Thing

¡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
¡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?
- ⚫① - Dark1 - Conocimiento en Bruto. Modo Cuñao, hablo pero no puedo respaldarlo.
- 🔴② - Rojo2 - Conocimiento Impulsivo, pasional, "lo mio es lo correcto".
- 🟡③ - Yellow3 - Conocimiento Crítico: se comienza a explorar el hecho de que pueda haber otras perspectivas.
- 🟢④ - Green4 - Conocimiento Natural: Surge al comprender la naturaleza de la realidad y del ser humano en una materia.
- 🔵⑤ - Blue5 - Conocimiento Científico: Supone la suma de las fases anteriores aplicando el rigor de lo descubierto por la ciencia hasta ahora, sin caer en la -anticientífica- "opinión científica/opinión de expertos".
- ⚪⑥ - Light6 Conocimiento Consolidado: Se alcanza al integrar todo lo anterior desde una perspectiva empática y asumiendo una verdad probabilística dinámica dependiente del contexto.
Sobre la categorización de los tipos de conocimiento
- Conocimiento Gnoseológico: ⚫① 🔴② 🟡③ 🟢④
- Conocimiento Epistemológico: 🔵⑤
- Conocimiento Metsukeológico: ⚪⑥
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:
- 🌐 - Contenido Externo sobre cuya validez/validación no tenemos control (usualmente enlaces que salen de #MetsuOS)
- ⚖️ - Analisis
- ⚖️📚 - Análisis Bibligráfico
- ⚖️🔬 - Análisis Científico
- ⚖️🏛️ - Análisis Estructural
- ⚖️🧠 - Análisis Filosófico
- 📖 - Referencia
- 📖📚 - Referencia Bibliográfica / Libro
- 📖🔬- Referencia Científica / Paper
- 📖🏛️ - Referencia Estructural
- 📖🧠 - Referencia Filosófica
- 🔍️- Paradigma
Cuando hablamos de un contenido que incluye un texto que hace referencia a otro.
- 🔴②-🌐🟡③ - Nivel del contenido del documento Rojo2, nivel del contenido externo del que habla el documento Yellow3.
- 🔴②-⚖️📚 🔴② - Nivel del contenido del documento Rojo2, en base a análisis bibliográfico nivel Rojo2
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
- Información IA: Generado asistido por IA (Grok-3, Veo2, Raúl Carrillo aka Metsuke). Supervisado por Humano.
- Ultima Modificación: 2025-09-07 02:25:56.264000+00:00
- Versión Documento: 0.2.7