Dalam upaya untuk mengoptimalkan animasi 2D yang dibuat dalam kanvas, satu opsi menarik ditemukan.

Visualisasi awal - prerender.
"Dan bagaimana jika kamu merekam semua frame terlebih dahulu dan menunjukkannya setelah animasi berakhir?" - Kami berpikir dengan seorang teman dan itulah yang terjadi pada hari berikutnya.
Demo langsung
amedomary.ru/prerender-canvas
Kode v1.0
Halaman itu sendiri ada di Github .
Logikanya sangat sederhana dan diimplementasikan dalam 2 langkah:
Langkah 1 - Simpan setiap bingkai animasi kami ke berbagai gambar
Langkah 1 - kode javascript function renderLoop() {
draw();
canvasPrerender.toBlob(blob => {
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function() {
const image = document.createElement("img");
image.src = reader.result;
prerenderArr.push(image);
};
});
if (prerenderIsCompleted) {
requestAnimationFrame(renderLoop);
} else {
requestAnimationFrame(drawPreImg);
}
}
2 โ โ
2 - javascript function drawPreImg() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(prerenderArr[i], 0, 0);
requestAnimationFrame(drawPreImg);
}
Analytic
. macbook 13 2019 .
.
FPS
Fps "" .
Fps "" (prerender): 14-22
Fps "" ( ): 58-60

, live demo.
Prerender โ 9
โ 3
โ 12 ( live demo)
CPU / Performance
Seperti yang dapat dilihat dari tangkapan layar di bawah ini - prosesor kami hanya mengalami tahap prerender. Menggambar gambar yang sudah jadi tidak sulit.
Penyimpanan
Untuk animasi kecil seperti milik kami, semua ini membutuhkan:
~ 432/2 = 200 frame
~ 25 mb

Kesimpulan
Jika Anda memiliki kesempatan untuk menunggu sebelum menampilkan animasi kepada pengguna dan itu tidak akan memakan memori hingga Gigabytes - coba lakukan sesuatu seperti itu.
PS
Jika Anda memiliki ide untuk meningkatkan kinerja pendekatan ini - tulis :)