Memoria, texturas y paletas en PlayStation 1
Al estudiar la memoria de PlayStation 1 para preparar la importación de recursos, tuve que separar tres cosas: los datos del juego, los gráficos y el sonido. Cada uno utiliza una memoria distinta, así que no bastaba con calcular cuánto ocupaba una escena en total.
Por ejemplo, una escena puede dejar espacio disponible en la RAM principal y aun así superar la capacidad de VRAM con sus texturas. Lo mismo ocurre con los sonidos que se mantienen cargados. Esa separación me ayudó a definir qué información debía mostrar el engine para revisar los recursos antes de exportar.
RAM principal, VRAM y memoria de sonido
El PS1 original tiene 2 MiB de RAM principal, 1 MiB de VRAM y 512 KiB de RAM de la SPU. Aquí uso MiB y KiB para indicar las cantidades exactas: un KiB equivale a 1,024 bytes. Con tan poca memoria disponible, conviene mantener esas unidades al hacer las cuentas.
La RAM principal contiene el programa y buena parte de sus datos de trabajo. La VRAM contiene los búferes de imagen, las texturas y las paletas. La RAM de la SPU contiene datos de sonido y el espacio que necesitan funciones como la reverberación. No son secciones intercambiables de una misma reserva de propósito general. El mapa de memoria de PS1 es una referencia útil para distinguir esas regiones.
En el editor necesitaba mostrar el consumo de cada memoria por separado. Así es posible identificar qué recurso se acerca a su límite y qué cambio puede ayudar. Reducir la memoria que usa Lua, por ejemplo, no libera VRAM para una textura, porque ambos datos se almacenan en regiones diferentes.
La memoria que ocupan los búferes de imagen
Antes de agregar una textura, la propia imagen necesita almacenamiento. Tomemos un ejemplo común: una imagen de 320 × 240 guardada con dos bytes por píxel. Un búfer ocupa 153,600 bytes, es decir, 150 KiB. Mantener dos búferes de ese tipo ocupa 300 KiB.
Quedan 724 KiB de los 1,024 KiB originales, antes de considerar paletas, otras asignaciones y restricciones de ubicación. Es una configuración ilustrativa, no una distribución universal de PS1: los modos de video y las estrategias de almacenamiento de cuadros pueden cambiarla.
Esto relaciona la resolución con la cantidad de texturas que pueden permanecer cargadas. Un búfer de imagen más grande deja menos espacio para ellas. Por eso, al elegir la resolución también hay que considerar si será necesario reducir las imágenes o cargar conjuntos distintos en cada área.
Hacer estas cuentas me ayudó a entender por qué la resolución debía considerarse desde la preparación del contenido. Antes de importar las texturas de un nivel, ya se puede estimar cuánto espacio ocuparán los búferes y cuánto quedará para el resto de los gráficos.
Dimensiones y formatos de color de las texturas
Las dimensiones de una textura no describen por completo su almacenamiento. Una imagen de 256 × 256 tiene 65,536 texeles, pero la cantidad de bits por texel cambia mucho su costo.
| Representación de la textura | Datos de imagen | Datos de paleta |
|---|---|---|
| Indexada de 4 bits | 32 KiB | 32 bytes para 16 entradas |
| Indexada de 8 bits | 64 KiB | 512 bytes para 256 entradas |
| Almacenamiento de 16 bits | 128 KiB | Sin paleta indexada |
Los valores de la tabla corresponden a los datos de la imagen y su paleta. La distribución real en VRAM también depende de las reglas de ubicación y alineación. En el formato de 16 bits, además, parte de la información corresponde a un bit de control de la GPU; no son dieciséis bits dedicados únicamente al color RGB.
En una imagen indexada, cada texel selecciona una entrada en una tabla de colores, o CLUT. Por eso una paleta es más que una opción de importación. Es otro conjunto de datos gráficos que necesita ubicarse y referenciarse correctamente. La referencia de la GPU describe estos modos de textura y sus reglas de direccionamiento.
Para un pasillo industrial, por ejemplo, una paleta de 16 colores bien elegida puede ser suficiente para distinguir metal, suciedad y pintura de advertencia. Usar color directo ocupa cuatro veces más memoria de imagen, así que vale la pena comparar el resultado a la resolución del juego antes de elegirlo. La paleta afecta tanto al tamaño del recurso como a su apariencia.
La distribución de las texturas en VRAM
La VRAM está organizada en una superficie de 1024 × 512 palabras de 16 bits. Además de conocer cuántos bytes ocupa una textura, necesito saber en qué parte de esa superficie puede colocarse.
Las páginas de textura definen regiones de direccionamiento dentro de esa superficie. Como una palabra puede almacenar cuatro texeles de 4 bits, una textura de 256 texeles de ancho ocupa menos palabras en ese formato que en el de 16 bits. La ubicación de las páginas, la alineación de las paletas y los rectángulos ya ocupados determinan dónde puede colocarse cada recurso.
Esto puede dejar espacios libres que, sumados, parecen suficientes para otra textura, aunque no exista una región continua donde quepa. Es un problema de distribución: sumar los bytes disponibles no siempre permite saber si una nueva imagen puede colocarse correctamente.
Por eso me resultó importante tener una vista de esa distribución. VRAM Inspector permite relacionar una textura importada con la región que ocupa y revisar qué está utilizando el resto del espacio. Con esa información se puede decidir si conviene reducir una imagen, cambiar su modo de color o cargar menos recursos al mismo tiempo.

Una captura posterior del editor hace visible la distribución compartida: los búferes de imagen ocupan regiones grandes antes de agregar texturas y paletas. Los valores pertenecen a este proyecto de ejemplo.
Abre la imagen para verla a tamaño completo.Planear las texturas de una habitación
Al preparar las texturas de una habitación, me sirve empezar por sus elementos principales: paredes, piso, puerta, objetos e interfaz. A partir de ahí puedo revisar qué imágenes se repiten, cuáles podrían compartir paleta y cuáles necesitan detalle propio. Así, la selección de formatos responde a un conjunto concreto de recursos.
El peligro está en optimizar lo menos visible e ignorar la distribución completa. Ahorrar unos bytes de paleta no compensa una textura grande innecesaria. Por otro lado, reducir todas las imágenes puede perjudicar su legibilidad sin solucionar una mala distribución.
Entender esa relación entre los recursos y su distribución fue importante para el diseño de las herramientas de importación. Quería poder revisar una escena visualmente y, en el mismo proyecto, consultar cuánto espacio ocupaban sus gráficos y cómo estaban acomodados. Esa información permite ajustar el contenido con una razón concreta.