Halaman ini menjelaskan apa itu overdraw, cara mendiagnosisnya, dan cara untuk menghilangkan atau memitigasinya.
Jika aplikasi menggambar piksel yang sama lebih dari sekali dalam satu frame, hal ini disebut overdraw. Overdraw biasanya tidak diperlukan, dan sebaiknya dihilangkan. Overdraw menjadi masalah performa jika membuang waktu GPU untuk merender piksel yang tidak berkontribusi pada tampilan yang dilihat oleh pengguna di layar.
Tentang overdraw
Overdraw merujuk pada penggambaran piksel di layar oleh sistem beberapa kali dalam satu frame rendering. Misalnya, jika Anda memiliki tumpukan kartu UI, setiap kartu menyembunyikan bagian kartu di bawahnya. Namun, sistem masih perlu menggambar bagian kartu yang tersembunyi dalam tumpukan. Hal ini karena kartu yang ditumpuk dirender menurut algoritme pelukis—yaitu dalam urutan dari belakang ke depan. Dengan urutan rendering ini, sistem dapat menerapkan pencampuran alfa yang tepat pada objek transparan, seperti bayangan.
Menemukan masalah overdraw
Platform menawarkan alat berikut untuk membantu Anda menentukan apakah overdraw memengaruhi performa aplikasi.
Alat Debug Overdraw GPU
Alat Debug Overdraw GPU menggunakan kode warna untuk menampilkan frekuensi penggambaran setiap piksel di layar oleh aplikasi. Semakin tinggi frekuensinya, semakin besar kemungkinan overdraw memengaruhi performa aplikasi.
Untuk informasi selengkapnya, lihat Memvisualisasikan overdraw oleh GPU.
Alat Rendering GPU Profil
Alat Rendering GPU Profil menampilkan waktu yang diperlukan oleh setiap tahap pipeline rendering untuk menampilkan satu frame sebagai histogram scroll. Bagian Proses di setiap batang, yang ditunjukkan dengan warna oranye, ditampilkan saat sistem menukar buffer. Metrik ini memberikan petunjuk penting tentang overdraw.
Pada GPU yang performanya lebih rendah, rasio pengisian yang tersedia—kecepatan GPU dapat mengisi buffering frame—bisa jadi agak rendah. Seiring bertambahnya jumlah piksel yang diperlukan untuk menggambar frame, GPU mungkin memerlukan waktu lebih lama untuk memproses perintah baru, dan meminta sistem lainnya untuk menunggu hingga prosesnya selesai. Batang Proses menunjukkan lonjakan ini saat GPU kewalahan mencoba menggambar piksel secepat mungkin. Masalah selain jumlah mentah piksel juga dapat menyebabkan metrik ini melonjak. Misalnya, jika alat Debug Overdraw GPU menunjukkan overdraw yang berat dan Proses yang melonjak, kemungkinan ada masalah dengan overdraw.
Untuk mengetahui informasi selengkapnya, lihat Kecepatan rendering GPU profil.
Memperbaiki overdraw
Anda dapat melakukan hal berikut untuk mengurangi atau menghilangkan overdraw:
- Menghapus latar belakang yang tidak diperlukan dalam tata letak.
- Mengurangi transparansi.
Bagian ini memberikan informasi tentang kedua pendekatan ini.
Menghapus latar belakang yang tidak diperlukan dalam tata letak
Secara default, tata letak tidak memiliki latar belakang, yang berarti tata letak tidak merender apa pun secara langsung dengan sendirinya. Namun, jika memiliki latar belakang, tata letak mungkin berkontribusi pada overdraw.
Anda dapat meningkatkan performa rendering dengan menghapus latar belakang yang tidak diperlukan, seperti latar belakang yang tidak terlihat karena tertutup sepenuhnya oleh semua yang digambar oleh aplikasi di atasnya. Misalnya, Box turunan atau tata letak
dengan pengubah .background mungkin sepenuhnya menutupi latar belakang
penampung induk, sehingga proses penggambaran induk sepenuhnya tidak terlihat oleh pengguna
tetapi masih diproses sepenuhnya oleh GPU.
Untuk mengetahui penyebab Anda melakukan overdraw, lihat hierarki komponen di alat Layout Inspector. Anda dapat mencari latar belakang yang tidak terlihat oleh pengguna dan menghilangkannya. Anda juga dapat menghapus latar belakang yang tidak diperlukan ketika ada beberapa penampung yang memiliki warna latar belakang yang sama. Tetapkan latar belakang jendela ke warna latar belakang utama aplikasi, dan biarkan semua penampung di atasnya tanpa nilai latar belakang yang ditentukan.
Mengurangi transparansi
Rendering piksel transparan di layar, yang dikenal sebagai rendering alfa, adalah kontributor utama pada overdraw. Tidak seperti overdraw standar—ketika sistem sepenuhnya menyembunyikan piksel yang sudah digambar dengan menggambar piksel buram di atasnya—objek transparan mengharuskan piksel yang sudah ada untuk digambar terlebih dahulu, agar pencampuran yang tepat dapat terjadi.
Efek visual seperti animasi transparan, animasi memudar, dan drop shadow memerlukan
beberapa transparansi, sehingga dapat berkontribusi secara signifikan pada overdraw. Anda dapat memperbaiki overdraw dalam situasi ini dengan mengurangi jumlah objek transparan yang Anda render. Misalnya, Anda dapat memperoleh teks abu-abu dengan menggambar teks hitam di
a Text composable dan menerapkan nilai alfa transparan menggunakan modifier
= Modifier.alpha(0.5f). Namun, Anda bisa mendapatkan efek yang sama guna menghasilkan performa yang lebih baik dengan menetapkan warna teks composable secara langsung ke abu-abu buram: color = Color.Black.copy(alpha = 0.5f).
Untuk mempelajari biaya performa yang ditimbulkan oleh transparansi di seluruh pipeline menggambar lebih lanjut, tonton Biaya Tersembunyi Transparansi.