Comunidad de diseño web y desarrollo en internet online

problema con setInterval, eso creo

Citar            
MensajeEscrito el 07 Oct 2004 12:31 am
Hola, cómo va, amigos. Les cuento un problema que tengo, ¿puede ser? :D

Estoy haciendo un sitio en Flash y definí una función para que cada vez que se cargue una sección se la invoque. Esta función hace lo siguiente: coloca un MC de la biblioteca en el Stage y luego uso un setInterval para moverlo hasta el centro del Stage con animación.

Código :

function carga() {
   _root.attachMovie("cargando", "cargador", this.getNextHighestDepth());
   animacion = function(peli) {
      peli._y = 220;
      if (peli._x >= Stage.width/2) {
         clearInterval(idIntervalo);
         return;
      }
      peli._x += 50;
      updateAfterEvent();
   };
   idIntervalo = setInterval(animacion, 1, cargador);
}


El MC de la biblioteca que cargo es el que tiene todas las acciones de sacar el porcentaje y otro setInterval para hacer una animación del MC saliendo del Stage:

Código :

this.onEnterFrame = function() {
   porcentaje = Math.floor(_level10.getBytesLoaded()/_level10.getBytesTotal()*100);
   carga = porcentaje+"%";
   if (porcentaje == 100) {
      animacion = function (peli) {
         peli._y = 220;
         if (peli._x >= Stage.width+50) {
            clearInterval(idIntervalo2);
            removeMovieClip(_root.cargador);
            return;
            }
            peli._x += 75;
            updateAfterEvent();
         };
         idIntervalo2 = setInterval(animacion, 500, _root.cargador);
   }
};


La cosa es que cuando lo pruebo por primera vez al loading anda joya, o sea carga la seccion y el MC se pone en el centro del Stage con una animación, me muestra el progreso de carga, y luego se va del Stage con otra animación, pero cuando quiero probarlo por segunda vez el MC pasa de largo por el Stage, es decir no se detiene en el medio hasta que el porcentaje esté en 100 :crap: Debe haber algo mal allí pero no sé lo que es sinceramente. Ojalá puedan ayudarme. Thanx por anticipado.

Por Smithy

159 de clabLevel



Genero:Masculino  

unknown
Citar            
MensajeEscrito el 07 Oct 2004 03:53 am
usar setinterval puede llegar a ser una mala opción, porque de pronto pierdes el control y los recursos del cpu se agotarán rápidamente

lo mejor es utilizar onenterframe, checa la sección tutoriales.

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

unknown
Citar            
MensajeEscrito el 07 Oct 2004 03:18 pm
en serio? enterFrame mejor que setInterval? pues que yo había leído en un montón de lugares que setInterval es mucho mejor ya que no depende de los fps y demás cosas...

Por Smithy

159 de clabLevel



Genero:Masculino  

unknown
Citar            
MensajeEscrito el 07 Oct 2004 03:22 pm
Es que es cierto, no dependes de los fps sino de la velocidad del reloj del sistema, es muy bonito y útil... sino fuese porque para eliminarlo a veces has de arrancar el disco duro de tu ordenador, quemarlo y lanzarlo al mar cubierto de cemento :bate:

En serio, setInterval es poco aconsejable, aunque a veces vaya bien usarlo.

Un saludo!! ^^

Por Elecash

Claber

8126 de clabLevel

37 tutoriales
19 articulos
13 ejemplos

  Bastard Operators From Hell Desarrollador de GAIA Premio_Secretos Héroes

BarnaCity

unknown
Citar            
MensajeEscrito el 07 Oct 2004 03:40 pm
Creo que uno cada tiene su momento...
El enterFrame tiene la desventaja de depender de los fps....y el setInterval...bueno, he visto mucho que lo critican porque se "come" al procesador....pero alguno de uds alcazo a comprobado esto ? ...realmente se les cuelga el Solitario o el Buscaminas al usar setInterval.
Yo uso setInterval cuando es necesario y sobre Stages críticos de cargar...lo uso y hago que se desactive cuando haya hecho lo suyo...y muy rara vez (nunca) lo dejo ejecutándose continuamente...pero igual, jamás me ha colgado la máquina esa opción...y no estoy usando la última generación de PC's.
De todos modos no sobra recomendar que hay que cuidar su uso y no aprovecharse....

Por gersonm

Claber

2238 de clabLevel

12 tutoriales
1 articulo
5 ejemplos

Genero:Masculino   Desarrollador de GAIA

Al otro lado de la mira

unknown
Citar            
MensajeEscrito el 07 Oct 2004 03:51 pm
no se hagan bolas, el setinterval también depende de los fps (hagan pruebas disminuyendo el _alpha de un movieclip con setinterval y pruébenlo a 24, 20, 15, 10 y 5 fps y se darán cuenta)

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

unknown
Citar            
MensajeEscrito el 07 Oct 2004 04:20 pm
Un setInterval optimo

Código :

var hilo:Number;
function mover(){
    if(cosa_mx._x>Stage.width){
        clearInterval(hilo);
    }
    cosa_mc._x+=10;
    updateAfterEvent();
}
hilo = setInterval(mover,100);

setInterval es el mas recomendado; realmente, lean la ayuda de Flash

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

unknown
Citar            
MensajeEscrito el 07 Oct 2004 06:10 pm
yo tambien prefiero setInterval

Y si vas ha usar para mover cosas , quitale el updateAfterEvent alivia bastante la cpu

A todas no hay grandes diferencias de recursos , setinterval es un pelin mas rapidad pero casi no se nota

Las dos son validas

salu2

Por buho29

510 de clabLevel

1 tutorial

7 ejemplos

 

unknown
Citar            
MensajeEscrito el 08 Oct 2004 03:11 am
Pero sin el updateAfterEvent no me gusta el efecto que da al no actualizar de acuerdo a ciclos de CPU sino a FPS; cosa de gustos

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

unknown
Citar            
MensajeEscrito el 08 Oct 2004 03:17 pm
a ver no es cuestion de gusto es cuestion de recursos !! y claro depende tambien lo q vas animar

Y en tu code el loop es cada 0.1 sg , q en fps es 10 frames/sg , se deberia ver el movimiento bastante brusco , si tu peli esta a 30 fps no se deberia de notar el updateAfterEvent ya q abra un desfase minimo .

Para mi es mas importante los recursos q el peso de la peli , usabilidad ??

Todas mis pelis estan a 30 fps , creo q es mas q suficiente para verlo bien , si tu maquina no puede el updateAfterEvent empeora las cosas !

Ultimamente estoy arto de ver webs flash q se nesecitan un 3.2 minimo para verlo fluido .

Otra no metais muchas cosas dentro de la function , es mejor crear mas setInterval ...

Por buho29

510 de clabLevel

1 tutorial

7 ejemplos

 

unknown
Citar            
MensajeEscrito el 08 Oct 2004 03:47 pm
La usabilidad no trata de eso

Los setInterval son para lo que son y el updateAfterEvent es para cuando se necesita.

el onEnterFrame, es un evento bastante viejo heredado de Flash 5 cuyo uso fue ... descubierto mas que planeado

Ya hace mucho (mucho, muchisimo) tiempo tuvimos una discusión similar de cual era la forma mas optima de crear programación concurrente por multihilos en Flash; es claro que para eso es la función setInterval de Macromedia; y es claro que cada instrucción tiene una razon.

0.1 segundos son una eternidad para el procesador asi sea viejo, si viste "sistemas operativos 1" ;)

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

unknown
Citar            
MensajeEscrito el 08 Oct 2004 05:25 pm
La usabilidad no trata de eso
tienes razon pero personalmente sabre perdornar una peli de 4 mg pero nunca una peli q me vaya a cuadros ....

Código :

Match freddie® = 1 ; buho29 = 0 


el updateAfterEvent es para cuando se necesita.
Tamos de acuerdo ya no es una cuestion de gustos XD XD

Código :

Match freddie® = 1 ; buho29 = 1 


el onEnterFrame, es un evento bastante viejo heredado de Flash 5 cuyo uso fue ... descubierto mas que planeado
bueno el onEnterFrame es de mx (te caze!) XD XD y el enterFrame de flash 5

Flash trabaja en fps , antes de este evento se hacia por linea de tiempo (flash 4)

Frame 1 = todo el code de inicio de variable
Frame 2 = el code q quierres q haga
Frame 3 = gotoAndPlay (2)

Flash trabaja en fps , es lo q hay , todo intento de hacer trabajar flash en cosas q no fue diseñado , se paga con un aumento de recursos , flash no trabaja en tiempo , lo hace por fps , se puede imitar pero eso tiene un precio ... , ademas es logico pensar q cuantas mas veces se ejecute el code mas recursos requerira ...

Código :

Match freddie® = 1 ; buho29 = 2 


0.1 segundos son una eternidad para el procesador asi sea viejo, si viste "sistemas operativos 1"
0.1 segundos es una eternidad para el ojo y obviamente una vidad para la cpu , no vi la peli ?

Código :

Match freddie® = 2 ; buho29 = 2 


la forma mas optima de crear programación concurrente por multihilos en Flash; es claro que para eso es la función setInterval de Macromedia;
ahi es simple , no entiendo nada XD XD , q lo as sacao de el manual ?? XD XD

Por buho29

510 de clabLevel

1 tutorial

7 ejemplos

 

unknown
Citar            
MensajeEscrito el 08 Oct 2004 05:48 pm

buho29 escribió:

Flash trabaja en fps , es lo q hay , todo intento de hacer trabajar flash en cosas q no fue diseñado , se paga con un aumento de recursos , flash no trabaja en tiempo , lo hace por fps , se puede imitar pero eso tiene un precio ... , ademas es logico pensar q cuantas mas veces se ejecute el code mas recursos requerira ...

Si trabajas con Flash haciendo RIAs, usando Forms en vez de timeline y clases que hagan uso de hilos con setInterval (ya veras cuando tenga listo el clabChat); entonces trabajaras en Flash a cilocs de procesador, como cualquier software de desarrollo de aplicaciones, no a FPS

Interesante Match xD :ninja:

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

unknown
Citar            
MensajeEscrito el 08 Oct 2004 06:26 pm
:o pues sí, ya cambié a la funcion bastante y me quedo bien. Todavia tiene algunos problemitas pero mucho mas pequeños. Mi pelicula no creo que sea tan pesada de leer. Yo tengo un P4 a 1.8 con 256 ram y no tengo el menor problema. Gracias por todas las respuestas. Divertido el debate :D

Por Smithy

159 de clabLevel



Genero:Masculino  

unknown
Citar            
MensajeEscrito el 08 Oct 2004 10:31 pm
SetInterval no es mejor que onEnterFrame y viceversa: cada uno tiene su función y es tarea del buen programador saber cuándo utilizar uno u otro.

El setInterval fue una gran aportación en el MX que permitía hacer tareas que en un enterFrame podían llegar a ser redundantes y consumir recursos en exceso.

Pero el enterFrame tiene una ventaja sobre el setInterval: las acciones te las va a ejecutar igual en un pentiumII que un pentiumVII, no va a depender de la velocidad de procesado de la máquina.

Esto queda muy claro programando juegos en flash. Por ejemplo, hace algún tiempo hice un matamarcianos. Había escuadrones de muchos enemigos, decenas de objetos moviéndose al mismo tiempo, etc. Un pentium IV era capaz de sacarme 18 escuadrones en 3 minutos, mientras que una máquina más vieja a lo mejor no llegaba a 12.

Programando todo el motor del juego en un único enterFrame se consigue que, juegues en la máquina que juegues, todos alcancen en 3 minutos el mismo número de escuadrones. Los de la máquina más vieja no lo verán igual de fluido que los de la nueva, pero hay consistencia.

El caso de los juegos es perfecto para ver este tipo de cosas. Con formularios y web normales casi nunca se explota la diferencia entre ambos.


Otra cosa, aunque igual que Elecash yo pensaba que a veces el setInterval hacía lo que quería y no se eliminaba bien etc, después de que una persona me explicara su funcionamiento interno lo entendí todo, y puedo decir (al menos por ahora), que funcionan perfectamente.

A quién no le ha pasado que un intervalo le va bien una vez o durante un rato, y luego parece que se acelera o que no funciona, etc? (que supongo que es lo que le pasaba a smithy, no me he mirado bien el código).

Pues bueno, todos sabemos que para eliminar un setInterval hacemos un clearInterval de su id, pero este id no es realmente el nombre del objeto, sino un puntero que nos "deja" flash para referenciarlo, pero el objeto en memoria lo almacena en una especie de array. Si perdemos este puntero, flash no lo destruye de memoria, por lo tanto se sigue ejecutando.

Un ejemplo:

id = setInterval(funcion,1000)

Flash internamente:
array_intervalos = [0x001]

donde 0x001 es id.

Ahora declaramos otra vez un setInterval con el mismo código:

id = setInterval(funcion,1000)

Flash internamente:
array_intervalos = [0x001,0x002]

Mooooc, ahora id está apuntando a 0x002, con lo que hemos perdido para siempre el puntero hacia 0x001, con lo que tenemos que la velocidad se ha duplicado.

Un fallo muy corriente es poner setInterval dentro de enterFrame, y a pesar de eliminarlos explicitamente, como el setInterval funciona por ciclos de reloj y es independiente de los fps, a lo mejor entre la creación y creación del intervalo no se ha llegado a limpiar el anterior, con lo que se ha dejado en memoria y ya no se puede acceder a él. Multiplica esto por la velocidad de fps y aquí es cuando nuestros objetos se han movido tan rápido que no están en pantalla, han aumentado su velocidad, etc. y creemos que flash está como una cabra. Esto es muy común.

Otro fallo también es moverse por los niveles de la peli sin destruir el intervalo y luego sobreescribirlo en otro lugar (en verdad sobreescribes el puntero), y volvemos a tener el mismo efecto.

Pues eso, 2 métodos igual de buenos que pueden servir para hacer lo mismo pero tienen diferente forma de conseguirlo, por eso más vale saber distinguir bien su fucionamiento.

Saludos!! :)

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

unknown
Citar            
MensajeEscrito el 09 Oct 2004 09:45 pm
Bueno al final liamos todo ...

danisan escribió:

Programando todo el motor del juego en un único enterFrame se consigue que, juegues en la máquina que juegues, todos alcancen en 3 minutos el mismo número de escuadrones. Los de la máquina más vieja no lo verán igual de fluido que los de la nueva, pero hay consistencia.


Eso es una aberracion y no lo recomiendo a nadie o al menos q haga pruebas

Meter todo el code en un enterFrame es la muerte para cualquier cpu , ultimageneracion incluido .

Tengo un ejemplo (mira en cristalab) donde hay un especie de menu 3D , cada letra tiene su enterFrame y la cosa va mas o menos bien ... ,pero si lo meto en un solo enterFrame eso es quemar la cpu , no puede , en el ejemplo se mueve 80 mc ...

volviendo al setInterval a ver si de una vez me explico mejor , la principal diferencia es q flash visualiza en fps , eso no hay remedio es asi , da igual q sea en form o diapositivas , flash es una peli y trabaja en fps !!!

Bien setInterval trabaja a ciclo de cpu , trabaja por tiempo ..., si tu te haces un setInterval q llame a una funcion cada 0.0001 sg , lo va a cumplir a raja tabla , las operaciones se haran , pero el problema es q flash visualiza en fps , si tu lo tienes A 1 fps , se vera un cuadro cada segundo , las operaciones se ejecutan pero no los ves .

Bueno como dijo F esta updateAfterEvent , lo q hace es intentar visualizar lo q flash no puede hacer , forzar la maquina ... , por eso intento q tengais cuidado ...

no metais un updateAfterEvent si vais a meter un setInterval de 0.001 , eso no se ve y flash tiene q ejecutar el code mas veces de lo debido , setInterval es un pelin mas rapido y tiene otras ventajas como puedes controlar de verdad el tiempo de el movimiento pero un mal uso de setInterval eso puede ser fatal ....

El q se haga un lio q siga trabajando con onEnterFrame q ni es malo ni va caducar , la naturaleza de flah son fps y gracias a dios !! Porq flah es jodidamente lento !!!

Por buho29

510 de clabLevel

1 tutorial

7 ejemplos

 

unknown
Citar            
MensajeEscrito el 09 Oct 2004 11:38 pm
Hola buho, primero decirte que no quiero liar nada, sólo doy mi opinión en base a mi experiencia.

buho29 escribió:

danisan escribió:

Programando todo el motor del juego en un único enterFrame se consigue que, juegues en la máquina que juegues, todos alcancen en 3 minutos el mismo número de escuadrones. Los de la máquina más vieja no lo verán igual de fluido que los de la nueva, pero hay consistencia.


Eso es una aberracion y no lo recomiendo a nadie o al menos q haga pruebas

Meter todo el code en un enterFrame es la muerte para cualquier cpu , ultimageneracion incluido.


No es ninguna aberración. Que el motor de un juego corra a cargo de un único enterFrame no significa que esté continuamente ejecuntándose todo el código. Para eso existen condicionales, tengo arrays que actúan como recolectores de basura para elementos que ya no necesito, etc.

Es más, cuanto más grande es el proyecto más prefiero tener un único enterFrame que no 100 dispersos por la película.


buho29 escribió:

Tengo un ejemplo (mira en cristalab) donde hay un especie de menu 3D , cada letra tiene su enterFrame y la cosa va mas o menos bien ... ,pero si lo meto en un solo enterFrame eso es quemar la cpu , no puede , en el ejemplo se mueve 80 mc ...


Muy bueno el efecto :) Mira, tu código ejecutado en un único enterFrame:

Código :

MovieClip.prototype.carusel = function() {
      if (_root._xmouse>centrox) {
         direccion = -1;
      } else {
         direccion = 1;
      }
      velocidad = Math.abs((_root._xmouse-centrox)/(275/velocidadmaxima));
      this.angulo += (velocidad*direccion);
      this._x = centrox+Math.cos((Math.PI/180)*this.angulo)*2*radio;
      this._y = centroy+Math.sin((Math.PI/180)*this.angulo*7)*radio/-10;
      this.z = Math.sin((Math.PI/180)*this.angulo)*radio;
      this._alpha = this._yscale=this._xscale=(100*distanciafocal)/(distanciafocal+this.z);
};

_root.onEnterFrame = function()
{
   for (var a in listaLetras)
   {
      listaLetras[a].carusel()
   }
}
//para ir sumando la profundidad
function maxprofundidad() {
   return ++profundidad;
}
//inicio variables
centrox = 500/2;
centroy = 500/2;
radio = 100;
velocidadmaxima = 3;
distanciafocal = 180;
listaLetras = new Array();
//creando los titulos
titulos.text = ".: Escribe cualquier tonteria en el campo de texto :. ";
//creando los clips q contendran las letras

function creaLetras() {
   var letras = new Array();
   for (var i = 0; i<=titulos.text.length; i++) {
      letras[i] = titulos.text.substr(i, 1);
      var letra = this.attachMovie("letrita", "letrita"+i, i+1);
      letra.angulo = Math.round((360/titulos.length)*i);
      letra.contenido.text = letras[i];
      // --------- letra.carusel(); ----------------------------
      listaLetras.push(letra);
   }
}
function borraLetras() {
   trace(listaLetras.length);
   for (var i = 0; i<listaLetras.length; i++) listaLetras[i].removeMovieClip();
   listaLetras = [];
   profundidad = 1;
}
creaLetras();
boton.onPress = function() {
   borraLetras();
   creaLetras();
};
stop();


Como puedes ver lo único que he hecho es quitar el enterFrame del prototipo, crear un único enterFrame en el _root y aprovechando que ya tenías el array con todas las letras hacer un for...in para moverlas. Ahora comprueba el rendimiento de los swf, primero con tu código y luego con el mío, y verás que no varía. Tú frase de si lo meto en un solo enterFrame eso es quemar la cpu , no puede no es correcta. Es lo mismo 1 enterFrame moviendo 80 clips que 80 enterFrames moviendo 1 clip.


buho29 escribió:

Bien setInterval trabaja a ciclo de cpu , trabaja por tiempo ..., si tu te haces un setInterval q llame a una funcion cada 0.0001 sg , lo va a cumplir a raja tabla , las operaciones se haran , pero el problema es q flash visualiza en fps , si tu lo tienes A 1 fps , se vera un cuadro cada segundo , las operaciones se ejecutan pero no los ves .


Ahí tienes toda la razón, y por eso yo quería explicar que muchas veces, usando un setInterval, dependiendo de la máquina, flash no va a ser capaz de visualizar todo lo que le pidamos. En cambio, con enterFrame siempre te lo va a dar en cualquier máquina.

Si pusieramos un pelota en el punto x =10 en el fotograma 1 y la pelota en el x=100 en el fotograma 10 y moviéramos de 10px en 10px, en cada fotograma veríamos la pelota en las posiciones 20, 30, 40, etc. En cambio, con setInterval, corremos el riesgo que, a pesar de que flash ejecuta las operaciones (como dices tú, lo va a cumplir a rajatabla) no sea capaz de dibujarla en cada punto, con lo que a lo mejor veríamos la pelota en el punto 20, 50, 80 y 100.
Está claro que con un simple objeto no sucederá, pero puede pasar con muchos objetos moviéndose por pantalla. He citado el caso de los juegos porque es aquí donde se aprecia mucho usar un método u otro. Con eso me refería yo a dar consistencia, conque todo el mundo vea la pelota cada 10px sin que importe la máquina.

Bueno buho, espero haberme explicado mejor que la vez anterior :D

Saludos!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

unknown
Citar            
MensajeEscrito el 10 Oct 2004 08:03 pm
danisan , te entendi perfectamente la primera vez ...

Y tienes toda la razon , llevo todo el dia con pruebas y francamente me quedo con onEnterFrame , tiene mejor visualizacion y consume igual ...

no hay diferencia entre usar solo un enterFrame o varios ...
Se visualiza mejor con enterFrame y con menos recursos

Estas pruebas ya las hice hace mas de 1.5 año , con los mismos ejemplos y los resultados no tiene nada q ver con las de hoy , me debi de equivocar de aquellas , francamente no se ...

Pero gracias !! , lo de liarla era por todos no por ti ...

Os dejo las pruebas q hice , esto va al maximo , 120 fps

Teneis q hacer una relacion de lo q veis , lo q consume y los fps

Miren y saquen conclusiones vosotros mismos ...

con 110 enterFrames


con 1 enterFrames


con setInterval con updateAfterEvent


con setInterval sin updateAfterEvent


pd: nunca me acuerdo de q es fondo transparente

http://www.activicio.com/lab/enterFrame.rar

Estos ejemplos son un pelin bestias para decir cual es mejor , hagan pruebas yo ya no me mojo mas :twisted: :twisted:

Se ha echo largo este post XD XD

Y lo jodidamente equivocado q estaba :cry: :cry:

salu2

Por buho29

510 de clabLevel

1 tutorial

7 ejemplos

 

unknown
Citar            
MensajeEscrito el 10 Oct 2004 08:16 pm
juas, en mi caso gano "setInterval sin updateAfterEvent "

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

unknown

 

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