AS3 e bugs com Tween
Quando estava programando a animação Flash que comentei anteriormente, encontrei um problema que acontecia quando disparava varias animações com a classe Tween do Flash.
Por algum motivo, as animações deixavam de executar no meio, e todo o posicionamento dos itens ficava errado.
Depois de buscar um pouco, encontrei num forúm da Adobe um comentário que dizia que o Garbage Collector do Flash excluía as instâncias da classe Tween que não estivessem referênciadas em nenhum lugar.
Um exemplo pode facilitar o entendimento.
Temos um MovieClip chamado mc e desejamos animar sua posição horizontal (x) , deslocando o mesmo da posição atual para + 100 pixels. Criamos então uma instância da classe Tween e passamos os parâmetros para o construtor.
Para resolver o problema, utilizei parte de um código que encontrei ( quando encontrar o link coloco aqui ), criei uma classe Singleton com o mesmo e pronto, temos uma forma de referênciar as instâncias de Tween sem nos preocupar com limpeza de memória antes do término da animação.
O uso da mesma é simples:
Até terminar a animação a instância de Tween será referênciada pelo AntiGC, evitando a exclusão da mesma da pilha de execução. Após isso a mesma é liberada para limpeza.
Você só não pode deixar de referênciar o AntiGC pois isso faria o mesmo, com todas as instâncias de Tween registradas serem elegíveis para limpeza.
Por algum motivo, as animações deixavam de executar no meio, e todo o posicionamento dos itens ficava errado.
Depois de buscar um pouco, encontrei num forúm da Adobe um comentário que dizia que o Garbage Collector do Flash excluía as instâncias da classe Tween que não estivessem referênciadas em nenhum lugar.
Um exemplo pode facilitar o entendimento.
Temos um MovieClip chamado mc e desejamos animar sua posição horizontal (x) , deslocando o mesmo da posição atual para + 100 pixels. Criamos então uma instância da classe Tween e passamos os parâmetros para o construtor.
new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true);Logo após criada, esta instância já executaria a animação e terminado seu trabalho não existe mais nenhum motivo para manter uma referência da mesma. O problema ocorre durante a animação de x para x+100, se o processo de limpeza do coletor de lixo do Flash for disparado nesse período, nossa classe não está referênciada por ninguêm e portanto, elegível para ser descartada mesmo que esteja realizando alguma atividade.
Para resolver o problema, utilizei parte de um código que encontrei ( quando encontrar o link coloco aqui ), criei uma classe Singleton com o mesmo e pronto, temos uma forma de referênciar as instâncias de Tween sem nos preocupar com limpeza de memória antes do término da animação.
O uso da mesma é simples:
- Salve o script para o mesmo diretório da sua animação com o nome AntiGC.as.
- Adicione a chamada de importação no topo do seu script: "import AntiGC;"
- Requisite a instância do AntiGC: "aGC:AntiGC = AntiGC.getInstance();"
- Execute seu código de animação passando a instância para o AntiGC: aGC.addElement(new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true));
Até terminar a animação a instância de Tween será referênciada pelo AntiGC, evitando a exclusão da mesma da pilha de execução. Após isso a mesma é liberada para limpeza.
Você só não pode deixar de referênciar o AntiGC pois isso faria o mesmo, com todas as instâncias de Tween registradas serem elegíveis para limpeza.
Comentários
valew
Valew mesmo !!!
If I use that script inside another package, everything goes ok, but if I try that script inside the stage it occours the error:
trying to access a not acessible method addElement with static AntiGC
Please, help me at andrea_31@hotmail.it ....