@pomeh Ja, das habe ich, aber ich kann nicht sehen, welche CSS-Animation viel CPU verbraucht
– Nick
16. Dezember 2014 um 9:52 Uhr
Ich habe das früher versucht, bin dann aber weitergegangen und habe die Website profiliert, indem ich zwei der drei Animationen dreimal deaktiviert habe.
– cnvzmxcvmcx
16. Dezember 2014 um 13:34 Uhr
CSS-Animationen verwenden GPU-Zyklen, keine CPU-Zyklen. Ein normaler JavaScript-Profiler sollte Ihnen Ausführungszeit und CPU-Auslastung liefern, aber da für CSS-Animationen ein völlig anderer Mechanismus am Werk ist, sind diese Profiler nicht das, was Sie brauchen. Der springende Punkt bei CSS-Animationen ist, dass sie es sind hardwarebeschleunigt was bedeutet, dass die CPU nicht der Haupttreiber dahinter ist.
– Josh Bürger
18. Dezember 2014 um 21:58 Uhr
Verwenden Sie den Task-Meter des Betriebssystems. es ist egal, was die Ursache ist oder wie die Arbeit ausgeführt wird, nur wie viel davon.
– dandavis
24. Dezember 2014 um 22:00 Uhr
Klicken Sie auf F12, Gehe zu Profilen, klicke auf Start. Seite neuladen.
Warten Sie, bis Ihre Seite neu geladen wurde, und klicken Sie auf Stopp.
Klicken Sie auf Ihr Profil und sehen Sie das Ergebnis (Y)
Ich habe Ihnen das Kopfgeld gegeben, weil Sie meiner Frage am nächsten gekommen sind.
– Nick
22. Februar 2016 um 10:22 Uhr
Vielen Dank. Ich kann einfach nicht finden, wie ich die CPU-Auslastung von CSS-Animationen überprüfen kann. Wenn ich es finde, werde ich es auch hier posten.
– Wouter den Ouden
22. Februar 2016 um 10:23 Uhr
Martin Tournij
Vorwort: Dies ist keine “vollständige” Antwort als solche, sondern die beste, die ich in angemessener Zeit finden konnte. Es schien eine Schande zu sein nicht Poste meine Ergebnisse, auch wenn sie keine perfekte Antwort sind …
Es deckt auch nur jQuery.animate; CSS-Animationen habe ich nicht untersucht.
Zumindest für jQuery ist das schwierig; Es ist nicht so, dass der Browser von einer jQuery-Animation “weiß”. Tatsächlich ist alles, was jQuery tut, die Ausführung einer Funktion zu planen n mal mit setTimeout()
oder setInterval()wobei jeder Funktionsaufruf das Element um ein paar Pixel verschiebt (oder etwas anderes ein wenig ändert), wodurch die Illusion von glatten Animationen entsteht.
Ihr Browser müsste irgendwie verfolgen, welcher Funktionsaufruf zu welcher Animation gehört. Da dies anonyme Funktionen sind, ist dies nicht wirklich einfach … Es könnte eine Art spezielle Debugging-Anweisung verwendet werden, aber AFAIK implementiert kein Browser eine solche Funktion.
Was wir kann Messen Sie die Anzahl der Updates jQuery.animate macht mit dem step zurückrufen:
Eine Funktion, die für jede animierte Eigenschaft jedes animierten Elements aufgerufen werden soll. Diese Funktion bietet die Möglichkeit, das Tween-Objekt zu ändern, um den Wert der Eigenschaft zu ändern, bevor sie festgelegt wird.
Dadurch erhalten Sie nur eine Annäherung, bestenfalls. Aber vielleicht ist es gut genug; Ich habe ein Beispiel erstellt (siehe unten), das mir diese Ergebnisse auf meinem System liefert:
Ihr System kann variieren, schlägt aber Folgendes vor:
a war das billigste;
b etwas teurer, aber auch recht günstig
c ist um ein Vielfaches teurer als a oder b.
Um zu überprüfen, ob dies der Fall ist grob genau, ich habe nur aktiviert eines Animation zu einem Zeitpunkt und überprüft, ob dies mit dem übereinstimmt, was die Chromium- und Firefox-Entwicklertools melden:
Chrom: a verbrachte 40 ms nicht im Leerlauf; Firefox: 2 Aufrufe an n.fx.tick
Chrom: b verbrachte 40 ms nicht im Leerlauf; Firefox: 4 Aufrufe an n.fx.tick
Chrom: c verbrachte 130 ms nicht im Leerlauf; Firefox: 36 Aufrufe an n.fx.tick
Was in der Tat ist grob genau, wenn auch nicht ganz.
Wird dies für Ihre Anwendung nützlich genug sein? Ich habe keine Ahnung. Vielleicht, vielleicht nicht…
Sie können versuchen, a auszuführen console.profile() -Instanz zu Beginn jeder jQuery-Animation und deaktivieren Sie dann die Animationen nacheinander, um sie zu debuggen.
Soweit ich weiß, können Sie CSS-Animationen nicht profilieren. Nur die Start- und Endwerte sind über JavaScript zugänglich.
function AnimateRotate(elem, angle, dur) {
var $elem = $(elem);
// we use a pseudo object for the animation
// (starts from `0` to `angle`), you can name it as you want
$({
deg: 0
}).animate({
deg: angle
}, {
duration: dur,
step: function(now) {
// in the step-callback (that is fired each step of the animation),
// you can use the `now` paramter which contains the current
// animation-position (`0` up to `angle`)
$elem.css({
transform: 'rotate(' + now + 'deg)'
});
}
});
}
$('#1').click(function() {
console.profile('Animation #1');
$(this).animate({
'height': '100px',
'width': '100px'
}, function() {
console.profileEnd('Animation #1');
});
});
$('#2').click(function() {
console.profile('Animation #2');
AnimateRotate(this, 3000, 400);
$(this).animate({
'height': '300px',
'width': '300px'
}, function() {
console.profileEnd('Animation #2');
});
});
Hast du dir Chrome DevTools angeschaut? Sehen developer.chrome.com/devtools/docs/timeline und stackoverflow.com/a/16752638/827168 für weitere Informationen
– pomeh
16. Dezember 2014 um 9:42 Uhr
@pomeh Ja, das habe ich, aber ich kann nicht sehen, welche CSS-Animation viel CPU verbraucht
– Nick
16. Dezember 2014 um 9:52 Uhr
Ich habe das früher versucht, bin dann aber weitergegangen und habe die Website profiliert, indem ich zwei der drei Animationen dreimal deaktiviert habe.
– cnvzmxcvmcx
16. Dezember 2014 um 13:34 Uhr
CSS-Animationen verwenden GPU-Zyklen, keine CPU-Zyklen. Ein normaler JavaScript-Profiler sollte Ihnen Ausführungszeit und CPU-Auslastung liefern, aber da für CSS-Animationen ein völlig anderer Mechanismus am Werk ist, sind diese Profiler nicht das, was Sie brauchen. Der springende Punkt bei CSS-Animationen ist, dass sie es sind hardwarebeschleunigt was bedeutet, dass die CPU nicht der Haupttreiber dahinter ist.
– Josh Bürger
18. Dezember 2014 um 21:58 Uhr
Verwenden Sie den Task-Meter des Betriebssystems. es ist egal, was die Ursache ist oder wie die Arbeit ausgeführt wird, nur wie viel davon.
– dandavis
24. Dezember 2014 um 22:00 Uhr