Buscar..


Gráficos basados ​​en vectores

Los gráficos basados ​​en vectores están representados por una gran cantidad de datos que deben ser computados por la CPU (puntos vectoriales, arcos, colores, etc.). Cualquier otra cosa que no sean formas simples con puntos mínimos y líneas rectas consumirá grandes cantidades de recursos de CPU.

Hay un indicador "Caché como mapa de bits" que se puede activar. Esta bandera almacena el resultado de dibujar el DisplayObject basado en vectores para volver a dibujar mucho más rápido. El inconveniente de esto es que si hay alguna transformación aplicada al objeto, todo debe ser redibujado y vuelto a almacenar en caché. Esto puede ser más lento que no activarlo en absoluto si se aplican transformaciones cuadro por cuadro (rotación, escalado, etc.).

En general, la representación de gráficos utilizando mapas de bits es mucho más eficaz que el uso de gráficos vectoriales. Las bibliotecas como flixel aprovechan esto para representar sprites en un "lienzo" sin reducir la tasa de cuadros.

Texto

La renderización de texto consume mucha CPU. Las fuentes se representan de manera similar a los gráficos vectoriales y contienen muchos puntos vectoriales para cada personaje. Alterar el texto fotograma a fotograma se degradará el rendimiento. El indicador "Caché como mapa de bits" es extremadamente útil si se usa correctamente, lo que significa que debe evitar:

  • Alterando el texto con frecuencia.
  • Transformando el campo de texto (rotando, escalando).

Técnicas simples como envolver actualizaciones de texto en una declaración if harán una gran diferencia:

if (currentScore !== oldScore) {
    field.text = currentScore;
}

El texto se puede representar utilizando el renderizador suavizado incorporado en Flash o usando "fuentes de dispositivo". El uso de "fuentes de dispositivo" hace que el texto se reproduzca mucho más rápido, aunque hace que el texto aparezca irregular (con alias). Además, las fuentes del dispositivo requieren que la fuente sea preinstalada por su usuario final, o el texto puede "desaparecer" en la PC del usuario aunque parezca correcto en la suya.

field.embedFonts = false; // uses "device fonts"

Vector y para cada vs matrices y para

El uso del tipo Vector.<T> y for each bucle es más eficaz que un arreglo convencional y for bucle:

Bueno:

var list:Vector.<Sprite> = new <Sprite>[];

for each(var sprite:Sprite in list) {
    sprite.x += 1;
}

Malo:

var list:Array = [];

for (var i:int = 0; i < list.length; i++) {
    var sprite:Sprite = list[i];

    sprite.x += 1;
}

Eliminación rápida de elementos de matriz

Si no necesita que una matriz esté en ningún orden en particular, un pequeño truco con pop() le proporcionará enormes ganancias de rendimiento en comparación con splice() .

Cuando splice() una matriz, el índice de los elementos subsiguientes en esa matriz debe reducirse en 1. Este proceso puede consumir una gran cantidad de tiempo si la matriz es grande y el objeto que está eliminando está más cerca del comienzo de esa matriz .

Si no le importa el orden de los elementos en la matriz, puede reemplazar el elemento que desea eliminar con un elemento que saque pop() del final de la matriz. De esta manera, los índices de todos los demás elementos de la matriz siguen siendo los mismos y el proceso no se degrada en el rendimiento a medida que aumenta la longitud de la matriz.

Ejemplo:

function slowRemove(list:Array, item:*):void {
    var index:int = list.indexOf(item);
    
    if (index >= 0) list.splice(index, 1);
}

function fastRemove(list:Array, item:*):void {
    var index:int = list.indexOf(item);

    if (index >= 0) {
        if (index === list.length - 1) list.pop();

        else {
            // Replace item to delete with last item.
            list[index] = list.pop();
        }
    }
}

Vectores en lugar de matrices

Flash Player 10 introdujo el tipo de lista genérica Vector. <*> Que era más rápida que la matriz. Sin embargo, esto no es del todo cierto. Solo los siguientes tipos de vectores son más rápidos que las contrapartes de la matriz, debido a la forma en que se implementan en Flash Player.

  • Vector.<int> - Vector de enteros de 32 bits
  • Vector.<uint> - Vector de enteros sin signo de 32 bits
  • Vector.<Double> - Vector de flotadores de 64 bits

En todos los demás casos, el uso de una matriz será más eficaz que el uso de vectores, para todas las operaciones (creación, manipulación, etc.). Sin embargo, si desea "escribir con fuerza" su código, puede usar Vectores a pesar de la desaceleración. FlashDevelop tiene una sintaxis que permite que los menús desplegables de finalización de código funcionen incluso para Arrays, utilizando /*ObjectType*/Array .

var wheels:Vector.<Wheel> // strongly typed, but slow

var wheels:/*Wheel*/Array // weakly typed, but faster

Reutilizando y agrupando gráficos.

Crear y configurar objetos Sprite y TextField en tiempo de ejecución puede ser costoso si está creando cientos de miles de estos en un solo marco. Por lo tanto, un truco común es "agrupar" estos objetos para reutilizarlos posteriormente. Recuerde que no solo estamos tratando de optimizar el tiempo de creación ( new Sprite() ) sino también la configuración (configuración de las propiedades predeterminadas).

Digamos que estábamos construyendo un componente de lista usando cientos de objetos TextField. Cuando necesite crear un nuevo objeto, verifique si un objeto existente puede ser reutilizado.

var pool:Array = [];

if (pool.length > 0){

    // reuse an existing TextField
    var label = pool.pop();

}else{
    // create a new TextField
    label = new TextField();
    
    // initialize your TextField over here
    label.setDefaultTextFormat(...);
    label.multiline = false;
    label.selectable = false;
}

// add the TextField into the holder so it appears on-screen
// you will need to layout it and set its "text" and other stuff seperately
holder.addChild(label);

Más adelante, cuando esté destruyendo su componente (o quitándolo de la pantalla), recuerde volver a agregar etiquetas no utilizadas a la agrupación.

foreach (var label in allLabels){
    label.parent.removeChild(label); // remove from parent Sprite
    pool.push(label); // add to pool
}

En la mayoría de los casos, es mejor crear un grupo por uso en lugar de un grupo global. Las desventajas de crear un grupo global es que necesita reinicializar el objeto cada vez que lo recupere del grupo, para anular la configuración realizada por otras funciones. Esto es igualmente costoso y, en primer lugar, niega el aumento de rendimiento del uso de la agrupación.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow