Heim > Artikel > Web-Frontend > Eine kurze Diskussion über die Verwendung des Caches zur Optimierung der Leistung von HTML5 Canvas. Programm_HTML5-Tutorial-Fähigkeiten
Wenn Sie zu viel mit der Leinwand herumspielen, werden Sie automatisch über Leistungsprobleme nachdenken. Wie optimiert man die Leinwandanimation?
【Cache verwenden】
Cache verwenden bedeutet, für das Vorrendern eine Off-Screen-Leinwand zu verwenden. Das Prinzip ist sehr einfach: Zeichnen Sie zuerst in eine Off-Screen-Leinwand und zeichnen Sie dann die Off-Screen-Leinwand über drawImage in die Haupt-Leinwand. Viele Leute verstehen das vielleicht falsch. Ist das nicht ein doppelter Puffermechanismus, der in Spielen häufig verwendet wird?
Tatsächlich wird der doppelte Puffermechanismus in der Spielprogrammierung verwendet, um ein Flackern des Bildschirms zu verhindern. Daher wird vor dem Benutzer eine Leinwand angezeigt und beim Zeichnen wird der Bildschirminhalt zuerst angezeigt Hintergrund-Leinwand, und dann wird die Hintergrund-Leinwand gezeichnet. Die Daten in der Leinwand werden auf die vordere Leinwand gezeichnet. Dies ist eine doppelte Pufferung, aber in Canvas gibt es keine doppelte Pufferung, da moderne Browser grundsätzlich über einen integrierten Doppelpufferungsmechanismus verfügen. Daher stellt die Verwendung von Off-Screen-Canvas keine doppelte Pufferung dar, sondern behandelt Off-Screen-Canvas als Cache-Bereich. Zwischenspeichern Sie Bildschirmdaten, die wiederholt gezeichnet werden müssen, um den Verbrauch beim Aufrufen der Canvas-API zu reduzieren.
Wie wir alle wissen, verbraucht der Aufruf der Canvas-API die Leistung, wenn wir einige wiederholte Bildschirmdaten zeichnen möchten. Sie können sich die folgende DEMO ansehen
1. Es wird kein Cache verwendet
2. Cache wird verwendet, aber die Breite und Höhe der Off-Screen-Leinwand sind nicht festgelegt
3. Cache wird verwendet, aber die Breite und Höhe der Off-Screen-Leinwand sind nicht festgelegt
4. Verwenden Sie Caching und legen Sie die Breite und Höhe der Off-Screen-Leinwand fest
Sie können sehen, dass die Leistung der obigen DEMO unterschiedlich ist. Lassen Sie uns die folgenden Gründe analysieren: Um den Stil jedes Kreises zu erreichen, habe ich beim Zeichnen von Kreisen das Schleifenzeichnen verwendet Kreise auf der Seite Wenn ein bestimmter Punkt erreicht ist, ist für jeden Frame der Animation eine große Anzahl von Canvas-API-Aufrufen und eine große Menge an Berechnungen erforderlich, sodass er unabhängig von der Qualität des Browsers angezeigt wird runter.
XML/HTML-CodeInhalt in die Zwischenablage kopieren
Wenn ich das Kreisobjekt instanziiere, rufe ich direkt die Cache-Methode auf, zeichne den komplexen Kreis direkt in die Off-Screen-Leinwand des Kreisobjekts und speichere ihn.
Es gibt noch einen weiteren Hinweis zur Off-Screen-Leinwand: Wenn der Effekt, den Sie erzielen, darin besteht, kontinuierlich Objekte zu erstellen und zu zerstören, verwenden Sie die Off-Screen-Leinwand bitte mit Vorsicht. Binden Sie zumindest nicht die Attribute jedes Objekts, wie ich oben geschrieben habe. Stellen Sie eine Leinwand außerhalb des Bildschirms ein.
Denn wenn das Objekt auf diese Weise gebunden wird, wird auch die Leinwand außerhalb des Bildschirms zerstört, und es wird ständig eine große Anzahl von Leinwänden außerhalb des Bildschirms erstellt und zerstört, was dazu führt, dass der Leinwandpuffer a verbraucht Sie beanspruchen viele GPU-Ressourcen und führen leicht zum Absturz des Browsers oder zu ernsthaften Frame-Einfrierungen. Die Lösung besteht darin, ein Off-Screen-Canvas-Array zu erstellen, eine ausreichende Anzahl von Off-Screen-Canvas vorab zu laden, nur die noch lebenden Objekte zwischenzuspeichern und sie aus dem Cache zu entfernen, wenn die Objekte zerstört werden. Dadurch wird die Leinwand außerhalb des Bildschirms nicht zerstört.
【RequestAnimationFrame verwenden】
Ich werde das nicht im Detail erklären. Ich denke, viele Leute wissen, dass dies die beste Schleife für Animationen ist, nicht setTimeout oder setInterval. Veröffentlichen Sie direkt die Schreibmethode für die Kompatibilität:
【Gleitkommaoperationen vermeiden】
Obwohl JavaScript einige sehr praktische Rundungsmethoden bereitstellt, wie z. B. Math.floor, Math.ceil und parseInt, haben ausländische Freunde Tests durchgeführt und die parseInt-Methode erledigt einige zusätzliche Arbeiten (z. B. das Erkennen, ob die Daten ein gültiger Wert sind, parseInt). konvertiert den Parameter sogar zuerst in einen String!), daher ist die direkte Verwendung von parseInt relativ leistungsintensiver. Um es zusammenzufassen: Sie können direkt eine sehr clevere Methode verwenden, die von Ausländern geschrieben wurde:
1.gerundet = (0,5 Somenum) | 2.gerundet = ~~ (0,5 Somenum); 3.gerundet = (0,5 Somenum)
Wenn Sie die Operatoren nicht verstehen, können Sie einfach hier klicken: http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp
Darin finden Sie detaillierte ErklärungenVersuchen Sie beim Erstellen von Partikeleffekten, so wenig Kreise wie möglich zu verwenden und verwenden Sie vorzugsweise Quadrate. Da die Partikel zu klein sind, ähneln Quadrate Kreisen. Der Grund dafür ist leicht zu verstehen: Wir benötigen drei Schritte, um einen Kreis zu zeichnen: Zuerst beginPath, dann verwenden Sie arc, um einen Bogen zu zeichnen, und verwenden Sie dann fill, um ihn zu füllen, um einen Kreis zu erstellen. Aber um ein Quadrat zu zeichnen, brauchen Sie nur ein fillRect. Obwohl es nur einen Unterschied zwischen zwei Aufrufen gibt, wird die Leistungslücke sichtbar, wenn die Anzahl der Partikelobjekte ein bestimmtes Niveau erreicht.
Es gibt noch einige andere Dinge zu beachten, ich werde sie nicht alle auflisten, da es bei Google einige davon gibt. Dies kann als Aufzeichnung für mich selbst betrachtet werden, hauptsächlich um die Cache-Nutzung aufzuzeichnen. Wenn Sie die Leistung von Canvas verbessern möchten, ist es am wichtigsten, auf die Struktur des Codes zu achten, unnötige API-Aufrufe zu reduzieren, komplexe Vorgänge in jedem Frame zu reduzieren oder komplexe Vorgänge von einmal für jeden Frame auf einmal für mehrere zu ändern Rahmen. Gleichzeitig habe ich für die oben erwähnte Cache-Nutzung der Einfachheit halber für jedes Objekt eine Off-Screen-Leinwand verwendet. Wenn Sie dort zu viele Off-Screen-Leinwände verwenden Es wird zu Leistungsproblemen kommen. Versuchen Sie Ihr Bestes, die Leinwand außerhalb des Bildschirms zu nutzen.
Quellcode-Adresse:
https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Other-demo/cache