RenderingNG

Siap untuk konten web generasi berikutnya

Chris Harrelson
Chris Harrelson

RenderingNG adalah arsitektur rendering generasi berikutnya, yang jauh lebih baik daripada yang sebelumnya. RenderingNG dibuat selama lebih dari delapan tahun dan mewakili pekerjaan kolektif dari banyak developer Chromium yang berdedikasi. Hal ini membuka potensi yang sangat besar untuk konten web yang cepat, lancar, andal, responsif, dan interaktif.

Sketsa berbagai elemen RenderingNG
RenderingNG

Di sini, Anda akan mempelajari apa yang kami buat, alasan kami membuatnya, dan cara kerjanya.

Sasaran bintang utara

Sasaran utama yang memotivasi RenderingNG adalah implementasi mesin browser, dan kekayaan API renderingnya, tidak boleh menjadi faktor pembatas UX di web.

Anda tidak perlu khawatir dengan bug browser yang membuat fitur tidak dapat diandalkan, atau merusak rendering situs Anda.

Seharusnya tidak ada penurunan performa yang misterius. Selain itu, Anda tidak perlu mengatasi fitur bawaan yang tidak ada.

Perintah ini seharusnya berfungsi.

RenderingNG adalah langkah besar menuju sasaran bintang utara ini. Sebelum RenderingNG, kami dapat (dan telah) menambahkan fitur rendering dan meningkatkan performa, tetapi kesulitan untuk membuat fitur tersebut andal bagi developer, dan ada banyak penurunan performa. Sekarang kita memiliki arsitektur yang secara sistematis mengatasi banyak masalah tersebut, dan juga membuka blokir fitur lanjutan yang sebelumnya tidak dianggap memungkinkan. Persyaratan ini:

  • Memiliki fitur inti yang sangat andal di berbagai kombinasi platform, perangkat, dan sistem operasi.
  • Memiliki performa yang dapat diprediksi dan andal.
  • Memaksimalkan penggunaan kemampuan hardware (inti, GPU, resolusi layar, kecepatan refresh, API raster tingkat rendah).
  • Hanya melakukan pekerjaan yang diperlukan untuk menampilkan konten yang terlihat.
  • Memiliki dukungan bawaan untuk pola desain visual, animasi, dan interaksi umum.
  • Menyediakan API developer untuk mengelola biaya rendering dengan mudah.
  • Memberikan titik ekstensi pipeline rendering untuk add-in developer.
  • Mengoptimalkan semua konten—HTML, CSS, Kanvas 2D, kanvas 3D, gambar, video, dan font.

Perbandingan dengan mesin rendering browser lainnya

Gecko dan Webkit juga telah menerapkan sebagian besar fitur arsitektur yang sama yang dijelaskan dalam postingan blog ini, dan dalam beberapa kasus bahkan menambahkannya sebelum Chromium.

Browser yang menjadi lebih cepat dan andal adalah hal yang patut dirayakan dan memiliki dampak nyata. Tujuan utamanya adalah meningkatkan dasar pengukuran untuk semua browser, sehingga developer dapat mengandalkannya.

Piramida kesuksesan

Filosofi saya adalah bahwa kesuksesan adalah hasil dari pencapaian keandalan terlebih dahulu, lalu performa yang skalabel, dan terakhir ekstensi.

Piramida dengan label Keandalan di bagian bawah,
Performa di bagian tengah, ekstensi di bagian atas

Seperti piramida di dunia nyata, setiap tingkat memberikan fondasi yang kuat untuk tingkat di atasnya.

Keandalan

Sketsa yang menunjukkan cara menambahkan fitur RenderingNG tanpa peningkatan frustrasi yang besar

Agar pengalaman pengguna yang kaya dan kompleks dapat terwujud, hal pertama yang kita perlukan adalah platform yang andal. Fitur inti dan dasar harus berfungsi dengan benar, dan terus berfungsi dari waktu ke waktu. Selain itu, penting juga untuk memastikan bahwa fitur tersebut disusun dengan baik dan tidak memiliki bug atau perilaku kasus ekstrem yang aneh.

Sketsa menunjukkan sifat melingkar dari menambahkan fitur, mendapatkan masukan, meningkatkan keandalan

Karena alasan ini, keandalan adalah satu-satunya bagian terpenting dari RenderingNG. Keandalan adalah hasil dari pengujian yang baik, loop masukan berkualitas, metrik, dan pola desain software.

Untuk memberikan gambaran betapa pentingnya keandalan, kami menghabiskan sebagian besar delapan tahun terakhir untuk menyelesaikan bagian ini. Pertama, kami membangun pengetahuan mendalam tentang sistem—mempelajari dari laporan bug tempat titik lemahnya dan memperbaikinya, mem-bootstrap pengujian komprehensif, dan memahami kebutuhan performa situs serta batasan performa Chromium. Kemudian, kami dengan cermat dan bertahap mendesain serta meluncurkan pola desain dan struktur data utama. Setelah itu, kita siap untuk menambahkan primitif generasi berikutnya yang benar-benar baru untuk desain responsif, skalabilitas, dan penyesuaian rendering.

Grafik sketsa menunjukkan peningkatan keandalan, performa, dan ekstensi dari waktu ke waktu

Hal ini bukan berarti tidak ada yang ditingkatkan selama waktu tersebut di Chromium. Justru sebaliknya. Selama tahun-tahun tersebut, keandalan dan performa mengalami peningkatan yang stabil dan berkelanjutan saat kami memfaktorkan ulang dan meluncurkan setiap peningkatan secara bertahap.

Pengujian dan metrik

Selama 8 tahun terakhir, kami telah menambahkan puluhan ribu pengujian unit, performa, dan integrasi. Selain itu, kami telah mengembangkan metrik komprehensif yang mengukur banyak aspek tentang perilaku rendering Chromium dalam pengujian lokal, dalam benchmark performa, dan di situs sungguhan, dengan pengguna dan perangkat sungguhan.

Namun, sekeren apa pun RenderingNG (atau mesin rendering browser lain), masih tidak akan mudah untuk dikembangkan di web jika ada banyak bug atau perbedaan perilaku antar-browser. Untuk mengatasi hal ini, kami juga memaksimalkan penggunaan Pengujian Platform Web. Setiap pengujian ini memverifikasi pola penggunaan platform web yang harus dilalui semua browser. Kami juga memantau metrik dengan cermat untuk lulus lebih banyak pengujian dari waktu ke waktu dan meningkatkan kompatibilitas inti.

Pengujian Platform Web adalah upaya kolaboratif. Misalnya, engineer Chromium hanya telah menambahkan sekitar 10% dari total pengujian WPT untuk fitur CSS; vendor browser lain, kontributor independen, dan penulis spesifikasi berkontribusi pada sisanya. Perlu banyak orang untuk mengembangkan web yang interoperabilitas.

Pengujian yang lulus di berbagai mesin
Dari wpt.fyi/compat2021, mengukur rasio kelulusan WPT untuk fitur inti

Pola desain software yang baik

Dengan demikian, membuat software berkualitas dengan andal akan jauh lebih mudah jika kodenya mudah dipahami, dan dirancang dengan cara yang meminimalkan kemungkinan bug. Kita akan membahas lebih lanjut desain software RenderingNG dalam postingan blog berikutnya.

Performa yang skalabel

Mencapai performa yang baik—di seluruh dimensi kecepatan, memori, dan penggunaan daya— adalah aspek terpenting berikutnya dari RenderingNG. Kami ingin interaksi dengan semua situs web berjalan lancar dan responsif, tetapi tidak mengorbankan stabilitas perangkat.

Namun, kita tidak hanya menginginkan performa, kita menginginkan performa yang skalabel—arsitektur yang berperforma andal di mesin kelas bawah dan kelas atas, serta di seluruh platform OS. Saya menyebutnya penskalaan—memanfaatkan semua yang dapat dicapai perangkat hardware, dan penskalaan—memaksimalkan efisiensi dan mengurangi permintaan pada sistem saat diperlukan.

Untuk mencapainya, kita perlu memanfaatkan caching, isolasi performa, dan akselerasi hardware GPU secara maksimal. Mari kita bahas satu per satu. Dan untuk membuatnya lebih konkret, mari kita pikirkan bagaimana masing-masing kontribusi terhadap performa satu interaksi yang sangat penting di halaman web: scroll.

Menyimpan ke cache

Di platform UI interaktif yang dinamis seperti web, caching adalah satu-satunya cara terpenting untuk meningkatkan performa secara drastis. Jenis penyimpanan cache yang paling dikenal di browser adalah cache HTTP, tetapi rendering juga memiliki banyak cache. Cache yang paling penting untuk scroll adalah tekstur GPU dan daftar tampilan yang di-cache, yang memungkinkan scroll menjadi sangat cepat sekaligus meminimalkan pemakaian baterai dan berfungsi dengan baik di berbagai perangkat.

Penyimpanan dalam cache membantu masa pakai baterai dan kecepatan frame animasi untuk men-scroll, tetapi yang lebih penting adalah cache dapat memblokir isolasi performa dari thread utama.

Isolasi performa

Di komputer desktop modern, Anda tidak perlu khawatir aplikasi latar belakang akan memperlambat aplikasi yang sedang Anda gunakan. Hal ini karena multitasking preemptif, yang pada akhirnya merupakan bentuk isolasi performa: memastikan tugas independen tidak memperlambat satu sama lain.

Di web, contoh terbaik isolasi performa adalah scroll. Bahkan di situs yang memiliki banyak JavaScript lambat, scroll dapat berjalan sangat lancar, karena berjalan di thread lain yang tidak harus bergantung pada JavaScript dan thread tata letak. Kami melakukan banyak upaya dalam RenderingNG untuk memastikan bahwa setiap kemungkinan scroll memiliki thread, melalui penyimpanan dalam cache yang jauh lebih dari sekadar daftar tampilan ke situasi yang lebih kompleks. Contohnya mencakup kode untuk merepresentasikan elemen yang diposisikan tetap dan melekat, pemroses peristiwa pasif, dan rendering teks berkualitas tinggi.

Sketch menunjukkan bahwa dengan RenderingNG, performa tetap solid meskipun JavaScript sangat lambat.

Akselerasi GPU

GPU membuat pembuatan piksel dan gambar ke layar menjadi jauh lebih cepat—dalam banyak kasus, setiap piksel dapat digambar secara paralel dengan setiap piksel lainnya, sehingga menghasilkan peningkatan kecepatan yang sangat besar. Komponen utama RenderingNG adalah raster GPU dan menggambar di mana saja. Hal ini menggunakan GPU di semua platform, dan semua perangkat, untuk mempercepat rendering dan animasi konten web secara hiper. Hal ini sangat penting pada perangkat kelas bawah atau perangkat kelas atas, yang sering kali memiliki GPU yang jauh lebih canggih daripada bagian lain perangkat.

Sketch menunjukkan bahwa dengan RenderingNG, performa tidak terlalu menurun.

Ekstensibilitas: Alat yang tepat untuk pekerjaan

Setelah memiliki keandalan dan performa yang skalabel, kini kita siap untuk mem-build di atas berbagai alat untuk membantu developer memperluas bagian bawaan HTML, CSS, dan Kanvas, dan dengan cara yang tidak mengorbankan performa dan keandalan yang diperoleh dengan susah payah.

Ini mencakup API bawaan dan API yang diekspos JavaScript untuk kasus penggunaan lanjutan desain responsif, rendering progresif, kelancaran dan responsivitas, serta rendering dengan thread.

API web terbuka berikut, yang didukung oleh Chromium, dapat dilakukan oleh RenderingNG, dan sebelumnya dianggap tidak dapat dilakukan.

Semuanya dikembangkan dengan spesifikasi terbuka dan kolaborasi dengan partner web terbuka, yaitu engineer di browser lain, pakar, dan developer web. Dalam postingan blog berikutnya, kita akan membahas setiap hal tersebut dan menjelaskan bagaimana RenderingNG memungkinkannya.

  • content-visibility: memungkinkan situs menghindari pekerjaan rendering untuk konten di luar layar dengan mudah, dan merender cache untuk tampilan aplikasi web satu halaman yang saat ini tidak ditampilkan.
  • OffscreenCanvas: memungkinkan rendering kanvas (baik canvas API 2D maupun WebGL) berjalan di thread-nya sendiri untuk performa yang sangat andal. Project ini juga merupakan pencapaian besar lainnya untuk web—ini adalah API web pertama yang memungkinkan JavaScript (atau WebAssembly!) merender satu dokumen halaman web dari beberapa thread.
  • Kueri penampung: memungkinkan satu komponen menata letak dirinya secara responsif, yang akan membuka seluruh dunia komponen plug-and-play (saat ini merupakan implementasi eksperimental).
  • Isolasi origin: memungkinkan situs memilih untuk mengaktifkan isolasi performa yang lebih besar di antara iframe.
  • Worklet cat di luar thread utama: memberi developer cara untuk memperluas cara elemen dicat, dengan kode yang berjalan di thread kompositor.

Selain API web eksplisit, RenderingNG memungkinkan kami mengirimkan beberapa "fitur otomatis" yang sangat signifikan yang bermanfaat bagi semua situs:

  • Isolasi Situs: menempatkan iframe lintas origin dalam proses CPU yang berbeda, untuk keamanan dan isolasi performa yang lebih baik.
  • Vulkan, D3D12, dan Metal: memanfaatkan API tingkat rendah yang menggunakan GPU secara lebih efisien daripada OpenGL.
  • Animasi gabungan lainnya: SVG, warna latar belakang.

Fitur tambahan mendatang yang tidak diblokir oleh RenderingNG yang kami nantikan meliputi:

Project utama yang membentuk RenderingNG

Berikut adalah daftar project utama dalam RenderingNG.

CompositeAfterPaint

CompositeAfterPaint memisahkan komposisi dari gaya, tata letak, dan cat, sehingga memungkinkan keandalan yang jauh lebih baik dan performa yang dapat diprediksi, throughput yang meningkat, dan menggunakan lebih sedikit memori tanpa mengorbankan performa.

Tahun Progres
2015 Kirim daftar tampilan.
2017 Kirim pembatalan validasi baru.
2018 Hierarki properti kapal bagian 1.
2019 Hierarki properti kapal bagian 2.
2021 Menyelesaikan pengiriman project.

LayoutNG

Penulisan ulang dari awal semua algoritma tata letak, untuk meningkatkan keandalan dan performa yang lebih dapat diprediksi.

Baca selengkapnya tentang LayoutNG.

Tahun Progres
2019 Alur blok pengiriman.
2020 Mengedit fleksibilitas pengiriman.
2021 Kirim semua yang lain.

BlinkNG

Kami telah memfaktorkan ulang dan membersihkan mesin rendering Blink menjadi fase pipeline yang dipisahkan dengan rapi. Hal ini memungkinkan penyimpanan dalam cache yang lebih baik, keandalan yang lebih tinggi, dan fitur rendering yang kembali atau tertunda seperti kueri visibilitas konten dan penampung.

Akselerasi GPU di mana saja

Akselerasi GPU memberikan peningkatan kecepatan yang sangat besar untuk sebagian besar konten, karena setiap piksel dapat diproses secara paralel. Ini juga merupakan metode yang efektif untuk meningkatkan performa pada perangkat kelas bawah, yang cenderung masih memiliki GPU.

Tahun Progres
2014 Dukungan kanvas. Dikirim di konten keikutsertaan di Android.
2016 Kirim di Mac.
2017 GPU digunakan di lebih dari 60% kunjungan halaman Android.
2018 Dikirimkan di Windows, ChromeOS, dan Android Go.
2019 Rasterisasi GPU dengan thread.
2020 Kirim konten Android yang tersisa.

Scrolling, animasi, dan decoding dengan untaian

Upaya jangka panjang untuk memindahkan semua scroll, animasi yang tidak menyebabkan tata letak, dan decoding gambar dari thread utama. Proses ini masih berlangsung.

Tahun Progres
2011 Dukungan awal untuk animasi dan scroll dengan rangkaian pesan.
2015 Penyingkatan lapisan.
2016 Scroll luapan universal.
2017 Dekode gambar pada thread kompositor.
2018 Animasi Gambar di thread kompositor.
2020 Selalu gabungkan posisi tetap.
2021 Animasi transformasi persentase, animasi SVG.

Viz

Proses raster dan gambar terpusat untuk Chromium yang meningkatkan throughput, mengoptimalkan memori, dan memungkinkan penggunaan kemampuan hardware secara optimal. Fitur ini memiliki manfaat lain yang kurang terlihat oleh developer web, tetapi sangat terlihat oleh pengguna, seperti membatalkan pemblokiran Isolasi Situs dan memisahkan pipeline rendering dari rendering UI browser.

Tahun Progres
2018 OOP-R dikirimkan di Android, Mac, dan Windows.
2019 OOP-D dikirim. OOP-R dikirim ke mana saja (kecuali Kanvas). SkiaRenderer dikirimkan di Linux.
2020 SkiaRenderer dikirimkan di Windows & Android. Vulkan dikirimkan di Android.
2021 SkiaRenderer dikirimkan di Mac (dan ChromeOS dalam waktu dekat).

Definisi istilah dalam diagram di atas:

OOP-D
Compositor tampilan di luar proses. Komposisi tampilan adalah jenis aktivitas yang sama dengan komposer OS. Di luar proses berarti melakukannya dalam proses Viz, bukan proses rendering halaman web atau proses UI browser.
OOP-R
Raster di luar proses. Raster mengonversi daftar tampilan menjadi piksel. Di luar proses berarti melakukannya dalam proses Viz, bukan proses rendering halaman web.
SkiaRenderer
Implementasi kompositor tampilan baru yang dapat mendukung eksekusi pada berbagai API GPU dasar seperti Vulkan, D3D12, atau Metal.

Rendering kanvas yang dipercepat dan memiliki thread

Ini adalah project yang memungkinkan OffscreenCanvas.

Tahun Progres
2018 Mengirim OffscreenCanvas.
2019 Kirim ImageBitmapRenderingContext.
2021 Kirim OOP-R.

VideoNG

VideoNG adalah upaya jangka panjang untuk menyediakan pemutaran video yang efisien, andal, dan berkualitas tinggi di web.

Tahun Progres
2014 Memperkenalkan framework rendering berbasis Mojo.
2015 Mengirimkan Project Butter dan overlay video untuk rendering video yang lebih lancar.
2016 Mengirimkan pipeline rendering dan decoding Android dan desktop terpadu.
2017 Mengirimkan HDR dan rendering video yang dikoreksi warna.
2018 Pipeline decoding video berbasis Mojo yang dikirim.
2019 Pipeline rendering video berbasis Platform yang dikirim.
2021 Mendukung rendering konten yang dilindungi 4K di ChromeOS.

Definisi istilah dalam diagram di atas:

Mojo
Subsistem IPC generasi berikutnya untuk Chromium.
Platform
Konsep yang merupakan bagian dari desain project Viz.

Ilustrasi oleh Una Kravets.