Rumah > Artikel > hujung hadapan web > Perbincangan ringkas tentang menggunakan cache untuk mengoptimumkan prestasi kemahiran tutorial HTML5 Canvas program_html5
Selepas anda terlalu banyak bermain dengan kanvas, anda secara automatik akan mula mempertimbangkan isu prestasi. Bagaimana untuk mengoptimumkan animasi kanvas?
【Gunakan cache】
Menggunakan cache bermakna menggunakan kanvas luar skrin untuk pra-perenderan Prinsipnya sangat mudah, iaitu, mula-mula lukis ke dalam kanvas luar skrin, dan kemudian lukiskan kanvas luar skrin ke dalam kanvas utama melalui drawImage. Ramai orang mungkin salah faham tentang ini. Bukankah ini mekanisme penimbal berganda yang banyak digunakan dalam permainan?
Sebenarnya, mekanisme penimbalan berganda digunakan dalam pengaturcaraan permainan untuk mengelakkan kelipan skrin Oleh itu, akan ada kanvas yang dipaparkan di hadapan pengguna dan kanvas latar belakang apabila melukis, kandungan skrin akan dilukis terlebih dahulu kanvas latar belakang, dan kemudian kanvas latar belakang akan dilukis Data dalam kanvas dilukis ke kanvas hadapan. Ini ialah penimbalan berganda, tetapi tiada penimbalan berganda dalam kanvas, kerana pelayar moden pada asasnya mempunyai mekanisme penimbalan berganda terbina dalam. Oleh itu, menggunakan kanvas luar skrin bukanlah penimbalan berganda, tetapi menganggap kanvas luar skrin sebagai kawasan cache. Data skrin cache yang perlu dilukis berulang kali untuk mengurangkan penggunaan memanggil API kanvas.
Seperti yang kita semua tahu, memanggil API kanvas menggunakan prestasi Oleh itu, apabila kami ingin melukis beberapa data skrin berulang, penggunaan kanvas luar skrin yang betul boleh meningkatkan prestasi anda dengan ketara
2. Cache digunakan tetapi lebar dan ketinggian kanvas luar skrin tidak ditetapkan
3. Cache digunakan tetapi lebar dan ketinggian kanvas luar skrin tidak ditetapkan
4. Gunakan caching dan tetapkan lebar dan tinggi kanvas luar skrin
Anda dapat melihat bahawa prestasi DEMO di atas adalah berbeza Mari kita analisa sebab di bawah: Untuk mencapai gaya setiap bulatan, saya menggunakan lukisan gelung semasa melukis bulatan Jika caching tidak didayakan, apabila bilangan bulatan pada halaman Apabila ia mencapai titik tertentu, sebilangan besar panggilan API kanvas diperlukan untuk setiap bingkai animasi, dan sejumlah besar pengiraan diperlukan, supaya tidak kira betapa baiknya penyemak imbas, ia akan dibawa turun.
Kod XML/HTMLSalin kandungan ke papan keratan
除了创建离屏kanvas作为缓存之外,下面的代码中有一点很关键,就是福箺高度,kanvas生成后的默认大小是300X150;对于我的代码中每个缓存起来圈圈对象半径最大也就不超过80,所以300X150的大小明显会造成很多琺定白,所以300X150。费,所以就要设置一下离屏canvas的宽度和高度,让它跟缓存起来的元素大小一致,这样也有利于提高动画性能。上面的四个demo很明显的显示出了性能差距,如月家家面超过400个圈圈对象时就会卡的不行了,而设置了宽高1000个圈圈对象也不觉得卡。
Apabila saya membuat instantiat objek bulatan, saya terus memanggil kaedah cache dan melukis bulatan kompleks terus ke dalam kanvas luar skrin objek bulatan dan menyimpannya.
Terdapat satu lagi nota tentang kanvas luar skrin Jika kesan yang anda lakukan ialah membuat dan memusnahkan objek secara berterusan, sila gunakan kanvas luar skrin dengan berhati-hati Sekurang-kurangnya jangan mengikat atribut setiap objek seperti yang saya tulis di atas. Tetapkan kanvas luar skrin.
Kerana jika diikat seperti ini, apabila objek dimusnahkan, kanvas luar skrin juga akan dimusnahkan, dan sejumlah besar kanvas luar skrin sentiasa dicipta dan dimusnahkan, yang akan menyebabkan penimbal kanvas menggunakan banyak sumber GPU dan mudah menyebabkan penyemak imbas Ranap atau membekukan bingkai yang serius. Penyelesaiannya adalah untuk mencipta tatasusunan kanvas luar skrin, pramuat bilangan kanvas luar skrin yang mencukupi, cache hanya objek yang masih hidup dan nyahcachenya apabila objek dimusnahkan. Ini tidak akan menyebabkan kanvas luar skrin dimusnahkan.
【Gunakan requestAnimationFrame】
Saya tidak akan menerangkan perkara ini secara terperinci, saya rasa ramai orang tahu bahawa ini adalah gelung terbaik untuk animasi, bukan setTimeout atau setInterval. Siarkan secara langsung kaedah penulisan keserasian:
【Elakkan operasi titik terapung】
Walaupun JavaScript menyediakan beberapa kaedah pembundaran yang sangat mudah, seperti Math.floor, Math.ceil dan parseInt, rakan asing telah melakukan ujian dan kaedah parseInt melakukan beberapa kerja tambahan (seperti mengesan sama ada data adalah nilai yang sah, parseInt malah menukar parameter kepada rentetan terlebih dahulu!), jadi menggunakan parseInt secara langsung adalah lebih intensif prestasi Jadi bagaimana untuk membulatkan, anda boleh terus menggunakan kaedah yang sangat bijak yang ditulis oleh orang asing:
Terdapat beberapa perkara lain yang perlu diberi perhatian, saya tidak akan menyenaraikan semuanya kerana terdapat beberapa perkara di Google. Ini boleh dianggap sebagai rekod untuk diri saya sendiri, terutamanya untuk merekodkan penggunaan cache. Jika anda ingin meningkatkan prestasi kanvas, perkara yang paling penting ialah memberi perhatian kepada struktur kod, mengurangkan panggilan API yang tidak perlu, mengurangkan operasi kompleks dalam setiap bingkai, atau menukar operasi kompleks daripada sekali untuk setiap bingkai kepada sekali untuk beberapa bingkai. Pada masa yang sama, untuk penggunaan cache yang disebutkan di atas, untuk kemudahan, saya menggunakan kanvas luar skrin untuk setiap objek Malah, kanvas luar skrin tidak boleh digunakan terlalu banyak Jika anda menggunakan terlalu banyak kanvas luar skrin akan menjadi masalah prestasi. Sila cuba yang terbaik menggunakan kanvas luar skrin.
Alamat kod sumber:
https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Other-demo/cache