Pergunta

Meu site é inteiramente baseado em flash, ele gira em torno de um modelo 3D que me foi dado como pedaços de vídeo que converti para arquivos FLV.Estou usando o componente FLVPlayback para controlar o vídeo dentro do meu programa.Ao executar verificações de memória usando System.totalMemory, percebi que sempre que um vídeo é carregado, ele consome um pedaço de memória e mesmo quando eu removo todos os ouvintes de eventos dele (todos são referenciados fracamente), removo o componente de seu pai, pare o vídeo e anule a instância do componente, ele ainda não devolverá essa memória.

Isso tem me incomodado desde que comecei a trabalhar neste projeto por causa da enorme quantidade de vídeo que um usuário pode instanciar e carregar.Atualmente, todo vídeo é carregado em uma nova instância do FLVPlayback sempre que necessário, mas li que talvez a melhor maneira de resolver esse problema seja simplesmente ter uma instância global do FLVPlayback e apenas recarregar o novo vídeo na instância antiga, dessa forma haveria apenas um componente FLVPlayback na memória do aplicativo.

Alguém mais teve esse problema também?Você encontrou uma solução melhor do que usar uma instância global que você reutiliza para cada novo vídeo?

Foi útil?

Solução

Você não pode ajudar muito nos problemas de memória até que o Flash adicione destruidores e exclusão explícita de objetos, infelizmente.Veja este tópico:

Descarregando um ByteArray no Actionscript 3

Há um limite para a quantidade de memória que os miniaplicativos Flash podem usar;o GC parece disparar ao atingir esse limite.Já vi meus miniaplicativos com fácil memória usarem até cerca de 200 MB, só porque funcionam por horas a fio e o GC não quer entrar em ação.

Ah, e também não acho que usar uma única instância seja uma solução elegante.Atualmente, apenas escrevo uma função descarte() para minhas classes personalizadas, esperando algum dia em que ela possa ser transformada em um destruidor adequado.

Outras dicas

Nunca gostei muito dos componentes, eles são um pouco duvidosos.Esse problema específico parece ser comum, e a solução um tanto irritante é, como você está sugerindo, ter apenas um FLVPlayback e reutilizá-lo.

Aqui está uma postagem no blog sobre isso

Obrigado pelas respostas, os links para as outras perguntas do blog também foram úteis, eu também li todas as informações de Grant Skinner sobre coleta de lixo, mas pesquisar esses links e voltar e reler o que ele havia dito originalmente sobre GC ajudou atualize a velha cabeça.Além de anular e reinstanciar aquele único componente FLVPlayback, também percebi que não estava descarregando e destruindo corretamente minhas instâncias do Loader, então limpei-as e agora o programa está sendo executado com muito mais eficiência.Eu diria que o uso de memória melhorou cerca de 90% no site.

@aib Admito que a solução de instância única não é elegante, mas como o flash simplesmente não libera esses arquivos FLV, estou meio que preso a ela.

@grapefrukt Eu detesto os componentes flash, eles normalmente causam mais sofrimento do que economia de tempo, mas neste caso eu tinha muitos pontos de sinalização e navegação acontecendo com os arquivos de vídeo e o componente FLVPlayback foi a melhor solução que encontrei.É claro que ainda sou bastante novo no mundo do actionscript, então talvez eu tenha esquecido algo

Eu também gostaria de ter a reputação de votar positivamente em ambas as suas respostas, porque ambas foram úteis...é a vida

Pelo que percebi depois de muitos testes, o flash carrega dinamicamente em bibliotecas e componentes conforme necessário, mas nunca coleta esses dados como lixo.Por exemplo, se eu tiver um site ou aplicativo Air que usa o componente FLVPlayback, o componente real e as bibliotecas associadas a ele não serão carregados até que uma nova instância FLVPlayback() seja criada.Em seguida, ele será carregado na biblioteca e no componente na memória, mas você nunca recuperará esse espaço até que o programa/site seja fechado.Essa instância específica com o vídeo dentro dela será coletada como lixo e liberará um pouco de memória, desde que você remova os ouvintes dela, retire-a do palco e defina-a como nula.

Além disso, se você estiver fazendo vídeos individuais, o VideoPlayer é muito mais leve e limpa melhor.

Infelizmente, é assim que o flash lida com isso.Não é particularmente inteligente, mas funciona para a maioria das pessoas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top