Para empezar, repasemos la pantalla física de esta consola, que es donde el usuario puede apreciar todo lo que se analiza en esta sección.
Pantalla
La PSP incorpora una pantalla LCD TFT de 4,3 pulgadas. Tiene una resolución de 480 × 272 píxeles (para referencia, aproximadamente 2,6 veces los píxeles de una sola pantalla de la Nintendo DS) y puede mostrar hasta 16.777.216 colores. Se trata, por tanto, de una profundidad de color de 24 bits (la denominada escala 'true color').

Comparación de resolución de pantalla y relación de aspecto entre la Game Boy, la Game Boy Advance, la Nintendo DS y la serie PSP.
La relación de aspecto es casi 16:9, un formato que por aquel entonces se estaba convirtiendo en estándar en los televisores domésticos. Una vista más amplia supone también una oportunidad para los diseñadores de juegos de enriquecer la experiencia (especialmente en el género de los shooters en primera persona).
Presentando el Graphics Engine
Es el momento de hablar del componente encargado de producir píxeles: el Graphics Engine (GE). Este motor reside dentro del 'grupo del sistema', convirtiéndose efectivamente en un 'grupo dentro de otro grupo'.

Kingdom Hearts Birth by Sleep (2010).

Grand Theft Auto: Vice City Stories (2006).

OutRun 2006: Coast 2 Coast (2006)
El GE dibuja gráficos 3D (polígonos) con numerosas funciones aplicadas (como mapeado de texturas, iluminación y mucho más), que veremos en breve.
Arquitectura del Graphics Engine
El subsistema GE tiene muchas peculiaridades interesantes que comentar, por lo que esta será una sección muy densa. ¡Pero no te preocupes! Intentaré ir paso a paso para evitar confusiones.
Para empezar, el GE consta de tres componentes :
- El núcleo gráfico: donde tiene lugar la funcionalidad gráfica propiamente dicha.
- El controlador de eDRAM: media el acceso entre la memoria eDRAM y el núcleo.
- La bus matrix: actúa como 'árbitro de bus' entre el bus del sistema y los componentes internos del GE (recuerda que el GE se encuentra dentro del grupo del sistema).
- En realidad, este componente es una malla de cables con algo de lógica, pero para simplificar la explicación es más cómodo tratarlo como una caja negra.
La razón de este diseño es que tanto la CPU principal como el núcleo gráfico pueden acceder a esos 2 MB de eDRAM. Para evitar la congestión, el tráfico interno del GE circula por otro Advanced High-performance Bus llamado bus local ('local' desde la perspectiva del GE). Esto permite al núcleo gráfico realizar sus funciones sin depender del bus del sistema para mover datos (y evita así bloquear al resto del sistema).

Arquitectura del Graphics Engine.
El bus local tiene el mismo ancho que el bus del sistema (128 bits), pero, si con eso no bastara, el núcleo gráfico dispone de una línea directa a la eDRAM mediante un bus de 512 bits (formado por dos buses unidireccionales de 256 bits). En la siguiente sección verás por qué es necesario.
¿Y cómo se comunican la CPU y el GE entre sí? Como ya se ha mencionado, tanto la CPU como el núcleo gráfico pueden leer de la eDRAM. Además, el núcleo gráfico puede acceder al bus del sistema para obtener datos de cualquier otro componente (incluida la memoria principal). Nada de esto ocurre por arte de magia, claro.
En pocas palabras, dos bloques de bus matrix reconfiguran la conexión entre el bus local y el bus del sistema. Siempre que algún componente quiere acceder a un bus 'ajeno', las bus matrices configuran la comunicación para que esa unidad se convierta en master de ambos buses sin que ninguna otra interfiera; esta situación se mantiene hasta que la unidad designada termina la transferencia.
Este comportamiento me recuerda a la técnica del bus mastering, donde el componente que lidera es el 'bus master' y tiene control total del bus, mientras el resto permanece como 'esclavo' a la espera de órdenes. Sin embargo, no tengo claro qué protocolo o estándar intentaron replicar los ingenieros de Sony. Según mi comprensión, podría guardar cierta similitud con I²C, un protocolo de comunicación en serie (especialmente útil en sistemas embebidos) que también implementa bus mastering.
Organización del contenido
Ahora que conocemos los componentes disponibles y cómo interactúan, veamos qué información relacionada con los gráficos podemos almacenar en memoria.
Hay tres ubicaciones de memoria de las que el GE acaba leyendo o en las que acaba escribiendo:
- 2 MB de eDRAM: la eDRAM ya mencionada. Se utiliza para almacenar el frame buffer, el z-buffer y el búfer de texturas. Sus contenidos son escritos directamente por el GE. Este espacio de memoria también se denomina 'memoria local'.
- La CPU puede acceder a esta memoria si es necesario, aunque su velocidad no es la idónea.
- 32 MB de DDR SDRAM: es el área de trabajo de la CPU para construir Display Lists, datos de vértices, datos de texturas y CLUTs (tablas de consulta de color). En el contexto de los gráficos, este bloque se denomina 'memoria host'.
- 16 KB de SRAM: la memoria Scratchpad también es accesible tanto por la CPU como por el GE.
Funcionalidad
Al igual que su hermana de sobremesa, el sistema gráfico de la PSP se centra en la rasterización. Sin embargo, la VRAM de la PSP es la mitad que la de la PS2, y su bus no es tan rápido. Para compensarlo, el Graphics Engine de la PSP incorpora un procesador vectorial.

Diseño del pipeline del Graphics Engine.
He omitido las interfaces para no complicar el esquema en exceso.
El pipeline gráfico es muy similar al de la PS2, con la adición de la etapa de procesamiento vectorial. El núcleo gráfico se divide en dos áreas: el surface engine, que se ocupa del procesamiento vectorial, y el motor de renderizado que, como su nombre indica, realiza la rasterización y los efectos .
Aunque sus características han sido documentadas anteriormente , los detalles del propio pipeline gráfico no lo han sido. Lo cierto es que los programadores no dependen de esa información para desarrollar sus juegos. Sin embargo, en aras de este análisis, he elaborado un modelo propio.
Por otro lado, he decidido abordar esta sección con mayor profundidad técnica que en artículos anteriores. Me pareció una buena oportunidad para introducir nuevos conceptos y ampliar la visión sobre los gráficos por ordenador. Dicho esto, te recomiendo encarecidamente leer sobre los sistemas gráficos de la PS1 y la PS2 antes de continuar.
Comandos
El Graphics Engine se controla mediante 'Display Lists' tradicionales almacenadas en la memoria principal. La CPU las construye y la GPU las lee (mediante Acceso Directo a Memoria). Las Display Lists básicamente indican a la GPU qué dibujar, cómo y dónde. En el caso de la PSP, las Display Lists no se limitan a las tareas de renderizado: también pueden incluir transformaciones vectoriales.
La estrategia implementada para procesar las listas es fundamental para que la CPU y la GPU trabajen de forma concurrente y no se bloqueen mutuamente. Queremos que la GPU acelere las operaciones, no que sea una carga. Por ello, tanto la CPU como la GPU admiten deferred rendering , una técnica que permite a la CPU construir el siguiente conjunto de Display Lists mientras la GPU procesa el anterior. El GE se configura especificando dónde comienza la Display List en memoria (dirección base) y dónde termina (dirección de parada). En consecuencia, hay dos formas de asignar una lista:
- Doble búfer: hay dos áreas de Display List separadas. Una se está transfiriendo a la GPU y la otra la está rellenando la CPU. Cuando ambos procesadores terminan, intercambian sus roles.
- Controlada por almacenamiento: la CPU rellena la misma lista que la unidad DMA está transfiriendo a la GPU, pero la CPU va algunos pasos por delante para evitar solapamientos. Consume menos memoria, pero es susceptible a bloqueos si la GPU alcanza a la CPU.
Además, la unidad DMA de la GPU no es una mera 'copiadora de memoria sin inteligencia': también puede interpretar los datos transferidos . Así, las Display Lists pueden incluir comandos como jump y return para indicar a la DMA que salte y obtenga datos de otra ubicación. Esto evita que la CPU tenga que incrustar grandes recursos (modelos, texturas, etc.) en las Display Lists (lo que duplicaría los datos en memoria) y reduce el consumo de ancho de banda. Este sistema fue heredado de la PS2.
Por último, la DMA también puede interpretar datos de bounding box: combinados con información almacenada en el GE, la DMA omitirá los comandos de dibujo que queden fuera del área de visualización. También es posible declarar bounding boxes dentro de otras bounding boxes, aunque ese tema lo dejamos para otro día.
Procesamiento vectorial

Etapa de procesamiento vectorial.
El Graphics Engine debuta con la capacidad de realizar operaciones sobre vectores, lo que permite descargar gran parte del trabajo de la CPU. Sony diseñó esta unidad para acelerar tareas comunes que antes realizaban las VPU de la PS2 mediante microcode . Aunque el GE no es tan flexible como una VPU (es una unidad de función fija), simplifica considerablemente la programación (dado que el microcode tenía un peso notable en la curva de aprendizaje). El procesador vectorial del GE se denomina surface engine.
El surface engine aborda tres tipos de tareas. La primera es la operación con superficies paramétricas . ¿Recuerdas la sección 'Mundos infinitos'? Sony explicó que, si bien la PS2 era capaz de esto, al final muy pocos juegos se molestaron en aprovecharlo. Es posible que el rendimiento de polígonos, junto con la dificultad de diseño e implementación, fuesen los factores determinantes.
Para abordar esto, el surface engine implementa dos curvas paramétricas:
- Bézier: una función relativamente rápida, aunque sus parámetros modifican la forma global. Además, sufre de 'problemas de continuidad' que se manifiestan como grietas en las superficies (lo que desaconseja su uso en animaciones). Se utiliza habitualmente para la generación de paisajes.
- B-spline: requiere más cómputo, pero soluciona los problemas de continuidad y ofrece control localizado. El modelado y la animación de personajes son candidatos naturales.
Ambas admiten niveles de detalle, lo que significa que los desarrolladores pueden establecer un valor arbitrario para modificar el nivel de subdivisión (con impacto en la calidad del modelo resultante).
La segunda tarea se denomina vertex blending, una técnica empleada para animaciones. El surface engine ofrece dos tipos:
- Skinning (o animación esquelética): el movimiento se basa en una estructura de 'articulaciones' unidas al modelo del personaje. Se aplica habitualmente para animaciones estándar (caminar, saltar, etc.).
- Morphing: utiliza múltiples instancias de un modelo y las promedia para obtener un 'efecto de transición' (mediante interpolación lineal). Se usa principalmente para animaciones artificiales (es decir, movimientos faciales) y efectos especiales. Conlleva un mayor consumo de memoria y una curva de aprendizaje más pronunciada.
Es importante señalar que la CPU puede seguir necesitando calcular animaciones para procesar la lógica del juego (como la detección de colisiones), por lo que no puede delegar todo el trabajo.
Por último, el surface engine también realiza scissoring (descarte de vértices fuera del viewport o de un área rectangular).
Rasterización
La siguiente etapa de la generación gráfica tiene lugar en el motor de renderizado (omitiendo el procesador de comandos). Aquí, los datos vectoriales se transforman en píxeles, lo cual es perfectamente comparable a cualquier otra GPU del mercado.
El motor dibuja muchos tipos de primitivas: puntos, líneas, tiras de líneas, triángulos, tiras de triángulos, abanicos de triángulos y sprites (formados por rectángulos 2D). También incluye una unidad llamada 'analizador diferencial digital' que se emplea para interpolar valores durante la rasterización y el mapeado de texturas.
Los desarrolladores pueden suministrar una matriz de proyección para aplicar la transformación en perspectiva. Esto convierte su mundo 3D en un espacio 2D (para poder verlo en pantalla), usando la cámara virtual como modelo. Se da por sentada la implementación de características modernas como la precisión de subpíxel (de lo contrario, los usuarios habrían notado su ausencia de inmediato).
Texturas
Este quizá sea el tema que más interesa a algunos. Los polígonos (ahora meros píxeles) pueden pintarse con texturas. En esta etapa, los mapas de textura se leen de la memoria y se procesan con diversas funciones. Este proceso se denomina mapeado de texturas.
El motor de renderizado dispone de tres modos de mapeado o, en otras palabras, tres formas de procesar los mapas de textura:
- Mapeado UV: cada coordenada del modelo se mapea a una coordenada de la textura.
- Mapeado proyectivo: en pocas palabras, simula un proyector físico que proyecta un mapa de textura sobre una superficie.
- Mapeado de sombreado: proyecta hasta cuatro luces (ambiental, direccional, puntual o focal) sobre el modelo. Es útil al combinar el resultado con otro mapa (lo verás con más detalle en la siguiente sección).
- Si los programadores suministran un mapa de textura en lugar de un color sólido, el resultado es un efecto 'ojo de pez' (útil para reflexiones, es decir, mapeado de entorno).
- Este modo también permite el toon shading.
Las texturas pueden usar tablas de consulta de color o 'CLUTs' para reducir su tamaño. Además, este motor aplica perspective correction y bilinear o trilinear filtering para la interpolación.
En otro orden de cosas, el GE dispone de 8 KB de caché de texturas para ahorrar ancho de banda. La caché emplea el algoritmo 'Least Recently Used' para gestionar el espacio.
Por último, aunque el pipeline no es programable, los desarrolladores pueden enviar colores adicionales para mezclarlos con las texturas. También hay duplicación de color (que duplica el valor RGB de los colores), adición de color (que combina un color primario con uno secundario) y niebla (que difumina los polígonos lejanos).
Píxeles

Etapa de operaciones sobre píxeles.
Llegamos al final del pipeline. La geometría inicial se ha transformado en píxeles, que ahora están richamente coloreados, así que ha llegado el momento de decidir qué hacer con ellos.
Algunos píxeles pueden corresponder a geometría que no es necesaria para el frame actual (por ejemplo, porque está ocluida o enmascarada). Para filtrarlos, el GE puede realizar las siguientes pruebas:
- Scissoring: descarta polígonos fuera de un área arbitraria.
- Rango de profundidad: descarta polígonos demasiado lejanos o demasiado cercanos (los desarrolladores establecen los valores de referencia).
- Color: descarta píxeles iguales o distintos a un valor RGB.
- Alfa: compara el valor alfa del píxel con un valor de referencia.
- Stencil: similar al alfa, pero se basa en el valor de stencil.
- Prueba de profundidad: Z-buffering tardío.
A continuación, los píxeles también pueden pasar por estos bloques opcionales para efectos adicionales:
- Mezcla alfa: combina los píxeles no opacos con los del frame buffer usando diferentes operadores aritméticos.
- Dithering: suaviza los cambios de color.
- Limitación de color: ajusta los valores RGB para que encajen en el formato del frame buffer.
- Operación lógica: decide cómo combinar el nuevo frame con el frame buffer existente usando operadores lógicos (
AND,ORy muchos más). - Enmascaramiento: como su nombre indica, enmascara el z-buffer o el frame buffer.
Funciones complejas como el antialiasing son el fruto de una combinación estratégica de los elementos anteriores. Por último, el píxel resultante se escribe en el frame buffer, que a su vez se envía a la pantalla.
Observaciones
Como se ha evidenciado, la PSP hereda diversas características de la PS2. La diferencia, sin embargo, es que gran parte de esta funcionalidad está ahora grabada directamente en el silicio, en lugar de ofrecer numerosas unidades programables de propósito general (que requieren configuración manual). Presumiblemente, esto se hizo por dos razones: utilizar menos transistores (para que quepa en el Tachyon y la placa base siga siendo 'portátil') y facilitar la portabilidad de las bases de código de PS2 a la nueva consola.
Diseño de modelos
Para ilustrar cómo este diseño influyó en el modelado, y para facilitar la comparación con la PS2 y la Nintendo DS, aquí hay dos ejemplos de modelos diseñados para la PSP.

Modelo interactivo disponible en la edición moderna
Metal Gear Solid: Portable Ops Plus (2006).
1.383 triángulos.

Modelo interactivo disponible en la edición moderna
Daxter (2006).
1.374 triángulos.
Salida de vídeo
El primer modelo de esta consola (modelo '1000') cuenta con un puerto de vídeo propietario llamado remote port en la esquina inferior izquierda (junto al conector de auriculares).

Esquina inferior derecha de la PSP (modelo 3000) mostrando la 'Video Out' propietaria.
El remote port utiliza el protocolo RS-232 , un viejo estándar para la transferencia de datos en serie. Aunque las especificaciones no estaban disponibles públicamente para los desarrolladores (ni mucho menos documentadas), aparecieron en el mercado un par de auriculares con botones de control. Aparentemente, emplean el puerto serie para enviar comandos (reproducir, pausar, etc.) a la consola.
En los modelos posteriores ('2000' y '3000'), el remote port se amplió con un patillaje YCbCr adicional. Sony distribuyó tres cables de vídeo (por componentes, S-Video y compuesto) que se apoyan en esta interfaz para transmitir la pantalla de la PSP al televisor.
El cable de vídeo envía un frame con una resolución de 720 × 480 píxeles (en NTSC) o 720 × 576 píxeles (en PAL), ya sea en modo progresivo o entrelazado (esta última opción solo está disponible en el modelo 3000). Como la resolución nativa de la PSP es de 480 × 272 píxeles, los juegos muestran barras negras para preservar la relación de aspecto. Sin embargo, estas barras no aparecen cuando la consola ejecuta la interfaz visual 'XMB', que soporta de forma nativa el ajuste de su resolución según el cable de vídeo.





