Que alguien logre poner a funcionar Doom en Paint suena a broma, pero es exactamente lo que ha hecho Mark Russinovich, director de tecnología de Microsoft Azure. Su proyecto, bautizado DoomPaint, consigue que el clásico de los años noventa sea perfectamente jugable dentro de Microsoft Paint, esa herramienta de dibujo que casi todos hemos usado alguna vez para garabatear cuatro líneas. Y lo mejor es que no hay que configurar nada raro para verlo en marcha.
El truco tiene su gracia. No se trata de meter el motor del juego dentro de la aplicación de dibujo, sino de algo mucho más ingenioso. Cada fotograma se copia al portapapeles de Windows y se pega en el lienzo como si estuvieras editando un documento normal y corriente. Así, fotograma tras fotograma, la ilusión de movimiento aparece sola. Y no hablamos de algo lento, porque el resultado llega hasta 35 fotogramas por segundo en su resolución nativa. En pantalla parece que Paint esté ejecutando el juego, pero la realidad es otra. El propio Russinovich lo deja claro en la documentación del proyecto con una frase que resume todo, Paint renderiza el juego pero no lo computa.
ViZDoom, el motor que trabaja en la sombra
Todo el cálculo pesado recae en ViZDoom, una plataforma basada en ZDoom que en su origen se pensó para investigación en aprendizaje automático visual. Este motor ejecuta sin interfaz gráfica propia el shareware DOOM1.WAD, que corresponde al primer episodio del juego original, y echa mano de los WAD de Freedoom, publicados bajo licencia BSD, para rellenar los mapas que esa versión no trae de serie.
Al funcionar en lo que se conoce como modo headless, ViZDoom deja toda la parte visual en manos del proceso que gestiona el portapapeles. Nosotros solo vemos el resultado dentro del lienzo de Paint. Cada fotograma se transforma en un mapa de bits independiente del dispositivo y viaja hacia el portapapeles. DoomPaint permite elegir el mapa inicial con el parámetro map, alternar entre el shareware y las fases de Freedoom con wad, y ajustar la dificultad de 1 a 5 con skill. El motor arranca directamente sobre el mapa elegido, sin pantallas de título ni menús de por medio, y todo esto sin necesidad de comprar ninguna copia comercial del juego.
El verdadero quebradero de cabeza estaba en la sincronización
Aquí viene lo interesante. Russinovich explica que el mayor obstáculo técnico no fue generar las imágenes, algo relativamente sencillo, sino evitar que Paint las leyera cuando todavía estaban a medio escribir. La primera versión sobrescribía el portapapeles sin parar y, a veces, reemplazaba los datos de un fotograma antes de que la aplicación terminara de procesarlos. El resultado eran errores de lectura por acceder a información incompleta. Ese tipo de conflicto surge cuando dos procesos tocan el mismo recurso a la vez sin ponerse de acuerdo.
La solución fue elegante. Se publica un único objeto de datos OLE, que es el mecanismo estándar de Windows para compartir contenido entre aplicaciones a través del portapapeles, y solo se actualizan los bytes de la imagen que contiene, en lugar de sustituirlo entero cada vez. Además, cada lectura de Paint marca el momento exacto en que puede prepararse el siguiente fotograma, lo que elimina de raíz la condición de carrera entre ambos procesos.
Fuente
Imagen: softzone.es
