Overdraw dalam aplikasi mobile: apa itu, penyebab dan optimasi

Penulis: IT Sectr Diterbitkan: 2026-06-12 Waktu membaca: 10 mnt

Overdraw — adalah penggambaran ulang berlebihan dari piksel yang sama beberapa kali dalam satu frame. Ketika antarmuka kompleks dengan banyak elemen yang tumpang tindih ditampilkan di layar, GPU dipaksa untuk memproses setiap piksel secara berulang, yang secara langsung mempengaruhi frame rate dan konsumsi daya. Menurut Google Android Developer Documentation, 2025, mengurangi overdraw sebesar 50% dapat meningkatkan kinerja rendering hingga 30%. Optimasi overdraw — tahap wajib dalam pengembangan aplikasi dengan animasi halus dan antarmuka yang responsif.

Poin utama

  • Overdraw — fenomena di mana satu piksel dirasterisasi lebih dari sekali per frame, menciptakan beban berlebihan pada GPU.
  • GPU menghabiskan hingga 40% waktu untuk menggambar ulang piksel tersembunyi jika ada elemen yang sepenuhnya tertutup di scene.
  • Debug GPU Overdraw di Android memungkinkan deteksi visual area dengan penggambaran ulang berlebihan melalui indikasi warna.
  • ClipRect dan Canvas.saveLayer — alat utama untuk membatasi area penggambaran ulang secara manual di Android.
  • ViewStub dan pemuatan lambat komponen mengurangi overdraw melalui inisialisasi tertunda elemen antarmuka yang tidak terlihat.

Apa itu Overdraw dalam grafis mobile?

Overdraw — adalah situasi di mana piksel layar yang sama digambar ulang beberapa kali selama satu frame rendering. Dalam skenario ideal, setiap piksel harus ditulis tepat satu kali, tetapi dalam antarmuka nyata karena View yang bersarang, gambar latar belakang, dan lapisan transparan, GPU melakukan penulisan berulang.

Setiap penggambaran ulang tambahan meningkatkan waktu rendering frame. Pada frekuensi standar 60 FPS, sekitar 16.6 ms dialokasikan untuk memproses satu frame. Jika overdraw menyebabkan melebihi batas ini, frame rate turun menjadi 30 FPS atau lebih rendah, yang secara nyata memperburuk kehalusan antarmuka.

Menurut Android Performance Patterns dari Google, aplikasi dengan koefisien overdraw 3x menghabiskan tiga kali lebih banyak waktu pada fragment shader daripada aplikasi dengan overdraw 1x. Pada perangkat dengan kinerja GPU rendah, ini menyebabkan lag yang terasa saat scrolling dan animasi.

Bagi pengembang mobile, memahami overdraw sangat penting: justru faktor ini paling sering menyebabkan scrolling tersendat dan frame rate rendah pada layar yang tampaknya sederhana dengan banyak elemen bersarang.

Bagaimana Overdraw mempengaruhi kinerja GPU

Pipeline GPU terdiri dari beberapa tahap: vertex shader, rasterisasi, dan fragment shader. Fragment shader — bagian paling mahal, karena dijalankan untuk setiap piksel dari setiap primitif. Pada overdraw x2, fragment shader memproses dua kali lebih banyak piksel, yang secara langsung meningkatkan waktu frame.

GPU mobile modern seperti Qualcomm Adreno dan Apple GPU memiliki mekanisme Early-Z Test dan Hidden Surface Removal yang sebagian mengkompensasi overdraw. Namun, optimasi ini hanya bekerja dalam kondisi tertentu dan tidak boleh hanya mengandalkan akselerasi hardware.

Misalnya, saat merender elemen semi-transparan, Early-Z hardware tidak efektif dan setiap piksel diproses sepenuhnya — overdraw dalam skenario seperti itu bisa mencapai 5x dan lebih.

Penyebab utama penggambaran ulang berlebihan

Latar belakang multi-lapis — salah satu penyebab utama overdraw dalam aplikasi mobile. Ketika Activity atau ViewController mengatur warna latar belakang, setiap View bersarang dapat menambahkan latar belakangnya sendiri, dan piksel digambar ulang di setiap level hierarki.

Penelitian Uber Engineering menunjukkan bahwa menghapus latar belakang yang berlebihan di aplikasi Android mereka mengurangi overdraw sebesar 32%, dan waktu rendering layar — sebesar 25%. Situasi serupa di iOS: mengatur opaque = true untuk View yang tidak transparan menghilangkan pencampuran alfa dan mencegah penulisan piksel berulang.

  • Lapisan transparan — elemen dengan saluran alfa di atas elemen lain selalu menyebabkan overdraw.
  • ClipChildren=false — menonaktifkan pemotongan elemen anak menyebabkan rendering area yang tidak terlihat.
  • Menggunakan ShapeDrawable sebagai ganti warna sederhana meningkatkan beban fragment shader.
  • Bersarang berlebihan — setiap level hierarki View menambahkan lapisan penggambaran ulang potensial.

Di platform iOS, overdraw sering muncul karena penggunaan UIStackView transparan, CALayer dengan shouldRasterize, dan UIBlurEffect yang tumpang tindih. Apple merekomendasikan untuk memeriksa overdraw melalui alat Core Animation di XCode — ini menunjukkan zona penggambaran ulang sebagai overlay warna merah.

Cara mendiagnosis Overdraw: alat dan metode

Debug GPU Overdraw — alat bawaan Android yang mewarnai layar dalam berbagai warna tergantung pada multiplisitas overdraw. Warna ungu berarti 1x, biru — 2x, hijau — 3x, merah muda — 4x, merah — 5x dan lebih. Layar ideal harus didominasi ungu.

Di iOS, diagnosis serupa dilakukan oleh alat Core Animation dalam XCode Instruments. Ini memvisualisasikan zona penggambaran ulang dan menunjukkan jumlah penulisan yang tepat per piksel dalam mode Color Blended Layers. Lapisan hijau — tidak transparan (optimal), merah — mengandung transparansi dan menyebabkan overdraw.

  • Profile GPU Rendering di Android menunjukkan histogram waktu rendering. Batang hijau tinggi menunjukkan masalah overdraw.
  • Renderscript — alat yang lebih canggih untuk menganalisis pipeline rendering pada perangkat Android 10+.
  • Metal Debugger di XCode memungkinkan menganalisis setiap lintasan rendering dan melihat jumlah persis panggilan fragment shader.

Setelah diagnosis, penting untuk mengukur FPS sebelum dan sesudah optimasi. Perbedaan 10–15 FPS saat memperbaiki overdraw adalah hasil normal untuk layar kompleks dengan daftar dan animasi.

Teknik optimasi Overdraw dalam aplikasi mobile

Menghapus latar belakang berlebihan — metode paling sederhana dan efektif. Di Android, cukup atur android:windowBackground hanya untuk Activity atau tema, bukan untuk setiap View. Di iOS, opaque = true untuk semua UIView yang tidak transparan mengurangi overdraw hingga hampir nol untuk elemen-elemen ini.

Menurut Google I/O 2019, optimasi overdraw di Google Maps memungkinkan pengurangan waktu rendering frame sebesar 40% dengan menggabungkan lapisan dan menggunakan ClipRect untuk membatasi area gambar. Google merekomendasikan praktik berikut untuk pengembang Android:

  • ClipRect — membatasi area gambar Canvas. Jika tidak ada apa pun di luar area terlihat — GPU tidak membuang sumber daya.
  • ViewStub — untuk elemen yang jarang digunakan atau tidak terlihat saat dimuat. Komponen hanya dirender saat inflate dipanggil.
  • merge dan include — mengurangi kedalaman hierarki View, yang menurunkan jumlah lintasan rendering.
  • Flat buffers — mengganti Layout bersarang dengan satu ConstraintLayout atau RelativeLayout.

Di iOS, optimasi dicapai melalui konfigurasi CALayer: mengatur masksToBounds = true memotong konten di luar batas lapisan, dan shouldRasterize mengaktifkan caching representasi raster untuk lapisan statis.

Contoh kode: menghilangkan Overdraw di Android dan iOS

Mari kita lihat contoh praktis dalam Kotlin dan Swift yang mendemonstrasikan skenario umum penghapusan overdraw. Contoh pertama menunjukkan optimasi melalui ClipRect di Android:

kotlin
class OptimizedView@JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : View(context, attrs) {

    override fun onDraw(canvas: Canvas) {
        canvas.clipRect(
            paddingLeft.toFloat(), paddingTop.toFloat(),
            width - paddingRight.toFloat(), height - paddingBottom.toFloat()
        )
        // Gambar konten hanya dalam area yang dipotong
        super.onDraw(canvas)
    }
}

Contoh kedua — dalam Swift, menunjukkan penonaktifan transparansi untuk lapisan jika elemen tidak boleh semi-transparan:

swift
class OpaqueLabel: UILabel {
    override var isOpaque: Bool {
        get { true }
        set { }
    }

    override func draw(_ rect: CGRect) {
        backgroundColor?.setFill()
        UIRectFill(rect)
        super.draw(rect)
    }
}

Contoh ketiga — penggunaan ViewStub untuk pemuatan tertunda peta di Android. ViewStub tidak dirender sampai menjadi terlihat, yang menghilangkan overdraw pada tahap inisialisasi layar:

xml
<!-- layout/activity_main.xml -->
<ViewStub
    android:id="@+id/map_stub"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:inflatedId="@+id/map_container"
    android:layout="@layout/map_fragment" />

// Kembangkan sesuai permintaan
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()

Pertanyaan yang sering diajukan

Apa itu Overdraw dengan kata sederhana?

Overdraw — adalah ketika piksel di layar digambar ulang beberapa kali dalam satu frame. Bayangkan Anda mengecat selembar kertas dan menempelkan beberapa film transparan dengan gambar di atasnya — lapisan bawah harus digambar ulang setiap kali lapisan atas berubah.

Bagaimana cara memeriksa Overdraw di Android?

Aktifkan Debug GPU Overdraw di pengaturan pengembang. Elemen dengan overdraw 1x diwarnai ungu, 2x — biru, 3x — hijau, 4x — merah muda, 5x+ — merah. Layar optimal — didominasi ungu tanpa zona merah.

Mengapa Overdraw menurunkan FPS dalam aplikasi mobile?

Setiap penggambaran ulang piksel tambahan memerlukan panggilan fragment shader, yang memproses warna, tekstur, dan pencahayaan. Pada 60 FPS, 16.6 ms dialokasikan per frame — jika overdraw memaksa GPU memproses 2–3 kali lebih banyak piksel, batas terlampaui dan FPS turun menjadi 30.

Apakah Overdraw mempengaruhi masa pakai baterai?

Ya, secara langsung. GPU yang melakukan pekerjaan berlebihan mengkonsumsi lebih banyak energi. Menurut penelitian Google, mengurangi overdraw dari 4x ke 1x mengurangi konsumsi energi GPU sebesar 35–50%, yang terutama terlihat pada perangkat dengan layar resolusi tinggi.

Tingkat Overdraw apa yang dianggap normal?

Untuk layar sederhana — 1x–1.5x (ungu dengan sedikit biru). Untuk antarmuka yang kaya — hingga 2x. Tingkat 3x dan lebih tinggi (merah muda, merah) memerlukan optimasi. Google merekomendasikan untuk tidak melebihi overdraw 2.5x rata-rata per layar.

Ringkasan

  • Overdraw — penggambaran ulang piksel berlebihan, penyebab utama kinerja GPU rendah dalam antarmuka mobile.
  • Penyebab utama: latar belakang multi-lapis, lapisan transparan, bersarang berlebihan View dan tidak adanya flag opaque.
  • Diagnosis dilakukan melalui Debug GPU Overdraw di Android dan alat Core Animation di XCode.
  • Optimasi meliputi menghapus latar belakang berlebihan, menggunakan ClipRect, ViewStub, dan opaque = true.
  • Mengurangi overdraw dari 3x ke 1x dapat meningkatkan FPS sebesar 30–50% dan mengurangi konsumsi energi GPU.
  • Di Android, disarankan menggunakan ConstraintLayout untuk hierarki datar sebagai ganti LinearLayout bersarang.
  • Kontrol overdraw di setiap tahap pengembangan — ini lebih mudah daripada mengoptimalkan setelahnya sebelum rilis.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga