Estes días he estado intentar acelerar mis ports de intros de 1k/4k que utilizan glsl/sm3.0 en software rendering. Hasta la fecha, dichos ports habían estado trabajando bajo GDI y pudiendose ejecutar a muy bajas resoluciones y framerates. Con GDI he estado utilizando la versatil función StrechDIBits, que según el msdn:
— The StretchDIBits function copies the color data for a rectangle of pixels in a device-independent bitmap (DIB) to the specified destination rectangle. If the destination rectangle is larger than the source rectangle, this function stretches the rows and columns of color data to fit the destination rectangle. If the destination rectangle is smaller than the source rectangle, this function compresses the rows and columns by using the specified raster operation. —
Una maravillosa función que te permite reescalar tu ventana sin ninguna complicación y tener un buffer preparado y calentito para pintar en el sin ningún costoso proceso adicional…
Aún a pesar de lo maravillosa que sea dicha función, establecí un “aleatorio supuesto” de que podía influír muy negativamente en el bajo framerate que estaban obteniendo mis ports, por lo que decidí intentar utilizar la vieja Direct draw. Tras 2 tardes malgastadas aprendiendo todo lo que es el proceso para inicializar Direct Draw (nunca había utilizado directx hasta hoy), hice un wrapper de todo y lo conseguí incluir en mi framework.
Pero cual es mi sorpresa cuando utilizo Direct Draw para ejecutar los ports, esperando ver una mejoría notable frente a GDI? Que el framerate que obtengo es en todos los casos (resoluciones 32bits) peor. Sinceramente, no entiendo el porqué.
Los bucles de render utilizando ambas maneras son estes:
-GDI: http://pastebin.com/m7dae9446
-Direct Draw: http://pastebin.com/m139ad6c
Todo me lleva a pensar que el overhead de utilizar BeginFrame/EndFrame en la versión de directx hace q inevitablemente tenga q ser por narices más lento q la versión GDI… Pero por lo poco que se, creo que es imposible evitar el tener q utilizar dichas funciones si quieres controlar correctamente tu aplicación direct draw.
Pero todas estas pruebas me llevan al siguiente interrogante. ¿Por qué muchas demos antiguas utilizaban el sistema Direct Draw para demos de tipo Soft Rendering? La mayoría de las que le he visto los sources utilizan simplemente Direct Draw para obtener acceso a memoria de video y nada más, los cálculos de los efectos están implementados en sus respectivos engines…
Más engorrosa de inicializar, ocupa “muchísimo” más espacio, más lenta (supuestamente si no se demuestra lo contrario) …
¿No hay ninguna mejor alternativa que StrechDIBits para este tipo de aplicaciones que simplemente necesitan un buffer donde dibujar? (En windows, no msdos)
Sigo investigando…

, y este es de los primeros que encontré googleando “free upload files” .