Todos los artículos
Arquitectura

De RPG Maker XP a Kirin: evolucionar el motor sin abandonar sus juegos

La compatibilidad no exige congelar una tecnología. Exige saber qué debe conservarse y qué puede avanzar.

RPG Maker XP2004 · Windows
mkxpRGSS independiente
mkxp-zcompatibilidad ampliada
KirinAndroid · ARM64

Una aplicación de 2026 puede abrir un juego creado para una arquitectura de 2004. Lo interesante no es solamente que funcione: es todo lo que ha debido cambiar para que el juego no tenga que hacerlo.

Kirin no nace para conservar intacto un motor antiguo y obligarlo a funcionar en Android. Nace de una pregunta más útil: ¿qué partes de aquel diseño forman la identidad y el comportamiento del juego, cuáles deben mantenerse por compatibilidad y cuáles pueden evolucionar aprovechando Ruby moderno, compilación JIT, ARM64 y una pila gráfica actual?

La respuesta no empieza en Android. Empieza con RPG Maker XP, continúa con mkxp y mkxp-z, y llega a Kirin como una sola historia tecnológica. Cada etapa conserva un contrato con los juegos y, a la vez, reduce su dependencia de la plataforma para la que fueron creados.

RPG Maker XP: el punto de partida

RPG Maker XP fue construido alrededor de Windows y de RGSS, su sistema de scripts basado en Ruby. Un proyecto no era solo una colección de mapas, gráficos y sonidos: también llevaba código que esperaba encontrar las clases, los tiempos, las entradas y las convenciones del runtime original.

En ese contexto, Ruby 1.8 no era una herencia que hubiera que sostener. Era una tecnología contemporánea. La resolución de pantalla, la gestión de ventanas, la entrada por teclado y la ruta hasta la GPU respondían al PC de principios de los 2000. El diseño tenía sentido dentro de su época.

El problema aparece cuando ese contexto se convierte en requisito perpetuo. Mantener el ejecutable, el runtime y todas sus dependencias literalmente iguales preservaría también sus limitaciones: una plataforma abandonada, supuestos propios de Windows y un intérprete que no puede beneficiarse del trabajo acumulado durante dos décadas.

mkxp: separar el juego de Windows

El primer cambio decisivo fue conceptual. mkxp buscó implementar RGSS como software abierto e independiente, con la posibilidad de ejecutar juegos sin modificar sus archivos. Ya no era imprescindible que el juego viajara unido al ejecutable original de RPG Maker XP.

Esa separación convirtió a RGSS en un contrato. Por un lado estaban los scripts y recursos del proyecto; por otro, una implementación capaz de responder a lo que esos scripts esperaban. Mientras el comportamiento observable fuese compatible, la tecnología interna podía cambiar.

La portabilidad comienza cuando se conserva la interfaz que el juego conoce, no necesariamente la máquina que la creó.

Esto abrió la puerta a otros sistemas operativos, nuevas bibliotecas y versiones más recientes de Ruby. También mostró la dificultad real: una API puede documentarse, pero un ecosistema de juegos termina dependiendo de detalles, tolerancias y comportamientos históricos que solo se descubren ejecutando proyectos reales.

mkxp-z: cuando los proyectos exigen más

mkxp-z continuó esa línea como un fork de mkxp orientado a una compatibilidad más amplia. Uno de sus objetivos originales fue ejecutar Pokémon Essentials, un caso especialmente exigente por la cantidad de Ruby que incorpora y por dependencias de API de Windows que van mucho más allá de un proyecto básico.

Con los años, Essentials, sus plugins y los fangames construidos encima formaron ecosistemas propios. No existe un único “juego de RPG Maker XP” representativo: algunos se mantienen cerca de RGSS estándar y otros añaden sistemas de combate, interfaces, datos, animaciones y bibliotecas completas.

mkxp-z acumuló soluciones para ese mundo real. Esa herencia es esencial para Kirin, pero heredar no significa detenerse en el mismo lugar.

Kirin no considera mkxp-z el destino final de esa evolución. Lo considera el siguiente punto de partida.

Kirin cambia la dirección

Un port busca normalmente llevar una aplicación a otra plataforma manteniendo su arquitectura reconocible. Kirin necesita algo más profundo. Android cambia el ciclo de vida de la aplicación, el modelo de entrada, el acceso a archivos, el audio, la memoria disponible y la forma en que se llega hasta la GPU. Los teléfonos usan ARM64 y reaccionan de otra manera al consumo sostenido, a las pausas y a la presión térmica.

Por eso Kirin no añade Android al final de mkxp-z como si fuera otra casilla junto a Windows, Linux y macOS. Revisa la cadena entera pensando en el dispositivo móvil: integra runtimes de Ruby, adapta los bindings, traduce el control táctil, conecta el ciclo de vida del sistema y utiliza un renderer nativo para la pila gráfica de Android.

El objetivo sigue siendo que el proyecto conserve sus mapas, eventos, scripts y recursos. Lo que cambia es la maquinaria que interpreta esas decisiones y las convierte en audio, imagen y respuesta.

Abandonar Ruby 1.8 sin abandonar sus juegos

Congelar Ruby en la versión asociada al motor original parece la opción más segura, pero traslada toda la deuda histórica al futuro. Kirin adopta otra estrategia: mantener perfiles compatibles cuando son necesarios y, al mismo tiempo, llevar los proyectos capaces de hacerlo hacia CRuby moderno.

  1. Código histórico
  2. Capa de compatibilidad
  3. Ruby moderno
  4. YJIT / experimentos con ZJIT
  5. ARM64

La capa de compatibilidad absorbe diferencias de sintaxis, codificación, métodos y comportamientos. Es una frontera delicada: debe reproducir lo que el juego necesita sin convertir cada particularidad antigua en una restricción permanente para todo el motor.

Arriba de esa frontera, Ruby puede seguir avanzando. Un runtime moderno aporta correcciones, mejoras en la máquina virtual y la posibilidad de compilar rutas frecuentes. YJIT ya forma parte de uno de los perfiles de Kirin. ZJIT, cuya documentación oficial describe un compilador basado en métodos y perfiles, pertenece por ahora al trabajo experimental de integración: no es todavía un runtime de producción de Kirin ni una promesa de acelerar cualquier juego.

La distinción es importante. La compatibilidad vive abajo, cerca del código histórico. La plataforma sigue avanzando arriba, donde puede aprovechar el procesador ARM64 del teléfono. Así, conservar un juego no obliga a conservar para siempre el coste del intérprete que lo acompañó en 2004.

La misma evolución ocurre en los gráficos

Ruby es solo una mitad de la historia. La otra comienza con los objetos que ve el juego —sprites, bitmaps, tilemaps, planes, windows, viewports y transiciones— y termina en una GPU móvil. Entre ambos extremos también hace falta compatibilidad sin estancamiento.

Scripting

  1. Ruby 1.8
  2. Compatibilidad
  3. Ruby moderno
  4. YJIT / ZJIT
  5. ARM64

Gráficos

  1. OpenGL histórico
  2. Semántica RGSS
  3. Renderer moderno
  4. OpenGL ES 3 / futuro backend
  5. GPU móvil

Para Ruby, un sprite continúa siendo un sprite. Un script puede asignar un bitmap, cambiar x e y, alterar la opacidad o mover el objeto entre viewports sin conocer la API gráfica situada debajo. Los bindings y la abstracción del renderer transforman esa semántica RGSS en operaciones que la plataforma moderna entiende.

La ruta de producción actual de Kirin usa OpenGL ES 3. Vulkan es una posibilidad arquitectónica para el futuro, no un backend que este artículo dé por implementado. Diseñar una frontera limpia permite investigar otras rutas sin pedir que los juegos cambien su código.

El juego no necesita saber qué API gráfica existe debajo. La abstracción permite evolucionar el renderer sin hacer evolucionar a la fuerza todos los proyectos.

OpenGL, Vulkan, Mesa, driver y GPU no son sinónimos

Una API gráfica es un lenguaje para describir trabajo; un renderer decide qué trabajo producir; un driver traduce los comandos para un hardware concreto; y la GPU los ejecuta. Mesa es un conjunto abierto de implementaciones de API gráficas y drivers. Resulta útil para comprender la separación de capas, pero no es una etapa obligatoria de la ruta actual de Kirin en Android.

Diagrama con distintas tecnologías gráficas alrededor del concepto de API gráfica
Panorama ilustrativo de tecnologías gráficas, compartido por O_Schramm en r/GraphicsProgramming. No todas las tecnologías mostradas pertenecen a la misma categoría: por ejemplo, CUDA es una API de cómputo y MoltenVK una capa de traducción.
Kirin y semántica RGSSRendererAPI gráfica: OpenGL ES 3Implementación y driver del dispositivoGPU móvil

En muchos teléfonos, OpenGL ES llega a la GPU mediante el driver que proporciona el fabricante del dispositivo. En otros entornos, una implementación como Mesa puede ocupar parte de esa capa. Vulkan ofrece otro modelo de API, más explícito, pero tampoco elimina el driver ni convierte automáticamente una carga 2D en una carga más rápida.

Esta precisión evita una conclusión fácil: “Vulkan es nuevo, luego OpenGL es malo”. OpenGL ES sigue siendo una solución razonable para un motor 2D como Kirin. El desafío principal no es dibujar millones de triángulos con iluminación física o trazado de rayos. Es presentar una gran cantidad de imágenes 2D con orden, recorte, mezcla y tiempos estables.

Los verdaderos costes de un renderer 2D

Una escena visualmente sencilla puede generar una ruta complicada. Un tilemap contiene capas y autotiles; una interfaz combina muchas ventanas; una animación reemplaza regiones de textura; un menú puede regenerar bitmaps; y decenas de sprites cambian de tono, origen, zoom o viewport durante el mismo frame.

  • Cambios de textura
  • Uploads de imágenes
  • Creación y destrucción de recursos
  • Draw calls pequeños
  • Sincronizaciones CPU/GPU
  • Conversiones de formatos
  • Orden y recorte de sprites
  • Trabajo repetido entre frames

Reducir esos costes puede importar más que cambiar el nombre de la API. Si el renderer detecta que un bitmap no cambió, puede evitar una transferencia. Si conserva recursos, agrupa operaciones compatibles o minimiza cambios de estado, entrega menos trabajo al driver. Si evita esperar innecesariamente a la GPU, Ruby puede comenzar antes el frame siguiente.

La modernización real ocurre en esas decisiones. OpenGL ES 3 ofrece hoy una base conocida y disponible en Android; una abstracción bien diseñada deja abierta la posibilidad de otro backend cuando exista una ventaja demostrable. El criterio no es la novedad, sino el comportamiento medido en juegos reales.

Conservar el contrato, transformar la máquina

Visto desde un script, la continuidad parece casi trivial:

sprite.bitmap = bitmap
sprite.x = 120
sprite.y = 80

Debajo de esas tres líneas existe una cadena que puede cambiar por completo: la versión de Ruby, el modo de ejecutar el método, la representación nativa del objeto, la cola de renderizado, la API gráfica y el driver. La semántica permanece; la implementación evoluciona.

Ese principio también permite avanzar con prudencia. No todos los juegos toleran el mismo runtime ni se benefician de la misma optimización. Kirin puede mantener rutas distintas, medir proyectos reales y mover la frontera de compatibilidad sin presentar cada experimento como una función terminada.

Kirin intenta conservar el juego, no conservar las limitaciones del motor que originalmente lo ejecutaba.

Una línea evolutiva, no cuatro motores aislados

RPG Maker XP definió el lenguaje que los juegos conocen. mkxp demostró que ese lenguaje podía separarse de Windows. mkxp-z amplió la compatibilidad para proyectos mucho más complejos. Kirin recoge esa historia y la lleva a Android, donde Ruby moderno, JIT, ARM64 y una pila gráfica móvil pueden convivir con contenido creado veinte años antes.

La evolución no borra lo anterior. Lo convierte en una capa estable sobre la que es posible construir. Cada vez que un mapa se abre, un evento responde o una batalla conserva su lógica, la compatibilidad cumple su función. Cada vez que el runtime evita trabajo repetido o el renderer entrega mejor un frame a la GPU, la plataforma avanza.

Esa es la ambición técnica de Kirin: que los juegos no tengan que elegir entre su historia y el hardware actual.

Prueba Kirin en Android

Consulta la guía de instalación y añade un proyecto compatible a tu biblioteca.

Ver guía de instalación