Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brcontainer

Loader Imagem e perfomance

Recommended Posts

Estou com um problema de perfomance, meu script trabalha assim:

 

  • Seleciona várias image com "FileReferenceList" (94 imagens de alta resolução, total de 120Mb de arquivos)
  • Redimensiona as images no "client-side" criando um novo "BitmapData"
  • Deleta a imagem original (usando "Bitmap.bitmapData.dispose();")
  • A imagem redimencionada é adicionada ao "stage"

O resultado é que o "processo" usa 580mb de memoria, eu acredito que o motivo deste uso de memoria seja por causa das imagens originais.

Como faça para liberar memoria após remover uma imagem ou loader?

Script para teste: http://www.mediafire.com/download/ata0lm7zqd4f9l4/simple-grid-photo.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei quanto a BitmapData, de forma geral, "remove" tira da lista de exibição, para liberar a memória usa-se "null".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na minha classe customizada "BitmapLoader", eu fiz assim:

public function clearData():void
{
    mcl.unload();
    mcl = null;
    file = null;
}

A cada imagem carregada ele limpa o mcl (flash.display.Loader) e file (filereference), mas o resultado é o mesmo (com uma pequena melhora de Kbs).

 

Você poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra veja eu fiz o código de maneira simples, meu problema parece ser com o "FileReference", segue código:

import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.display.Loader;
import flash.utils.ByteArray;
import flash.events.Event;

var imageTypes:FileFilter = new FileFilter(
    "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
);

var allTypes = [];
    allTypes.push(imageTypes);

var fileRef:FileReferenceList = new FileReferenceList();
    fileRef.addEventListener(Event.SELECT, function(evt:Event):void {
        var file:FileReference;
        var list:Array = fileRef.fileList;
    
        for each (file in list) {
            LoadFile(file);
        }
    });

function LoadFile(f:FileReference):void
{
    f.addEventListener(Event.COMPLETE, function(e:Event):void {
        var name:String = f.name;
        var test:Loader = new Loader;
            test.contentLoaderInfo.addEventListener(Event.COMPLETE, function(a:Event):void {
                //FREE MEMORY????
                trace("OK: " + name);
                test.unload();
                test    = null;
                f        = null;
                e        = null;
                a        = null;
            });
            test.loadBytes(e.currentTarget.data);
    });
    f.load();
}

function SELECT(e:MouseEvent):void
{
    fileRef.browse(allTypes);
}

stage.addEventListener(MouseEvent.CLICK, SELECT);

Mesmo setando NULL e usando Loader.unload; o resultado é o mesmo, poderia me ajudar? Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo, meu conhecimento é limitado, mesmo assim lhe pergunto, onde remove o "Listener" ?

 

Você menciona imagens de alta resolução, mas qual a compressão aplicada a cada uma? Quanto cada imagem original pesa?

 

isto não é boa prática para coleta de lixo, posso estar enganada

fileRef.addEventListener(Event.SELECT, function(evt:Event):void {

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra pelos meus testes o problema não é na hora de redimensionar o problema é no "Filereference".

 

A cada "Filereference.load" completado o uso da memoria do FlashPlayer aumenta

 

Como eu poderia resolver isto?

import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.events.Event;

var imageTypes:FileFilter = new FileFilter(
    "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
);

var allTypes = [];
    allTypes.push(imageTypes);

var list:Array;

var fileRef:FileReferenceList = new FileReferenceList();
    fileRef.addEventListener(Event.SELECT, function(evt:Event):void {
        var file:FileReference;
        list = fileRef.fileList;
    
        for each (file in list) {
            LoadFile(file);
        }
    }, false, 0, true);

function LoadFile(f:FileReference):void
{
    f.addEventListener(Event.COMPLETE, COMPLETED, false, 0, true);
    f.load();
}

function COMPLETED(e:Event):void {
    trace(e.currentTarget.name);
    e = null;
    list = null;
}

function SELECT(e:MouseEvent):void
{
    fileRef.browse(allTypes);
}

stage.addEventListener(MouseEvent.CLICK, SELECT);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Considerando que o problema só ocorre com FileReference.load, o motivo do problema pode ser:

  1. É um BUG no Flash
  2. É algo que ainda não foi implementado no Flash e precisaria ser impletando uma função tipo FileReference.unload

Agora se eu estiver enganado, então deve existir uma SOLUÇÃO e se alguém puder me ajudar ... Qual seria está solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei uma olhada rápida no seu código e pelo que vi o problema da memória está aqui:

content_mc.addChild(nmc);
eachEvent.insert(ADD_IMAGE(nmc, file, nmc));

Para entender melhor acrescente isso no seu código:

nmc.x = pos_x;            
pos_x += 30;

Você verá que toda vez que é adiciona uma imagem no grid, o anterior não é removido...

 

[]'s

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Roger tente se manter ao foco do código mais atualizado, se você ler todos os meus tópicos poderá perceber que eu fiz várias tentativas e descobri que o problema nada tem haver com o MovieClips ou new Loader.

 

O problema está no FileReference.load, como o meu útlimo poste (antes deste) está um exemplo bem simples e o problema ocorre ainda

 

Veja que no meu último codigo eu não usei "new Loader" e nem "addChild();"

 

Você verá que toda vez que é adiciona uma imagem no grid, o anterior não é removido...

 

 

Mesmo tendo removido tudo e deixado apenas FileReference o problema persiste, me ajuda se possivel...

 

Obrigado.

 

Segue o código mais atualizado:

 

Main.as

package {
    import com.mainpackage.LoaderTestCase;

    import flash.net.FileReferenceList;
    import flash.net.FileReference;
    import flash.net.FileFilter;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.display.MovieClip;
    import flash.display.Stage;

    public class Main extends MovieClip {
        private var listFiles:Array;
        private var allTypes:Array;
        private var fileRef:FileReferenceList;
        private var test:int;

        public function Main()
        {
            test = 0;
            listFiles    = [];
            allTypes    = [];
            fileRef        = new FileReferenceList();
            fileRef.addEventListener(Event.SELECT, select);

            stage.addEventListener(MouseEvent.CLICK, browse);
        }

        private function browse(e:MouseEvent):void
        {
            fileRef.browse(allTypes);    
        }

        private function select(e:Event):void
        {
            listFiles = fileRef.fileList;

            for(var i:uint=0, j:uint=listFiles.length; i<j; i++)
            {
                insert(i);
            }
        }

        private function insert(i:int):void
        {
            var fire:LoaderTestCase = new LoaderTestCase(listFiles[i]);

            fire.destroy(function():void
            {
                //Delete LoaderTestCase after timeout ???
                fire = null;
                test++;
                if(test>=listFiles.length) {//Remove FileReference
                    fileRef.removeEventListener(Event.SELECT, select);
                    fileRef = null;
                    listFiles = null;

                    trace("Clear memory");
                }
            });
        }
    }
}

com/mainpackage/LoaderTestCase.as

package com.mainpackage
{
    import flash.net.FileReference;
    import flash.events.Event;
    import flash.display.Loader;

    public class LoaderTestCase
    {
        private var file:FileReference;
        private var loader:Loader;
        private var callback:Function;

        public function LoaderTestCase(e:FileReference)
        {
            file = e;
            trace("OPEN: " + file.name);
            file.addEventListener(Event.COMPLETE, loadFile);
            file.load();
            e = null;
        }

        public function loadFile(e:Event):void
        {
            file.removeEventListener(Event.COMPLETE, loadFile);

            trace("LOAD: " + file.name);

            file    = null;
            e        = null;
            callback();
        }

        public function destroy(a:Function):void
        {
            callback = a;
        }
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu testei o seu .fla, e pelo que pude perceber(de modo rápido) é que, toda vez que se seleciona uma imagem(conforme falei no penúltimo post), ela é adiciona na tela... Mesmo se eu voltar a selecionar a MESMA imagem, ela sobrepõe... Se eu fizer isso 100 vez, com a mesma imagem, terão 100 imagens no mesmo local se sobrepondo umas as outras... o correto, nesse caso, não seria substituir para ficar apenas uma imagem no palco?

 

*Quando eu tiver um tempinho, vou dar uma olhada com mais calma e te dou um retorno...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela dedicação Roger, mas acho que você está enganado, meu último código não adiciona nada ao palco, ele apenas faz "load" dos "FileReferences". O foco do problema está no "FileReference.load". Não existe um "unload" para o "FileReference".

 

Agora se levarmos em consideração o GC (Garbage Collector), o próprio FlashPlayer deveria liberar memória, mas pode ser que exista algum "Thread" que esteja impedindo a liberação.

 

Me responda uma coisa por favor, você tem o "Adobe Flash Builder"? Eu ainda não consegui compra-lo ainda (é meio difícil comprar online). Poderia testar? Se não for incomoda-lo.

 

Estou terminando de baixar a versão Trial, mas vai demorar um pouco

 

Eu testei o seu .fla, e pelo que pude perceber(de modo rápido) é que, toda vez que se seleciona uma imagem(conforme falei no penúltimo post), ela é adiciona na tela... Mesmo se eu voltar a selecionar a MESMA imagem, ela sobrepõe... Se eu fizer isso 100 vez, com a mesma imagem, terão 100 imagens no mesmo local se sobrepondo umas as outras... o correto, nesse caso, não seria substituir para ficar apenas uma imagem no palco?

 

*Quando eu tiver um tempinho, vou dar uma olhada com mais calma e te dou um retorno...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Obrigado pela dedicação Roger, mas acho que você está enganado, meu último código não adiciona nada ao palco, ele apenas faz "load" dos "FileReferences".

 

 

Eu me referia ao seu .fla que você disponibilizou para download... Mesmo assim, fiz os ajustes que pensei que resolveria, porém, mesmo assim o FP não liberou memória, apesar das imagens não mais se sobreporem...

 

*O que acontece no seu .fla(no link mais acima) é que, como já falei, se eu selecionar a mesma imagem várias vezes, você verá que ficarão empilhadas uma sobre a outra, nesse caso, pelo menos, justificaria o aumento de bytes na memória...

 

Mas não obtive êxito fazendo os ajustes... Claro, existe solução sim... Contudo, pretendo dar uma olhada em uma outra ocasião, pois realmente estou um pouco atarefado no momento...

 

Me responda uma coisa por favor, você tem o "Adobe Flash Builder"? Eu ainda não consegui compra-lo ainda (é meio difícil comprar online). Poderia testar? Se não for incomoda-lo.

 

 

Não tenho o Flash Builder aqui neste PC... Mas como já falei, mesmo por curiosidade, pretendo dar uma olhada em outra ocasião...

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tenho o Flash Builder aqui neste PC... Mas como já falei, mesmo por curiosidade, pretendo dar uma olhada em outra ocasião...

 

[]'s

Muito obrigado pelo seu interesse, fico muito feliz...

 

Eu consegui resolver o problema "parcialmente" com o código que postei neste "post"

 

Fiz o seguinte teste, abri 94 fotos (120Mb de fotos) e analisei o processo, obtive o seguinte resultado (ao concluir o processo de todos FileReference.load()):

  • Firefox/Safari (Flash plugin 12.0.0.77): Inicia com 9Mb, atinge 135Mb e ao terminar está com 17Mb.
  • Google Chrome (PepperFlash 12.0.0.70): Inicia com 12Mb, atinge 132Mb e ao terminar está com 17Mb.
  • Flash CS5 (Flash Player 10/12 sem rodar CS5): Inicia com 6Mb, atinge 185Mb e ao terminar está com 185Mb.
Levando em consideração estes dados, o problema no FlashPlayer para Desktop (que se localiza na pasta /player/release/FlashPlayer.exe).

 

Ainda acredito que o meu código precise de alguma melhoria, provavelmente terei que estudar mais um pouco, segue o código:

 

package {
	import flash.net.FileReferenceList;
	import flash.net.FileReference;
	import flash.net.FileFilter;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.display.Sprite;

	public class Main extends Sprite
	{
		private var listFiles:Array;
		private var allTypes:Array;
		private var fileRef:FileReferenceList;
		private var tmpFile:FileReference;
		private var i:uint=0;
		private var j:uint=0;
		private var timer:uint;
		private var imageTypes:FileFilter;
		private var enable:Boolean;

		public function Main()
		{
			imageTypes	 = new FileFilter(
				"Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
			);
			listFiles	= [];
			allTypes	= [imageTypes];

			eventBrowse(true);
		}

		private function eventBrowse(a:Boolean):void
		{
			enable = a;
			if(a===true) {
				stage.addEventListener(MouseEvent.CLICK, browse);

				fileRef = new FileReferenceList();
				fileRef.addEventListener(Event.SELECT, select);
			} else {
				fileRef.removeEventListener(Event.SELECT, select);
				fileRef = null;

				stage.removeEventListener(MouseEvent.CLICK, browse);
			}
		}

		private function browse(e:MouseEvent):void
		{
			if(enable===true) {
				fileRef.browse(allTypes);
			}
		}

		private function select(e:Event):void
		{
			listFiles = fileRef.fileList;

			eventBrowse(false);

			i=0;
			j=listFiles.length;

			if(j>0) {
				loadNextFile();
			}
		}

		private function loadNextFile():void
		{
			if(!(i<j)) {
				listFiles = null;
				trace("Free memory???");
				trace("--------------");
				trace("listFiles:"+	listFiles);
				trace("allTypes:" + allTypes);
				trace("fileRef:" + fileRef);
				trace("tmpFile:" + tmpFile);
				trace("i:" + i);
				trace("j:" + j);
				trace("timer:" + timer);
				trace("--------------");
				eventBrowse(true);
				return;
			}

			tmpFile = listFiles[i];
			i++;
			trace("Initiate load:" + tmpFile.name);
			tmpFile.addEventListener(Event.COMPLETE, loadedFile);
			tmpFile.load();
		}

		private function loadedFile(f:Event):void
		{
			trace("Finished load:" + tmpFile.name);
			tmpFile.removeEventListener(Event.COMPLETE, loadedFile);
			tmpFile = null;

			loadNextFile();
		}
	}
}
Se tiver alguma dica de melhoria (não precisa ser nada de código pronto), apenas dicas mesmo, por favor me indique. Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resposta revisada

 

Eu consegui chegar ao meu objetivo, veja os resultado:

  1. Firefox/Safari (Flash plugin version 12.0.0.77): Inicia com 9Mb, vai até 135Mb e termina com 17Mb.
  2. Google Chrome (PepperFlash version 12.0.0.70): Inicia com 12Mb, vai até 132Mbe termina com 17Mb.
  3. Flash Player (Adobe CS5/Release/FlashPlayer.exe version 10 - 12 without run CS5): Inicia com 6Mb, vai até 185Mbe termina com 185Mb.

Porém neste momento eu descobri algo com FileReferenceList.fileList

Se eu fiz isto FileReferenceList.fileList[5] = null; (quando o "sexto arquivo" não está mais sendo usado) o Flash libera imediatamente a memoria deste FileReference especifico.

 

O que eu quero dizer com isto é que se você fizer isto:

private var file:FileReference;
...
file = FileReferenceList.fileList[5];
...
file = null;

Aparentemente não é a mesma coisa que:

FileReferenceList.fileList[5] = null;

Funcionou em todos, Desktop/Plugins/PepperFlash.

Código funcionando:

package {
    import flash.net.FileReferenceList;
    import flash.net.FileReference;
    import flash.net.FileFilter;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        private var listFiles:Array;
        private var allTypes:Array;
        private var fileRef:FileReferenceList;
        private var tmpFile:FileReference;
        private var i:uint=0;
        private var j:uint=0;
        private var timer:uint;
        private var imageTypes:FileFilter;
        private var enable:Boolean;

        public function Main()
        {
            imageTypes     = new FileFilter(
                "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
            );
            listFiles    = [];
            allTypes    = [imageTypes];

            eventBrowse(true);
        }

        private function eventBrowse(a:Boolean):void
        {
            enable = a;
            if(a===true) {
                stage.addEventListener(MouseEvent.CLICK, browse);

                fileRef = new FileReferenceList();
                fileRef.addEventListener(Event.SELECT, select);
            } else {
                fileRef.removeEventListener(Event.SELECT, select);
                fileRef = null;

                stage.removeEventListener(MouseEvent.CLICK, browse);
            }
        }

        private function browse(e:MouseEvent):void
        {
            if(enable===true) {
                fileRef.browse(allTypes);
            }
        }

        private function select(e:Event):void
        {
            listFiles = fileRef.fileList;

            eventBrowse(false);

            i=0;
            j=listFiles.length;

            if(j>0) {
                loadNextFile();
            }
        }

        private function loadNextFile():void
        {
            if(!(i<j)) {
                listFiles = null;
                trace("Free memory???");
                trace("--------------");
                trace("listFiles:"+    listFiles);
                trace("allTypes:" + allTypes);
                trace("fileRef:" + fileRef);
                trace("tmpFile:" + tmpFile);
                trace("i:" + i);
                trace("j:" + j);
                trace("timer:" + timer);
                trace("--------------");
                eventBrowse(true);
                return;
            }

            tmpFile = listFiles[i];
            trace("Initiate load:" + tmpFile.name);
            tmpFile.addEventListener(Event.COMPLETE, loadedFile);
            tmpFile.load();
        }

        private function loadedFile(f:Event):void
        {
            trace(listFiles);
            trace("Finished load:" + tmpFile.name);
            tmpFile.removeEventListener(Event.COMPLETE, loadedFile);

            tmpFile = null;
            listFiles[i] = null;
    
            i++;
            loadNextFile();
        }
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.