Saturday, June 06, 2009

Cronica de la captura de una demo

Hace tiempo, en un ataque de los que nos da a algunos coders, porté varias demos de MS-DOS a Windows:

- Un pack que llamé internamente "hat-trick" de Anaconda (Eunectex, Requiem y fix de la Insane Elements)
- La Fulcrum/Matrix (esta la porte en una noche non-stop) y la G-Cube
- La Mayhem/Incognita (sobre esta hasta hay un pseudo-diario de desarrollo, parte 1 y parte 2)

Y dejando de lado al capitán obvio comentado lo que todos sabéis, siempre me quedó cierta espina clavada por no haber podido portar la ultima demo de Anaconda para MS-DOS, la Myth Of Orion: pedí el código algunos coders de Anaconda, pero no lo pudieron localizar. Tenia muchas ganas de portarla, en parte, porque así habría portado todas sus demos a Windows, permitiéndome verlas en cuanto me apeteciera. Pero el motivo mas importante es algo más largo de explicar.

Hacia 1997 mi padre compró un Pentium MMX a 200Mhz. Al cabo de aproximadamente 4 años ese PC pasó a ser mio, y le metí una Voodoo Banshee. Aunque la mayoría de demos que quería ver iban bien, habia una en particular que iba a framerates bajos (menos de 10fps): la Myth Of Orion. Aunque la vi muchas veces, habia ciertas partes que se arrastraban sobremanera, y siempre quise poder verla a una velocidad decente.

Hacia 2002, me compré un portatil nuevo, pero traía instalado WindowsXP, y el soporte de MS-DOS de este deja bastante que desear. Asi pues, aparqué el tema de verla bien, y seguí viendola en mi viejo equipo.

Unos dos años mas tarde, Dosbox empezó a tener soporte para VESA. Probé los primeros parches que lo traían (diría que a través de un nighty build), y por fin pude ver la demo. Y digo ver, porque la velocidad no era muy aceptable. Ademas, se colgaba hacia el segundo minuto (sigue haciéndolo hoy en día). He ido probando cada nueva versión que sale de Dosbox, pero todas se siguen colgando en el mismo sitio, así que seguía sin poder verla bien. Por la misma época tenía también instalado el VirtualPC para los demoshows de las bcnparty, pero no conseguía que funcionara bien tampoco.

Avancemos hasta finales de 2008, principios de 2009. Por motivos que no vienen al caso, he tenido que usar Virtualbox, sobretodo para tener un Linux a mano. Hace una semana, debido a que ya no necesitaba usar mas Linux, borré el disco duro virtual donde estaba alojado, y pensé que podría probar de instalar un MS-DOS, a ver si podía ejecutar las demos antiguas que hace tanto tiempo que no veo. Mirando las features de la aplicación, vi que soportaba una SoundBlaster16 virtual, lo cual me permitiría ver la demo bien.

Una vez instalado MS-DOS en la maquina virtual, configurado el sonido, memoria, etc, para que funcione, consigo ejecutar la demo. Todo ilusionado, me dispongo a verla, y al cabo de 2 minutos se cuelga en el mismo sitio que con Dosbox!

Ya sin ideas, decido mirar si Bochs o Qemu ofrecen algo que no ofrece VirtualBox. Primero probé Bochs, porque encontré un tutorial sobre como instalar MS-DOS 6.22 en él. Luego de una hora de instalar el SO y configurar lo necesario, me decido a ejecutar la demo. El problema es que es un emulador y no un virtualizador (como Dosbox, vaya), con lo cual la velocidad es menos que aceptable. Igualmente, si funciona, al menos podré verla a 1fps: siempre que no se cuelgue en el sitio habitual.

Espero los dos minutos de rigor, viendo la demo a ritmo de tortuga, y para mi sorpresa, no se cuelga! Entonces había dos problemas a superar, el segundo a consecuencia de la solución del primero:

1) La demo va a 1fps, y me pierdo mucho contenido (la demo funciona como si la ejecutara sobre un Pentium 75 aproximadamente). Bochs permite configurar el numero de ciclos por segundo, con lo cual puedo ver la demo como si tuviera un Pentium 500, pero cada actualización de pantalla tarda 4-5 segundos.

2) Bochs no permite capturar la salida por pantalla a vídeo o similares.

El caso ideal seria poder grabar la salida usando en método detallado en el punto 1, con algún sistema. Lo primero que se me ocurrió fue usar Fraps o Hypercam. El primero no me sirvió, porque Bochs no usa OpenGL para la salida a pantalla. El segundo captura cualquier ventana, pero presenta otro problema: no sabía si podría tener en cuenta que solo capturara cuando la ventana se actualizara.

Así que hice lo que cualquier coder pocafeinoso haría: me bajé el código fuente del Bochs, y lo modifiqué para que guardara cuando un fotograma es diferente del anterior dibujado. Para simplificar el logger, hice que grabará en raw a disco. Luego solo es cuestión de dejar al Bochs guardando toda la demo (tarda del orden de 2 horas, aproximadamente), y luego montar esas imágenes capturadas.

El siguiente problema es que no sé mucho de edición de vídeo, así que en vez de buscar un software capaz de crear un vídeo en base a las capturas, ademas de tener que convertir los raw a un formato reconocible por ese software, decidí crearme mi propio conversor. Ademas, como no sabía el framerate exacto al que había captura, metí soporte para ajustar la velocidad del vídeo (y en un futuro no muy lejano, para hacer interpolación temporal, aunque sea chapucero). Después de haber creado el vídeo, solo es necesario unirlo con la música de la demo, y tenemos una captura de la demo: fácil fácil!

Las ventajas de este sistema, es que puedo capturar cualquier cosa que funcione sobre Bochs, que no son pocas. Las desventajas es que es un sistema muy lento y que la sincronización se tiene que hacer a mano (ademas, dista bastante de ser perfecta).

Y esto es todo: espero que ver a que extremos puedo llegar, anime a algunos grupos a rebuscar su código viejuno para que haga ports como dios manda, en vez de tener que hacer chapuzas para poder ver sus demos!

Unos screenshots, y cierro, que esto se ha alargado demasiado:



Y un vídeo montado a prisa, disculpad la calidad general, pero tengo que recapturar todo de nuevo: entendedlo como una muestra previa :)



PS: Como scenesp no está funcional, he subido el vídeo con el sistema de google, y se ha zampado la calidad para desayunar.

1 comment:

r3D said...

Sube el vídeo final cuando puedas, pleaaase :_D