jQuery animate () y rendimiento del navegador


Tengo algunos elementos que me estoy moviendo a través de la página muy lentamente. Esencialmente, estoy disminuyendo el margen izquierdo de dos imágenes en un lapso de 40 segundos más o menos.

Visualmente, está funcionando muy bien. Sin embargo, mi procesador salta a alrededor del 50% de uso durante las animaciones. Esto tampoco es específico de ningún navegador individual, es de la misma manera en Safari3 y Firefox3. Si tengo ambos navegadores ejecutando la página, mi CPU está gritando en alrededor del 95% de uso.

Estoy usando jQuery 1.3. Ambas animaciones están sucediendo simultáneamente. No hay Flash en la página. Si comento el código (elimino la animación) y refresco la página, mi procesador vuelve inmediatamente al uso normal.

Espero no tener que recurrir a Flash, pero incluso ver programas en Hulu.com no pincha mi CPU así.

Pensamientos?

Author: Jeremy Ricketts, 2009-01-20

7 answers

Creo que la forma en que funciona jQuery animate() es que usa un temporizador que dispara periódicamente e invoca una función que actualiza el DOM para reflejar el estado de la animación. Por lo general, las animaciones son relativamente cortas y pueden cubrir una buena cantidad de espacio en pantalla, por lo que sospecho (sin confirmar) que el temporizador expira, y se restablece, a una velocidad bastante alta para generar una animación suave. Dado que la animación tarda mucho tiempo, es posible que pueda modificar la función animate para que la velocidad a la que procede la animación se puede establecer a través de una opción. En su caso, solo tendría que actualizar cada 250 ms más o menos, ya que está cubriendo aproximadamente 3-4 píxeles por segundo, aproximadamente.

 34
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-19 21:43:14

Sé que esta es una pregunta antigua y Tim proporcionó una gran respuesta , pero pensé que debería publicar una actualización para cualquiera que busque una solución a este problema, ya que ahora hay una forma más simple...

A partir de jQuery 1.4.3 puede establecer el intervalo que utiliza animate de jQuery directamente a través del jQuery.fx.intervalo propiedad. Así que simplemente puedes hacer algo como:

jQuery.fx.interval = 50;
 44
Author: Alconja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:08

La gente ha mencionado ralentizar la frecuencia de actualización de jQuery. Puede anular la función de temporizador en jQuery 1.4 con este archivo (jquery.animación-fix.js):

function now() {
    return (new Date).getTime();
}
jQuery.fx.prototype.custom = function( from, to, unit ) {
    this.startTime = now();
    this.start = from;
    this.end = to;
    this.unit = unit || this.unit || "px";
    this.now = this.start;
    this.pos = this.state = 0;

    var self = this;
    function t( gotoEnd ) {
        return self.step(gotoEnd);
    }

    t.elem = this.elem;

    if ( t() && jQuery.timers.push(t) && !jQuery.fx.prototype.timerId ) {
        //timerId = setInterval(jQuery.fx.tick, 13);
        jQuery.fx.prototype.timerId = setInterval(jQuery.fx.tick, 2050);
    }
}

Así que modifica la línea con esto en ella

jQuery.fx.prototype.timerId = setInterval(jQuery.fx.tick, 50);

Cambie el 50 a cualquier intervalo que desee. Es decir, en milisegundos (ms)

Si guarda este código en un archivo diferente, puede adjuntarlo de la siguiente manera:

<script src="/js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="/js/jquery.animation-fix.js" type="text/javascript"></script>
 20
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-23 22:01:30

JQuery animate utiliza la función de javascript 'setInterval' para actualizar los obects cada pocos milisegundos. Desafortunadamente el intervalo en jQuery es por defecto '13ms'. Eso es 76 actualizaciones cada segundo. Camino a mucho para tales animaciones lentas y medianas.

Los 13ms están codificados en jQuery. Por lo que puede cambiar directamente este valor en el jQuery.sólo js. Si solo tiene los payasos lentos, puede ir hasta 100 ms. Si también tiene algunas animaciones más rápidas, debe configurarlo en 50.

Usted puede cambiar el parámetro para setInterval (); en la función custom. jQuery.fx.prototipo { ... custom: function () {... } ... }'

 3
Author: Alexander von Weiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-22 17:29:51

Las animaciones implican operaciones de bucle, y esas realmente crujirán la CPU sin importar qué.

No sé lo fácil que es hacer con jQuery, pero lo que tiene que suceder es que la animación necesita consumir menos ciclos. Ya sea que haga el ani un poco más irregular (la pantalla no es tan suave), el bucle debe optimizarse o reducir el trabajo del ani.

¿40 segundos? ¿no es un poco largo para una animación? Pensé que eran un poco más inmediatos que que.
 2
Author: StingyJack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-19 21:44:03

Acabo de ver el rendimiento de la animación bajo Scriptaculous, y encontró picos de CPU similares: aproximadamente 50% para IE, un poco mejor rendimiento (16-30%) para Firefox both tanto en un PC DuoCore. Dado que tanto jQuery como Scriptaculous funcionan cambiando el CSS subyacente, creo que es seguro decir que cualquier implementación de Javascript va a ser computacionalmente costosa.

Puede que estés atascado con Flash.

 2
Author: rtperson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-19 21:47:00

Me gusta mucho la respuesta publicada por Tim, aunque necesitaba que esta solución funcionara en un entorno de producción de Drupal 6.

Tengo jQuery 1.3.2 instalado, a través del uso del módulo de actualización de jQuery, por lo que hay algunas diferencias entre lo que estoy usando y jQuery 1.4 que la corrección de Tim está diseñada para.

Siguiendo las instrucciones de Tim me consiguió el 90% del camino, solo tuve que poner mi límite de pensamiento durante 10 minutos para llegar a este código en su lugar..

Valores de temporizador de 25 - 33 parecen funcionar mucho mejor que 13ms para animaciones de velocidad media, como el desvanecimiento de imágenes de fondo.

var timerId;

function now() {
    return (new Date).getTime();
}

jQuery.fx.prototype.custom = function( from, to, unit ) {
    this.startTime = now();
    this.start = from;
    this.end = to;
    this.unit = unit || this.unit || "px";
    this.now = this.start;
    this.pos = this.state = 0;

    var self = this;
    function t( gotoEnd ) {
        return self.step(gotoEnd);
    }

    t.elem = this.elem;

        if ( t() && jQuery.timers.push(t) && !timerId ) {
    timerId = setInterval(function(){
        var timers = jQuery.timers;

        for ( var i = 0; i < timers.length; i++ )
            if ( !timers[i]() )
                timers.splice(i--, 1);

        if ( !timers.length ) {
            clearInterval( timerId );
            timerId = undefined;
        }
    }, 25);
}
};
 0
Author: David Meister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-16 00:04:40