Accesibilidad

Artículo de Flash

 

Varicose-g: Gráficos de alto rendimiento en Flash 8


Contenido

Aumentar el rendimiento mediante la conversión personalizada al formato de mapa de bits

Con Flash Player 8, pensé que podría aumentar masivamente el rendimiento y la persistencia de varicose-g convirtiendo los vectores al formato de mapa de bits. Mi idea original era crear todo el lienzo VeinManager de modo que utilice la función de conversión al formato de mapa de bits integrada:

// Set the canvas to cache to bitmap automatically:
canvas.cacheAsBitmap = true;

Aunque incrementó el rendimiento, seguía ralentizándose conforme se iban añadiendo venas. Esto se debe al hecho de que los vectores se retienen y se vuelven a componer en las regiones en las que se redibuja cada marco. Conforme se crean más vectores, el tiempo de recomposición aumenta, ralentizándose todo el experimento.

En cambio, escribí una rutina de conversión al formato de mapa de bits personalizada. Con cada marco, la clase VeinManager toma todos los vectores nuevos que fueron dibujados por las clases Vein y las compone en formato de mapa de bits utilizando el método de dibujo de BitmapData, y después elimina todos los vectores. Éstos nunca son reproducidos por Flash en la pantalla, sólo se ve el mapa de bits. Esto quiere decir que el nivel de CPU utilizado en la composición nunca aumenta, sin importar el tiempo de ejecución del experimento ni las venas dibujadas. Asimismo, dado que estoy volviendo a utilizar el mismo objeto BitmapData en cada marco, la cantidad de RAM que el sistema utiliza no aumenta.

El código simplificado para hacer la conversión personalizada es así:
/* THIS CODE RUNS ONCE */
// Set up the BitmapData object:
canvasBmp = new BitmapData(WIDTH,HEIGHT,true,0);
// Display the bitmap in the "image" clip:
canvas.image.attachBitmap(canvasImage,1);
// Set up the matrix that will be used to draw the veins onto the bitmap:
mat = new Matrix ();
/* THIS CODE RUNS ONCE */
// Draw the new vectors to canvas.veins
// See the Vein source for details.
// Composite the vectors to the BitmapData object each frame:
canvasBmp.draw(canvas.veins,mat);
// Clear out the old vectors:
canvas.veins.clear();