Comunidad de diseño web y desarrollo en internet online

Problemas de rendimiento al usar Movieclip

Citar            
MensajeEscrito el 16 Jul 2012 04:38 pm
Hola,
no sé bien donde ubicar este problema porque creo que es más problema de rendimiento de Flash que de programación...
Me explico,
tengo un código que clickando un botón abre un popup. A parte de cerrarlo con el botón de cerrar, he incluido la típica shape con alfa debajo para bloquear lo que hay detrás del popup mientras esté abierto.
El pseudo-código es el siguiente

Código ActionScript :


var panel: Shape; 
var btn_open:SimpleButton; //Botón que al clickar abre el popup
var popup:MovieClip;  //Popup genérico 
btn_open.addEventListener(mouseEvent.CLICK, showPopup);

function showPopup(e:MouseEvent):void {
  setPanel();
  //mostrar popup
 //..
}
//....
popup.btn_close.addEventListener(mouseEvent.CLICK,close);//Botón dentro del popup para cerrarlo

function close(e:MouseEvent):void{
  //Cerrar popup
  closePanel();
}
public static function setPanel():void {
   var myShape:Shape; 
   if(panel==null){
     myShape= new Shape();
     myShape.name='panel';
    myShape.graphics.beginFill(0x000000,0.3); 
     myShape.graphics.drawRect(0, 0, stage.width, stage.height);
     myShape.graphics.endFill();
     panel=myShape;
   }
   if(!this.contains(panel)){
      this.addChildAt(panel,popup_index-1); //popup_index es el índice del popup, el panel ha de quedar siempre por debajo              
   }
}
function closePanel():void{
 this.removeChild(panel); 
}



El código anterior funciona perfectamente pero he decidido incluir un pequeño cambio, quiero que si se clicka fuera del popup éste también se cierre. Para éllo he cambiado el tipo de componente panel de Shape a MovieClip para asignarle un listener que atienda al CLICK del mouse y entonces cierre el popup...

Cambios:

Código ActionScript :

var panel: MovieClip;
var btn_open:SimpleButton; //Botón que al clickar abre el popup
var popup:MovieClip;  //Popup genérico 
btn_open.addEventListener(mouseEvent.CLICK, showPopup);

function showPopup(e:MouseEvent):void {
  setPanel();
  //mostrar popup
 //..
}
//....
popup.btn_close.addEventListener(mouseEvent.CLICK,close);//Botón dentro del popup para cerrarlo

function close(e:MouseEvent=null):void{
  //Cerrar popup
  closePanel();
}
public static function setPanel():void {
   var myShape:Shape; 
   if(panel==null){
     myShape= new Shape();
     myShape.graphics.beginFill(0x000000,0.3); 
     myShape.graphics.drawRect(0, 0, stage.width, stage.height);
     myShape.graphics.endFill();
     panel=new MovieClip();
     panel.name='panel';
     if(!panel.contains(myShape))
       panel.addChild(myShape); 
     if(!panel.hasEventListener(mouseEvent.CLICK))
        panel.addEventListener(mouseEvent.CLICK, onReleasePanel); 
   }
   if(!this.contains(panel)){
      this.addChildAt(panel,popup_index-1); //popup_index es el índice del popup, el panel ha de quedar siempre por debajo              
   }
}
function closePanel():void{
 this.removeChild(panel); 
}
function onReleasePanel(e:MouseEvent):void{
   close(); //Cerrar popup+panel
}


El segundo código también es funcional, pero mi duda viene ahora. Si abro y cierro sucesivamente un popup, con el segundo método el rendimiento baja bastante del orden de 12 frames por segundo.... Lo sé porque tengo un indicador que me lo marca y haciendo lo mismo con el primer método no me sucede, oscila pero se recupera rápido.
Simplemente he cambiado el tipo de displayObject porque con una Shape no puedo detectar los eventos de CLICK. No entiendo por qué penaliza tanto...Y no me lo puedo permitir porque la pérdida se incrementa, realentizando el funcionamiento global.

Por favor, ayuda :)

Gracias de antemano.

Por curiositykilledthecat

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Jul 2012 08:32 pm
y mira para empesar elegiste un mal lenguaje para hacer pop ups
jejeje, si pones un grafico que ocupe la pantalla entera y a ese grafico gigante le asignas un evento
es practicamente obvio (solo en flash pasa esto) que se va a realentisar mucho :P
si podes usa javascript o algo, sinceramente el codigo no lo vi
pero estoy seguro que por 40 lineas de codigo no se va a realintsar una web entera, lo que si es para mi, es eso de q es un grafico grande. saludos.

Por skaterseba

Claber

170 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Jul 2012 10:02 am
Agradezco tu ayuda,
el cambiar de lenguaje no es una opción en este momento, he copiado una parte del código pero el proyecto es bastante extenso a estas alturas :)

Se realentiza en el momento que paso de una Shape a un MovieClip y le añado un listener, te aseguro que no hay nada más (caprichos de flash :). Si la shape no acepta eventos de mouse no veo otra opción sin recurrir a un Sprite o MovieClip pero no quiero que me penalice los fps.

Me podríais dar alguna sugerencia para añadir esta funcionalidad en AS3 sin que baje el rendimiento por favor?

Gracias!

Por curiositykilledthecat

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Jul 2012 10:37 pm
MMMM, un consejo seria que reveas todo el proyecto, si estas haciendo todo en un solo swf, desde ya te recomiendo NO lo hagas :P jajaja. experiencia propia nomas

mas alla de eso, si separando las secciones no te sirve (el pop up hacelo en el mismo fla que quieres que aparezca) saca el event listener del movieclip que hace que desaparezca el pop up clickeando en el movieclip
y en su lugar solo deja una cruz que diga CERRAR o solo la cruz.

PD:lo mas recomendable es que separes las secciones. si tenes inconvenientes con separarlas dime por que, y veo como te ayudo.

Por skaterseba

Claber

170 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Jul 2012 04:24 pm
Gracias de nuevo,

pero creo que no me estás entendiendo o quizá yo no me explico bien :) El proyecto está muy parcelado, hay del orden de 90 clases, no exagero...Cada popup es un .swc independiente generado a partir de un fla independiente, así que por lo de que 'sea todo un mismo fla/swf ' no te apures porque no lo es :)

La solución que me planteas de dejar solo el botón de cerrar con la cruz no es una solución puesto que no implementa la funcionalidad que te comento de cerrar clickando en el panel posterior (mc) que bloquea los elementos de detrás, simplemente prescinde del problema ;)

Gracias de todos modos.

Por curiositykilledthecat

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Jul 2012 07:11 pm
claro, pero si me decis que te alenta el fla, es lo unico que se me ocurre jeje, suerte con eso.

Por skaterseba

Claber

170 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Jul 2012 04:23 am
chekea q popup_index-1 no este dando negativo

Saludos


eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.