Quando a iris morre em flash
Eu aprendi sobre isso na prática, em 2014, trabalhando num projeto de animação interativa para uma exposição de arte digital. A vinheta de iris (aquele efeito de abertura circular que fecha o quadro todo) simplesmente travava em tempo de execução. O SWF compilava sem erros, mas no browser a animação travava no frame 47 e nunca mais avançava. O problema não era óbvio. Gastei três dias rastreando até descobrir que era o MovieClip que controlava a iris: ele continha um TextField dinâmico com embed de fonte que, quando combinado com o blur aplicado ao próprio MC, causava um estouro silencioso de memória no plugin Flash do navegador. Minha solução foi direta. Removi o TextField da iris, coloquei o texto em um MC separado acima dele no hierarquia de display list, e substituí o blur por uma versão pré-bakeada em bitmap. A iris passou a fechar em 300ms sem crash. A lição que levei comigo: efeitos de máscara com transformação geométrica + filtro de blur em MovieClips encadeados são um risco real em Flash Player antes da versão 11.4. Se você está lidando com isso, verifique essa combinação.
a iris morre em flash — como diagnosticar e resolver
O efeito de iris, tecnicamente falando, é um MaskFilter aplicado a um MovieClip ou Shape que modifica sua propriedade scaleX/scaleY de forma anelada, ou mais comumente, uma máscara circular cujo raio é animado via enterFrame ou tween. Ele "morre" em flash basicamente em três cenários que eu já vi acontecer repetidamente. O primeiro cenário é o mais comum: o tween que anima o raio da máscara não tem um valor final definido. O ActionScript continua executando, o raio chega a zero e depois tenta ir para negativo. Em vez de travar suavemente, o Flash Player entra num loop de validação onde a máscara recursiva recalculta seu bounding box a cada frame. O resultado é queda de FPS para algo entre 2 e 5, e em poucos segundos o player fecha sozinho. A correção é simples: force o raio para zero e remova a máscara explicitamente com mask = null no frame em que a iris fecha completamente. Não confie no auto-cleanup do runtime.
O segundo cenário envolve filtros encadeados. Se você aplicar um BlurFilter na máscara em si — não no MC mascarado, mas no objeto máscara — o Flash calcula o blur no caminho de renderização da máscara. Isso funciona em testes locais. Mas quando o projeto é exportado para rodar em um computador com driver de vídeo mais antigo ou num tablet com GPU desacelerada, oBlur na máscara consome tanto ciclo de rasterização que o tempo de frame ultrapassa o threshold de 33ms (para 30fps) e o player entra em modo de proteção contra travamento. Eu vi isso acontecer com iris de 400px de diâmetro rodando em 55fps em minha máquina, mas caindo para 8fps em um netbook com Intel GMA 3100. A solução: renderize a máscara como bitmap pré-calculado e use BitmapData como máscara em vez de Shape. Isso desliga o recalculo por frame da máscara. O terceiro cenário é o mais traiçoeiro porque não mostra erro algum. A iris funciona perfeitamente, fecha o cuadro, mas quando você tenta reiniciar a animação (reload da cena, replay do interação), a iris não abre de novo. O MovieClip da máscara existe, o raio começa em zero, mas o conteúdo mascarado permanece invisível. A causa raiz: o Flash não restabelece a ligação máscara-objeto se o alvo da máscara foi removido e readicionado ao display list durante a execução. A correção é chamar setMask() novamente após qualquer reload de cena, ou manter o alvo da máscara como singleton fixo no palco desde o início.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Se você está começando agora com esse tipo de efeito e quer um exemplo mínimo que funcione, a estrutura básica em ActionScript 3 é esta: Crie um Shape como máscara. Anime sua escala ou raio com setInterval ou ENTER_FRAME. Quando atingir o valor desejado, remova a máscara. Sempre limpe referências ao final.
Para quem trabalha com projetos maiores, recomendo usar uma biblioteca como TweenNano ou GSAP para controlar a animação da máscara, e embutir um try-catch ao redor do setMask. Não que o Flash lance exceções nesse tipo de situação com frequência, mas capturar o erro de referência nula economiza meia hora de debug que eu já perdi. Um detalhe que poucos mencionam: a iris morre em flash também pode ser um sintoma de conflito com o stage.scaleMode. Se seu Stage estiver configurado como noScale e o movie for redimensionado pelo browser (como acontece em resizes de janela), a máscara circular continua calculada nas coordenadas originais, enquanto o conteúdo mascarado se reposiciona. O resultado visual é uma iris que parece "presa" num canto ou que corta o conteúdo de forma errada. A fixação é listarerner a máscara a cada evento RESIZE, ou travar o scaleMode como noScale com centerRegistration ativo.
Se o projeto for para distribuição web moderna, considere que o Flash Player está descontinuado desde dezembro de 2020. O que vale a pena fazer hoje é migrar a iris para HTML5 Canvas com requestAnimationFrame, ou usar CSS clip-path para animações simples de abertura/fechamento circular. Funciona nos navegadores atuais, não precisa de plugin, e a performance é consistentemente melhor do que o que o Flash entregava mesmo nos bons dias.