Pergunta

Recentemente, assumi a tarefa bastante difícil de criar um videoclipe interativo para o popular programa Ghost Whisperer.Fui trazido no final do projeto e fui confrontado com um arquivo de autoria gigante (mais de 5.000 quadros).O programador anterior (que fez tudo no AS2) basicamente incorporou um FLV de dois minutos e meio na linha de tempo principal e em determinados pontos do quadro adicionava clipes para interatividade com a funcionalidade básica de clique do mouse que acionaria esses clipes para reproduzir outros clipes com alguns elementos flash e alguns elementos de vídeo.

(a versão final que criei pode ser vista aqui http://www.gwghostmagic.com);

Sendo um maníaco por limpeza, decidi reconstruir tudo em AS3, abandonar completamente a linha do tempo e carregar meus elementos em tempo de execução para que em vez de 5.000 quadros eu tivesse um quadro e para acionar as ações adicionasse um ouvinte de evento Event.ENTER_FRAME para acionar a interatividade quando o .swf carregado atingir determinados quadros.Do ponto de vista dos programadores, tudo ficou muito mais claro e fácil de manipular certas ações.O problema era que a coisa funcionava como uma porcaria.

A versão com mais de 5.000 quadros carregou mais rápido e funcionou de maneira mais suave do que minha versão AS3.O que me leva à questão: quando é melhor incorporar e sair da linha do tempo do que fugir de um ouvinte de evento?O flash é mais adequado para funcionalidade de linha do tempo?

Inicialmente, decidi criar e executar um .flv de streaming, mas sincronizar as ações com o .flv era impossível porque o .flv estava rodando a 23,975 fps, enquanto meu filme em flash estava rodando a 24 fps.Infelizmente, fui forçado a compilar um .swf com o flv incorporado.Esse .swf foi então carregado em meu .swf principal que continha todas as funções e clipes extras que seriam reproduzidos de acordo com a posição do quadro do .swf carregado.

Uma coisa que notei é que Event.ENTER_FRAME parece desacelerar todo o maldito aplicativo porque a cada quadro ele precisa executar uma lista de instruções if com 200 linhas de código.Em que, se tudo estivesse incorporado, eu só precisaria inserir um quadro-chave onde o clipe interativo seria instanciado e então saberia imediatamente o que fazer, em vez de percorrer as instruções if else.

Eu estraguei tudo tentando deixar as coisas bonitas e arrumadas?É melhor deixar o flash ser flash?Devo procurar outra carreira?Qualquer contribuição é muito apreciada.

Foi útil?

Solução

Acho que fazer com que o evento acione todos os quadros, em vez de apenas acionar ações ocasionalmente, é responsável pela diferença de desempenho.Esperamos que você possa minimizar a quantidade de código e condicionais executadas no manipulador de eventos.

Aqui está uma ideia que não testei:

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]();
  }
});

Isso usa o Objeto como uma matriz associativa, conforme descrito na documentação ao vivo.

Outras dicas

Você provavelmente está correto - executando mais de 200 linhas de código em cada quadro está diminuindo você. Em vez de uma enorme lista de declarações, divida o seu quadro funções e ligue apenas as que você precisa - isso é uma expansão na idéia de Dlamblin - dessa maneira você está executando a menor quantidade de código necessário para cada quadro:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top