The Android Developer Challenge is back! Submit your idea before December 2.

Mengurangi overdraw

Aplikasi dapat menggambar pixel lebih dari satu kali dalam satu frame, suatu peristiwa yang disebut overdraw. Overdraw biasanya tidak diperlukan, dan sebaiknya dihilangkan. Overdraw termanifestasi sebagai masalah performa dengan menghabiskan waktu GPU untuk merender piksel yang tidak berkontribusi pada tampilan yang dilihat oleh pengguna di layar.

Dokumen ini menjelaskan overdraw: apa itu overdraw, cara mendiagnosisnya, dan tindakan yang dapat Anda lakukan untuk menghilangkan atau memitigasinya.

Tentang overdraw

Overdraw mengacu ke penggambaran piksel di layar oleh sistem beberapa kali dalam satu frame rendering. Misalnya, jika ada banyak kartu UI yang ditumpuk , tiap kartu menyembunyikan satu bagian kartu di bawahnya.

Akan tetapi, sistem masih perlu menggambar bagian kartu yang tersembunyi dalam tumpukan. Ini karena kartu yang ditumpuk dirender menurut algoritme pelukis: yaitu dalam urutan dari belakang ke depan. Urutan rendering ini memungkinkan sistem menerapkan pencampuran alfa yang tepat pada objek transparan seperti bayangan.

Catatan: Overdraw bukan lagi masalah yang signifikan seperti saat dibahas di sesi performa Google I/O, dan video pola performa. Ini karena perangkat kelas rendah telah terus berkembang dalam hal performa GPU, sedangkan tampilannya bertahan pada resolusi yang relatif rendah. Kecuali mengoptimalkan perangkat GPU berperforma rendah yang telah diketahui, sebaiknya berfokus untuk mengoptimalkan pekerjaan thread UI guna memastikan performa aplikasi yang lancar. Selain itu, pengoptimalan OS menghindari overdraw dalam aplikasi pada banyak kasus (misalnya, latar belakang Fragment yang melakukan overdraw latar belakang jendela).

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 jumlah waktu aplikasi menggambar tiap piksel di layar. Semakin tinggi jumlah ini, semakin besar kemungkinan overdraw memengaruhi performa aplikasi.

Untuk informasi selengkapnya, lihat cara memvisualisasikan overdraw GPU.

Alat rendering GPU profil

Alat Rendering GPU Profil menampilkan, berupa histogram scroll, waktu yang diperlukan oleh tiap tahap pipeline rendering untuk menampilkan satu frame. Bagian Proses dari tiap batang, yang ditunjukkan dengan warna oranye, muncul saat sistem bertukar buffering; 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 untuk menunggu hingga prosesnya selesai. Batang Proses menunjukkan bahwa lonjakan ini terjadi 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 melonjak, ada kemungkinan masalah dengan overdraw.

Untuk informasi selengkapnya, lihat cara memprofilkan kecepatan rendering GPU profil.

Catatan: Alat Rendering GPU Profil tidak dapat digunakan dengan aplikasi yang menggunakan NDK. Ini karena sistem mendorong pesan framework ke latar belakang saat OpenGL mengambil konteks layar penuh. Dalam hal ini, Anda mungkin akan terbantu oleh fitur pembuatan profil yang disediakan oleh produsen GPU.

Memperbaiki overdraw

Ada beberapa strategi yang dapat Anda lakukan untuk mengurangi atau menghilangkan overdraw:

  • Menghapus latar belakang yang tidak diperlukan pada tata letak.
  • Meratakan hierarki tampilan.
  • Mengurangi transparansi.

Bagian ini memberikan informasi tentang masing-masing pendekatan ini.

Menghapus latar belakang yang tidak diperlukan pada tata letak

Secara default, tata letak tidak memiliki latar belakang, artinya tata letak tidak merender apa pun secara langsung dengan sendirinya. Akan tetapi, jika memiliki latar belakang, tata letak dapat berkontribusi pada overdraw.

Menghapus latar belakang yang tidak diperlukan adalah cara cepat untuk menyempurnakan performa rendering. Latar belakang yang tidak diperlukan mungkin tidak pernah terlihat karena speenuhnya tertutup oleh semua item lain yang sedang digambar oleh aplikasi di atas tampilan tersebut. Misalnya, sistem dapat sepenuhnya menutupi latar belakang induknya saat menggambar tampilan turunan di atasnya.

Untuk mencari tahu penyebab Anda melakukan overdraw, lihat hierarki di alat Pemeriksa Tata Letak. Saat melakukannya, perhatikan latar belakang yang dapat Anda hilangkan karena latar belakang tersebut tidak terlihat oleh pengguna. Kasus di mana banyak container memiliki warna latar belakang yang sama menawarkan peluang lain untuk menghilangkan latar belakang yang tidak diperlukan: Anda dapat menyetel latar belakang jendela ke warna latar belakang utama aplikasi, dan membiarkan semua container di atasnya tanpa nilai latar belakang yang ditentukan.

Meratakan hierarki tampilan

Tata letak modern memudahkan untuk menumpuk dan melapisi tampilan agar menghasilkan desain yang indah. Akan tetapi, tindakan tersebut dapat menurunkan performa dengan menghasilkan overdraw terutama dalam skenario di mana tiap objek tampilan yang ditumpuk buram, sehingga harus menggambarkan piksel yang terlihat dan tidak terlihat ke layar.

Jika Anda mengalami masalah seperti ini, Anda mungkin dapat menyempurnakan performa dengan mengoptimalkan hierarki tampilan untuk mengurangi jumlah objek UI yang tumpang tindih. Untuk informasi selengkapnya tentang cara mencapainya, lihat Mengoptimalkan hierarki tampilan.

Mengurangi transparansi

Rendering piksel transparan di layar, yang dikenal sebagai rendering alfa, adalah kontributor utama pada overdraw. Tidak seperti overdraw standar, di mana sistem sepenuhnya menyembunyikan piksel yang sudah digambar dengan menggambar piksel buram di atasnya, objek transparan mengharuskan piksel yang sudah ada digambar terlebih dahulu, agar persamaan pencampuran yang tepat dapat terjadi. Efek visual seperti animasi transparan, fade out, dan drop shadow semuanya melibatkan semacam transparansi, dan, oleh karena itu, 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 TextView dengan nilai alfa transparan yang disetel di atasnya. Tetapi Anda dapat memperoleh efek yang sama dengan performa yang jauh lebih baik hanya dengan menggambar teks dalam warna abu-abu.

Untuk mempelajari lebih lanjut biaya performa yang ditimbulkan oleh transparansi di seluruh pipeline menggambar, tonton video Biaya Tersembunyi Transparansi.