Pregunta

Recientemente asumí una tarea bastante desalentadora de crear un video musical interactivo para el popular programa Ghost Whisperer. Me trajeron tarde en el proyecto y me enfrenté a un archivo de autor gigante (más de 5000 cuadros de largo). El programador anterior (que hizo todo en AS2) esencialmente había incrustado un FLV de dos minutos y medio en la línea de tiempo principal del tiempo y en ciertos puntos de cuadro agregaría clips para interactividad con la funcionalidad básica de clic del mouse que desencadenaría esos clips para jugar otros clips con algunos elementos flash y algunos elementos de video.

(La versión final que creé se puede ver aquí http://www.gwghostmagic.com);

Siendo un monstruo ordenado, decidí reconstruir todo en AS3, deshacerme de la línea de tiempo por completo y más bien cargar en mis elementos en tiempo de ejecución para que en lugar de 5000 cuadros tuviera un cuadro y activar las acciones agregó un evento. para activar la interactividad cuando el .swf cargado alcanzaría ciertos cuadros. Desde el punto de vista de los programadores, todo hizo todo mucho más claro y más fácil manipular ciertas acciones. El problema era que la cosa corría como basura.

La versión de más de 5000 marco se cargó más rápido y se ejecutó más suave que mi versión AS3. Lo que me lleva a la pregunta, ¿cuándo es mejor incrustar y salir de la línea de tiempo que salir de un oyente de eventos? ¿Flash es más adecuado para la funcionalidad de la línea de tiempo?

Inicialmente, decidí construir y salir de una transmisión .flv, pero sincronizar las acciones con el .flv era imposible porque el .flv se estaba ejecutando a 23.975 fps, mientras que mi película Flash se ejecutaba a 24 fps. Por desgracia, me vi obligado a compilar un .swf con el FLV incrustado. Ese .swf se cargó luego en mi .swf principal que contenía todas las funciones y clips adicionales que jugarían de acuerdo con la posición de marco de .SWF cargada.

Una cosa que he notado es que el evento. En el que si todo se incrustara, solo podría necesitar insertar un plazo clave en el que se instanciaría el clip interactivo y luego sabría inmediatamente qué hacer, en lugar de recorrer las declaraciones de si otras.

¿Me jodí tratando de hacer las cosas agradables y ordenadas? ¿Es mejor dejar que Flash sea flash? ¿Debo buscar otra carrera? Cualquier aporte es muy apreciado.

¿Fue útil?

Solución

Creo que tener el evento desencadena cada cuadro en lugar de solo activar acciones ocasionalmente explica la diferencia de rendimiento. Esperemos que pueda minimizar la cantidad de código y condicionales que se ejecutaron en el controlador de eventos.

Aquí hay una idea que no he probado:

var dispatch:Object = {
  f1:   function () {textBubble.text = "This is Rush Hour 2";},
  f61:  function () {textBubble.text = "";},
  f111: function () {textBubble.text = "This scene has 50 takes; "
                     +"Jackie Chan said \"Square Madison\" each time.";},
  f171: function () {textBubble.text = "";}
};
addEventListener(Event.ENTER_FRAME, function (e:event) {
  if (dispatch["f"+e.target.currentFrame] is Function) {
        dispatch["f"+e.target.currentFrame]();
  }
});

Esto usa el Objeto como una matriz asociativa como se describe en los documentos en vivo.

Otros consejos

Probablemente tenga razón: ejecutar más de 200 líneas de código en cada cuadro lo está ralentizando. En lugar de una gran lista de declaraciones, divida las funciones de su cuadro y solo llame a las que necesita, esta es una expansión de la idea de Dlamblin, de esta manera está ejecutando la menor cantidad de código necesario para cada cuadro:

function doThisOnFrame20():void
{
    //do stuff...
}

function doThisOnFrame50():void
{
    //do stuff...
}

var frameFunctions:Array = new Array();
frameFunctions[20] = doThisOnFrame20;
frameFunctions[50] = doThisOnFrame50;

function enterFrameListener(event:Event):void
{
    if(frameFunctions[swfWithFLV.currentFrame] is Function)
    {
        frameFunctions[swfWithFLV.currentFrame]();
    }
}

addEventListener(Event.ENTER_FRAME,enterFrameListener);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top