Comunidad de diseño web y desarrollo en internet online

Proceso que se vuelve lento :(

Citar            
MensajeEscrito el 31 Oct 2005 07:17 pm
Hola a todos, vereis he diseñado un arbol n-ario en una clase, para controlar un menu programable. Pues bien, todo vá perfecto hasta que cuando tiene 50 o 60 nodos se vuelve SUPERLENTO :S

El menú está compuesto por items MC que contienen al nodo que le corresponde, y que tienen las funciones para su correcto dibujado, pero al limpiar la escena, es cuando veo que se peta, es decir entras por una opcion, y cuando cambias en la base, tarda muchísimo en limpiarse todo antes de mostrar la nueva subopcion.


A ver si alguien me puede orientar un poco, sobre como hacer ese dibujado y limpiado más optimos, pq he probado el arbol sin dibujar y lo he cargado con 1300 nodos y chuta como las balas.. :)

Gracias....

Por MorphX

SWAT Team

982 de clabLevel

3 tutoriales

  SWAT

La Telaraña Digital

firefox
Citar            
MensajeEscrito el 01 Nov 2005 12:50 pm
Estoy intentando guardar en un array el camino de selecciones que se vá tomando para dibujar, para de ese modo limpiar de pantalla solo lo que se dibujó, NO todo el arbol...

A ver si por esas ... el problema es cuando borrar, pq el codigo de borrado está en el interior de cada item, y no siempre se tiene que estar borrando pq sino nunca se dibujaría..

Una orientacion plis....

Por MorphX

SWAT Team

982 de clabLevel

3 tutoriales

  SWAT

La Telaraña Digital

opera
Citar            
MensajeEscrito el 02 Nov 2005 04:34 pm
Weno por fin lo solucioné, pero o nadie leyó mi post, o no pudieron ayudarme, o que se yó... pero nadie dijo nada :(

En fin indico un poco lo que pasaba y como lo solventé por si a alguien le pasara en el futuro...

El problema no era de mi clase arbol como ya comenté, sino en como pintaba en pantalla los nodos, dado que en cada MC Item yo borraba y pintaba TODOS los nodos del arbol, claro por eso en cuanto había un determinado numero en pantalla, era la muerte de lento. Lo ke he hecho ha sido crearme un array auxiliar donde voy guardando la seleccion actual y a la altura de arbol correspondiente, de modo que a la hora de borrar pq elijas otra opcion, lo ke hago es recorrer al reves dicha tabla, borrando de pantalla solo los items que dibujé por cada nivel del arbol, y ahora si que vá super rapido.

http://usuarios.lycos.es/morphgx/menumng

Ahí lo teneis por si le kereis echar un vistazo y comentarme cosas :)

Saludos... a todos...

Por MorphX

SWAT Team

982 de clabLevel

3 tutoriales

  SWAT

La Telaraña Digital

opera
Citar            
MensajeEscrito el 02 Nov 2005 04:57 pm
Leyendo, si hubieras puesto un poco de codigo, podriamos haber mirado el problema, asi no mas es muy dificil; ahora que lo solucionaste, podrias poner algo del codigo problematico y la solución al mismo tambien :)

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 02 Nov 2005 05:23 pm
Ok Fredd, lo intentaré aunke es algo engorroso, lo importante para mí era la idea... :) no el como exacto :P

He tenido que ampliar la información que guardaba por nodo en la clase arbol, para poder saber en ke NIVEL lógico se encontraba un nodo, y su padre, etc.. pero obviando esto.. me centro en el .fla de representación que es donde fallaba.

en el main tenía esto +/-

Código :

//Código de carga en el arbol desde la BD------------------
cat.loadBranch(padre);

cat.onLoadBranch = function(res)
{
   var rst:RecordSet;
   var row:Object;
   
   rst = res.result;
   
      for (var c:Number = 0;c < rst.length;c++)
      {
         var nodo:MenuDB = new MenuDB(bosque);
         var dat:Array = new Array();
         
         row = rst.getItemAt(c); //Obtenemos registro a registro todos los hijos
         
         dat['titulo'] = row.name;
         dat['padre'] = row.parent;
         dat['orden'] = row.orden;
         dat['added'] = row.added;
         
         //Inicializamos el nodo
         nodo.nDat = dat;
         nodo.pRnt = row.parent;
         nodo.nOrd = row.orden;
         //Lo añadimos al arbol/bosque.
         nodo.addNodoAt(bosque[row.parent]);
         //trace("Nodo: "+nodo.id+" R Padre: "+row.parent+" Padre: "+bosque[row.parent].id+" Nivel: "+nodo.pDN);
      }
      
sh(padre);
}

//MenuDB es mi clase arbol


//------------- Dibujado
function sh(pd)
{
   var hijs:Array = bosque[pd].vHijos();
   var pdd:Number = hijs[0].pDN;
   
   for(var i:Number = 0; i<hijs.length ; i++)
   {   
      var nodG:MovieClip = attachMovie("item","NodoG"+(i+1)+pdd.toString(),maxprf());
      nodG.nodo = hijs[i];
   }
}

//------------- Borrado
function rm(pd)
{   
   var hijs:Array;
   var padres:Array;
   
   padres = bosque[bosque[pd].pRnt].vHijos();
   
   for(var x:Number = 0;x<padres.length;x++)
   {
      hijs = padres[x].vHijos();
      var pdd:Number = hijs[0].pDN;
      this["NodoG"+(x+1)+padres[x].pDN.toString()].sel._alpha = 0;
      
      for(var i:Number = 0; i<hijs.length ; i++)
      {   
         rm(hijs[i].id);
         removeMovieClip(this["NodoG"+(i+1)+pdd.toString()]);
      }
   }
}




rm era la función ke fallaba, pq si observais borra recorriendo el arbol a saco y sin control. Encima tengo un simbolo llamado Item que contiene esto:

Código :

import MenuDB.MenuDB;

var nodo:MenuDB;


titu.text = nodo.nDat['titulo'];


this._y = (1+(24*nodo.nOrd));
this.tween("_x",1+(152*nodo.pDN),0.2,"linear",0,function(){});
tap.tween("_y",-2,1,"easeOutQuad",0,function(){});


hit.onRelease = function()
{
   if(!nodo.esHoja())
   {
      _parent.rm(nodo.id);
      _parent.sh(nodo.id);
       sel._alpha = 100; //Marcamos que está seleccionado
   }
   else
   {
      _parent.rm(1);
   }
}


Con lo cual cada vez que se instancia un item, que pulsabamos en él se HACIA ESTA GUARRADA DE BORRADO :(


Solución:

Modificando código como dije en la clase MenuDB, para tener más información del nodo en el que estoy, y haciendo un borrado selectivo, para ello el main ahora tiene 2 variables nuevas, un array de camino y un numero de último seleccionado, el array es asociativo, [NIVEL|IDNODO] es decir en la posición equivalente al nivel de profundidad actual, tengo en ella ke nodo se pulsó, de modo que ahora tngo 3 tipos de borrado, uno para cada grupo de situaciones quedando así :

Código :

//------------- Borrado pantalla
//Borrado general
function rm(pd)
{   
   for(var n:Number = path.length-1;n>=0 && n>=pd.pDN;n--)
   {
      var hijs:Array = bosque[path[n]].vHijos();
      for(var i:Number = 0; i<hijs.length ; i++)
         removeMovieClip(this["N"+hijs[i].id.toString()]);
   }
}
//Borrado de hijos inmediatos
function rmh(pd)
{   
   var hijs:Array = bosque[pd].vHijos();
   for(var i:Number = 0; i<hijs.length ; i++)
      removeMovieClip(this["N"+hijs[i].id.toString()]);
}
//Borrado de un nodo
function rmid(id)
{   
   removeMovieClip(this["N"+id.toString()]);
}
//---------------------------------


En fins... espero que no os hayais perdido mucho, es más, espero que le sirva de algo a alguien más que a mí, que a mi me ha costado más de un disgusto (REAL :()

Saludos....

Por MorphX

SWAT Team

982 de clabLevel

3 tutoriales

  SWAT

La Telaraña Digital

firefox

 

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