jQuery animate() und browser-performance
Ich habe einige Elemente, die ich bin bewegt über die Seite sehr langsam. Im Grunde genommen bin ich eine Verringerung der linke Rand von zwei Bildern über eine Zeitspanne von 40 Sekunden oder so.
Visuell, es funktioniert wunderbar. Aber mein Prozessor springt auf über 50% Nutzung während der Animationen. Dies ist nicht spezifisch für jede einzelne browser - es ist die gleiche Art und Weise auf Safari3 und Firefox3. Wenn ich beide Browser läuft die Seite, meine CPU ist ein Schreien bei über 95% Auslastung.
Ich bin mit jQuery 1.3. Beide Animationen geschehen gleichzeitig. Es gibt kein Flash auf der Seite. Wenn ich kommentieren Sie den code aus (entfernen der animation) und aktualisieren Sie die Seite, mein Prozessor ist sofort wieder auf den normalen Verwendung.
Ich hoffe ich habe nicht zu greifen, um Flash, sondern auch das ansehen von Sendungen auf Hulu.com nicht spike meine CPU wie diese.
Gedanken?
InformationsquelleAutor der Frage Jeremy Ricketts | 2009-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Art und Weise jQuery animate() funktioniert, ist, dass es verwendet einen timer, der in regelmäßigen Abständen Feuer und ruft eine Funktion, die updates der DOM zu reflektieren, den Zustand der animation. In der Regel Animationen sind relativ kurz, und Sie decken eine Menge Platz auf dem Bildschirm, so vermute ich (ohne Bestätigung), dass der Zeitgeber abläuft, und zurückgesetzt wird, auf einem relativ hohen rate zu erzeugen, eine glatte animation. Da deine animation dauert eine lange Zeit, könnten Sie in der Lage sein zu ändern die animate-Funktion, so dass die rate, mit der die animation Erlöse können Sie über eine option. In Ihrem Fall würden Sie müssen nur ein update alle 250ms oder so, da bist du in etwa 3-4 Pixel pro Sekunde, rund.
InformationsquelleAutor der Antwort tvanfosson
Ich weiß, das ist ein ältlich Frage und Tim lieferte eine tolle Antwortaber ich dachte nur, ich sollte nach einem update für alle, die sich für eine Lösung für dieses problem, denn es gibt jetzt eine einfachere Möglichkeit...
Als der jQuery 1.4.3 legen Sie das Intervall jQuery animate verwendet, die direkt über die jQuery.fx.Intervall Eigenschaft. So können Sie einfach etwas wie:
InformationsquelleAutor der Antwort Alconja
Leute haben erwähnt, verlangsamt jQuery refresh-rate. Sie können das überschreiben der timer-Funktion in jQuery 1.4 mit dieser Datei (jquery.animation-fix.js):
So ändern Sie die Zeile mit diesem an
Ändern Sie die 50 zu, was Intervall, das Sie möchten. Das ist in Millisekunden (ms)
Wenn Sie speichern Sie diesen code in einer anderen Datei, können Sie es wie folgt:
InformationsquelleAutor der Antwort Tim
jQuery animate verwendet die javascript-Funktion "setInterval" zu aktualisieren, zum Beispiel die Dinge, die alle paar Millisekunden. Leider ist das Intervall in jQuery per default '13ms'. Das 76-updates pro Sekunde. Weg zu viel für solch langsamen und mittleren Animationen.
Den 13ms sind hardcoded in jQuery. So können Sie direkt ändern Sie diesen Wert in die jQuery.js nur. Wenn Sie nur langsam Wolken können Sie gehen bis zu 100ms. Wenn Sie etwas schnellere Animationen, zu, Sie sollten es auf 50.
Ändern Sie können die parameter für setInterval(); in die Funktion custom. 'jQuery.fx.Prototyp { ... Brauch: function() { ... } ... }'
InformationsquelleAutor der Antwort Alexander von Weiss
Animationen beinhalten looping-Operationen, und die wird wirklich die crunch-CPU, egal was.
Ich weiß nicht, wie einfach es ist zu tun mit der jQuery, aber was geschehen muss, ist die animation benötigt, verbrauchen weniger Zyklen. Entweder machst du die ani ein wenig mehr gezackt (das display ist nicht so glatt ist), wird die Schleife muss optimiert werden, oder reduzieren Sie die Arbeit der ani.
40 Sekunden? ist das nicht ein bisschen lang für eine animation? Ich dachte, Sie sind sposed ein wenig mehr sofort als das.
InformationsquelleAutor der Antwort StingyJack
Ich habe mir gerade die performance von Animationen unter Scriptaculous, und fand ähnliche CPU spikes: etwa 50% für IE, etwas bessere Leistung (16-30%) für den Firefox-beide auf einem DuoCore-PC. Da beide JQuery und Scriptaculous Arbeit durch eine änderung der zugrunde liegenden CSS, ich denke, es ist sicher zu sagen, dass jeder Javascript-Implementierung wird rechnerisch teuer.
Können Sie auch geklebt werden, gehen mit Flash.
InformationsquelleAutor der Antwort rtperson
Ich wirklich gerne die Antwort gepostet von Tim, obwohl ich brauchte, um diese zu beheben, arbeitet in einer Drupal 6 Produktionsumgebung.
Habe ich jQuery 1.3.2 installiert, durch den Einsatz von jQuery-update-Modul, so gibt es einige Unterschiede zwischen dem, was ich verwende und jQuery 1.4, Tim fix ausgelegt ist.
Folgenden Tims Anleitung, hab mir 90% der Weg dorthin, hatte ich nur mein denken Mütze auf, für 10 Minuten zu kommen mit diesem code statt..
timer-Werte von 25 - 33 zu funktionieren scheinen, viel besser als 13ms für mittlere Geschwindigkeit Animationen wie fading hintergrund-Bilder.
InformationsquelleAutor der Antwort David Meister