Rumah >hujung hadapan web >tutorial css >Pengenalan Percepatan Perkakasan dengan Animasi CSS
istilah itu sendiri terdengar seperti sesuatu yang terlalu rumit, dekat dengan matematik yang lebih tinggi. Dalam artikel ini, saya akan memberi sedikit gambaran mengenai subjek ini dan menunjukkan cara menggunakan teknik ini dalam projek front-end anda.
Takeaways Key
<span><span>.ball-running</span> { </span> <span>animation: run-around 4s infinite; </span><span>} </span> <span><span>@keyframes run-around</span> { </span> <span>0%: { </span> <span>top: 0; </span> <span>left: 0; </span> <span>} </span> <span>25% { </span> <span>top: 0; </span> <span>left: 200px; </span> <span>} </span> <span>50% { </span> <span>top: 200px; </span> <span>left: 200px; </span> <span>} </span> <span>75% { </span> <span>top: 200px; </span> <span>left: 0; </span> <span>} </span><span>}</span>Berikut adalah demo langsung yang menggunakan butang untuk memulakan animasi dengan JavaScript:
Lihat pena menindih bola yang bertindih dengan sifat atas/kiri oleh SitePoint (@SitePoint) pada codepen.
Selepas mengklik butang "Mula Animasi", anda akan melihat bahawa animasi tidak kelihatan sangat lancar, walaupun pada penyemak imbas desktop. Jika anda menguji animasi pada peranti mudah alih anda, anda akan melihat bahawa ia jauh dari 60fps. Untuk membetulkannya, kita boleh menggunakan transformasi CSS menggunakan fungsi Terjemahan (), bukannya menghidupkan nilai atas dan kiri.
<span><span>.ball-running</span> { </span> <span>animation: run-around 4s infinite; </span><span>} </span> <span><span>@keyframes run-around</span> { </span> <span>0%: { </span> <span>transform: translate(0, 0); </span> <span>} </span> <span>25% { </span> <span>transform: translate(200px, 0); </span> <span>} </span> <span>50% { </span> <span>transform: translate(200px, 200px); </span> <span>} </span> <span>75% { </span> <span>transform: translate(0, 200px); </span> <span>} </span><span>}</span>Cuba kod di atas dalam demo di bawah:
Lihat pena menindih bola bertindih dengan CSS Transforms oleh SitePoint (@SitePoint) pada Codepen.
sekarang animasi bagus dan lancar. Hebat! Jadi mengapa ini membantu? Nah, transformasi CSS tidak menyebabkan pengecualian, tidak seperti animasi dengan sifat kiri dan atas. Mari kita lihat panel garis masa di Devtools Chrome semasa pelaksanaan animasi:
Sekarang lihat garis masa dalam kes CSS berubah:
seperti yang anda lihat, tidak ada bar hijau semasa animasi.
Satu lagi ciri yang terdapat di DevTools Chrome untuk mengesan proses mengecat adalah "membolehkan cat berkelip". Anda boleh mencari pilihan ini dengan membuka DevTools, memukul kunci ESC, kemudian memilih tab "Rendering". Apabila ciri ini dihidupkan, kotak hijau (iaitu segi empat tepat cat) akan muncul di sekitar kawasan yang dicat semula. Di sebelah kiri dan atas, bola mempunyai kotak hijau untuk keseluruhan proses animasi, yang menunjukkan pengecatan semula.
Sebaliknya, dalam CSS mengubah contoh, segi empat tepat cat hanya dipaparkan pada bingkai animasi pertama dan terakhir.
yang menggunakan pecutan perkakasan, yang menghindari rendering perisian. Mari kita lihat ini dengan lebih terperinci.
bagaimana pecutan perkakasan berfungsi
Apabila penyemak imbas menerima markup halaman, ia mengasingkannya untuk membina pokok Dom. Pokok Dom dan CSS membolehkan penyemak imbas membina pokok render. Pokoknya terdiri daripada objek render - unsur -unsur yang akan diberikan pada halaman. Setiap objek render diberikan kepada lapisan grafik. Setiap lapisan dimuat naik ke GPU sebagai tekstur. Caranya di sini adalah bahawa lapisan boleh diubah dalam GPU tanpa mengecat semula, seperti dalam kes grafik 3D. Transformasi ini dibuat oleh proses kompositor yang berasingan. Anda boleh mendapatkan lebih banyak maklumat mengenai komposisi di Chrome di sini.Bola kami dengan transformasi CSS mempunyai sempadan oren dan dipindahkan ke lapisan komposit yang berasingan:
Ia berbuat demikian dalam kes -kes berikut:
Perbezaan antara transformasi 3D dan 2D ialah transformasi 3D menjadikan penyemak imbas membuat lapisan komposit yang berasingan terlebih dahulu, manakala 2D transformasi melakukannya dengan cepat. Pada permulaan animasi, lapisan komposit baru dicipta dan tekstur dimuatkan ke GPU, yang memulakan semula. Kemudian animasi dilakukan oleh kompositor dalam GPU. Apabila animasi selesai, lapisan komposit tambahan dikeluarkan, yang mengakibatkan operasi mengecat semula.
Rendering elements dalam GPU
Transform
memaksa elemen yang akan diberikan dalam gpu
Apa ini adalah membiarkan penyemak imbas tahu bahawa kita mahu melakukan transformasi 3D. Ini menjadikan penyemak imbas membuat lapisan yang berasingan dan gerakkan elemen ke GPU terlebih dahulu, dengan itu mencetuskan percepatan perkakasan.
<span><span>.ball-running</span> { </span> <span>animation: run-around 4s infinite; </span><span>} </span> <span><span>@keyframes run-around</span> { </span> <span>0%: { </span> <span>top: 0; </span> <span>left: 0; </span> <span>} </span> <span>25% { </span> <span>top: 0; </span> <span>left: 200px; </span> <span>} </span> <span>50% { </span> <span>top: 200px; </span> <span>left: 200px; </span> <span>} </span> <span>75% { </span> <span>top: 200px; </span> <span>left: 0; </span> <span>} </span><span>}</span>
Teknik ini juga boleh berguna apabila mengecat satu elemen terlalu mahal kerana elemen lain di belakangnya. Mari kita kembali ke contoh pertama, dan sedikit mengubahnya supaya ia mengandungi bola tunggal dan bekas dengan imej latar belakang kabur menggunakan penapis CSS. Bola animasi dengan sifat kiri dan atas.
Lihat pena menghidupkan bola dengan sifat atas/kiri oleh SitePoint (@SitePoint) pada Codepen.
Sekali lagi, pergerakan bola adalah jerky. Ini berlaku kerana setiap kos operasi mengecilkan terlalu banyak kerana latar belakang kabur.
Sekarang mari kita tambahkan hack transform ke bekas.
Lihat pena animasi kiri/sifat atas dengan pecutan perkakasan oleh SitePoint (@SitePoint) pada Codepen.
Hasilnya tidak terlalu buruk dan animasi berfungsi dengan baik. Kenapa? Kerana sekarang latar belakang yang mahal cat kabur dipindahkan ke lapisan komposit lain, dan mengecat bola pada setiap langkah animasi adalah murah.
Tidak ada yang datang secara percuma. Terdapat beberapa isu yang berkaitan dengan pecutan perkakasan.
memori
Isu yang paling penting adalah berkaitan dengan ingatan. Memuatkan terlalu banyak tekstur ke GPU boleh menyebabkan masalah ingatan. Ini benar -benar kritikal pada peranti mudah alih dan bahkan boleh merosakkan pelayar mudah alih. Fikiran akibatnya dan jangan gunakan pecutan perkakasan untuk setiap elemen pada halaman.
font rendering
Rendering dalam GPU mempengaruhi font anti-aliasing. Ini berlaku kerana GPU dan CPU mempunyai mekanisme rendering yang berbeza. Oleh itu, walaupun anda mematikan percepatan perkakasan pada akhir animasi, teks akan dipaparkan kabur semasa animasi. Anda boleh membaca lebih lanjut mengenai isu -isu rendering fon dalam jawatan ini oleh Keith Clark.
Keperluan untuk menggunakan "Transform Hack" untuk membuat lapisan komposit berasingan adalah rumit. Penyemak imbas pastinya menyediakan cara yang mudah untuk melakukan ini. Itulah sebabnya harta pusaka akan diperkenalkan. Ciri ini membolehkan anda memaklumkan penyemak imbas yang akan berubah, jadi penyemak imbas boleh membuat pengoptimuman yang sama terlebih dahulu. Berikut adalah contoh yang memberitahu penyemak imbas bahawa harta transformasi akan diubah:
<span><span>.ball-running</span> { </span> <span>animation: run-around 4s infinite; </span><span>} </span> <span><span>@keyframes run-around</span> { </span> <span>0%: { </span> <span>top: 0; </span> <span>left: 0; </span> <span>} </span> <span>25% { </span> <span>top: 0; </span> <span>left: 200px; </span> <span>} </span> <span>50% { </span> <span>top: 200px; </span> <span>left: 200px; </span> <span>} </span> <span>75% { </span> <span>top: 200px; </span> <span>left: 0; </span> <span>} </span><span>}</span>
Malangnya, tidak semua penyemak imbas menyokong perubahan. Anda boleh mengetahui lebih lanjut mengenai Will-change dalam sumber-sumber berikut:
untuk meringkaskan apa yang kita dilindungi:
Jika anda telah menggunakan teknik ini, atau mempunyai maklum balas, sila bebas untuk menawarkan komen anda.
Ya, percepatan perkakasan boleh digunakan dengan peralihan CSS. Dengan menggunakan harta 'Transform', anda boleh mencetuskan GPU untuk menjadikan peralihan, menghasilkan animasi yang lebih lancar dan lebih cekap. Walaupun pecutan perkakasan dapat meningkatkan prestasi animasi CSS, ia juga dapat meningkatkan penggunaan kuasa, yang berpotensi mempengaruhi hayat bateri pada peranti mudah alih. Adalah penting untuk menyeimbangkan antara prestasi dan penggunaan kuasa apabila menggunakan pecutan perkakasan.
Atas ialah kandungan terperinci Pengenalan Percepatan Perkakasan dengan Animasi CSS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!