Overdraw mobil tətbiqlərdə: bu nədir, səbəbləri və optimallaşdırma

Müəllif: IT Sectr Dərc olunub: 2026-06-12 Oxuma vaxtı: 10 dəq

Overdraw — eyni piksellərin bir kadr ərzində bir neçə dəfə həddindən artıq yenidən çəkilməsidir. Ekranda çoxlu üst-üstə düşən elementləri olan mürəkkəb interfeys göstərildikdə, GPU hər pikseli dəfələrlə emal etmək məcburiyyətində qalır ki, bu da birbaşa kadr tezliyinə və enerji sərfiyyatına təsir edir. Google Android Developer Documentation, 2025 məlumatına görə, overdrawın 50% azaldılması render performansını 30% artıra bilər. Overdraw optimallaşdırması — hamar animasiyalar və cavabdeh interfeysi olan tətbiqlərin hazırlanmasında məcburi mərhələdir.

Əsas məqamlar

  • Overdraw — bir pikselin kadr başına birdən çox rasterləşdirildiyi, GPU-da həddindən artıq yük yaradan bir fenomendir.
  • GPU səhnədə tamamilə örtülmüş elementlər varsa, vaxtının 40%-ə qədərini gizli piksellərin təkrar çəkilməsinə sərf edir.
  • Debug GPU Overdraw Android-də rəng göstəricisi vasitəsilə həddindən artıq yenidən çəkmə olan sahələri vizual olaraq aşkarlamağa imkan verir.
  • ClipRect və Canvas.saveLayer — Android-də yenidən çəkmə sahəsini əl ilə məhdudlaşdırmaq üçün əsas alətlərdir.
  • ViewStub və komponentlərin gec yüklənməsi görünməz interfeys elementlərinin təxirə salınmış inisializasiyası hesabına overdrawı azaldır.

Mobil qrafikada Overdraw nədir?

Overdraw — eyni ekran pikselinin bir render kadrı ərzində bir neçə dəfə yenidən çəkildiyi vəziyyətdir. İdeal ssenaridə hər piksel dəqiq bir dəfə yazılmalıdır, lakin real interfeyslərdə iç-içə View-lər, fon şəkilləri və şəffaf təbəqələr səbəbindən GPU təkrar yazmalar həyata keçirir.

Hər əlavə yenidən çəkmə kadr render vaxtını artırır. Standart 60 FPS tezliyində bir kadrın emalına təxminən 16.6 ms ayrılır. Overdraw bu limiti aşarsa, kadr tezliyi 30 FPS və ya daha aşağı düşür ki, bu da interfeysin hamarlığını nəzərəçarpacaq dərəcədə pisləşdirir.

Android Performance Patterns məlumatına görə, overdraw əmsalı 3x olan tətbiq fraqment şaderinə overdraw 1x olan tətbiqdən üç dəfə çox vaxt sərf edir. Aşağı GPU performansı olan cihazlarda bu, sürüşdürmə və animasiya zamanı hiss olunan ləngimələrə səbəb olur.

Mobil tərtibatçılar üçün overdrawı anlamaq kritik əhəmiyyət daşıyır: məhz bu amil çoxlu iç-içə elementləri olan, zahirən sadə ekranlarda ən çox sürüşdürmə əyintilərinə və aşağı kadr tezliyinə səbəb olur.

Overdraw GPU performansına necə təsir edir

GPU konveyeri bir neçə mərhələdən ibarətdir: təpə şaderi, rasterləşdirmə və fraqment şaderi. Fraqment şaderi — ən bahalı hissədir, çünki hər primitivin hər pikseli üçün icra olunur. Overdraw x2-də fraqment şaderi iki dəfə çox piksel emal edir ki, bu da birbaşa kadr vaxtını artırır.

Qualcomm AdrenoApple GPU kimi müasir mobil GPU-lar Early-Z Test və Hidden Surface Removal mexanizmlərinə malikdir ki, bunlar da overdrawı qismən kompensasiya edir. Lakin bu optimallaşdırmalar yalnız müəyyən şərtlərdə işləyir və yalnız aparat sürətləndirilməsinə güvənmək olmaz.

Məsələn, yarı-şəffaf elementlərin render edilməsi zamanı aparat Early-Z səmərəsizdir və hər piksel tam emal olunur — belə ssenarilərdə overdraw 5x və daha çox ola bilər.

Həddindən artıq yenidən çəkmənin əsas səbəbləri

Çoxqatlı fonlar — mobil tətbiqlərdə overdrawın əsas səbəblərindən biridir. Activity və ya ViewController fon rəngi təyin etdikdə, hər iç-içə View öz fonunu əlavə edə bilər və piksel iyerarxiyanın hər səviyyəsində yenidən çəkilir.

Uber Engineering tədqiqatı göstərdi ki, Android tətbiqində artıq fonların silinməsi overdrawı 32%, ekran render vaxtını isə 25% azaldıb. iOS-da da oxşar vəziyyət: qeyri-şəffaf View-lər üçün opaque = true təyini alfa qarışdırmanı aradan qaldırır və piksellərin təkrar yazılmasının qarşısını alır.

  • Şəffaf örtüklər — digər elementlərin üzərində alfa kanalı olan elementlər həmişə overdrawa səbəb olur.
  • ClipChildren=false — uşaq elementlərin kəsilməsinin söndürülməsi görünməyən sahələrin render edilməsinə gətirib çıxarır.
  • ShapeDrawable istifadəsi sadə rənglər əvəzinə fraqment şaderinin yükünü artırır.
  • Həddindən artıq iç-içəlik — View iyerarxiyasının hər səviyyəsi potensial yenidən çəkmə qatı əlavə edir.

iOS platformasında overdraw tez-tez şəffaf UIStackView, shouldRasterize ilə CALayer və üst-üstə düşən UIBlurEffect istifadəsi səbəbindən yaranır. Apple XCode-da Core Animation aləti ilə overdrawı yoxlamağı tövsiyə edir — o, yenidən çəkmə zonalarını qırmızı rəngli örtük şəklində göstərir.

Overdrawı necə diaqnoz etmək olar: alətlər və metodlar

Debug GPU Overdraw — Android-in daxili aləti olub, overdraw çoxluğundan asılı olaraq ekranı müxtəlif rənglərə boyayır. Bənövşəyi rəng 1x, mavi — 2x, yaşıl — 3x, çəhrayı — 4x, qırmızı — 5x və daha çox deməkdir. İdeal ekran əsasən bənövşəyi olmalıdır.

iOS-da oxşar diaqnostikanı XCode Instruments tərkibində Core Animation aləti yerinə yetirir. O, yenidən çəkmə zonalarını vizuallaşdırır və Color Blended Layers rejimində piksel başına yazmaların dəqiq sayını göstərir. Yaşıl təbəqələr — qeyri-şəffaf (optimal), qırmızı — şəffaflıq ehtiva edir və overdrawa səbəb olur.

  • Profile GPU Rendering Android-də render vaxtının histoqramını göstərir. Hündür yaşıl sütunlar overdraw problemlərini göstərir.
  • Renderscript — Android 10+ olan cihazlarda render konveyerinin təhlili üçün daha təkmil alətdir.
  • Metal Debugger XCode-da hər render keçidini təhlil etməyə və fraqment şaderi çağırışlarının dəqiq sayını görməyə imkan verir.

Diaqnostikadan sonra optimallaşdırmadan əvvəl və sonra FPS-i ölçmək vacibdir. Overdrawın düzəldilməsi zamanı 10–15 FPS fərq siyahılar və animasiya olan mürəkkəb ekran üçün normal nəticədir.

Mobil tətbiqlərdə Overdraw optimallaşdırma üsulları

Artıq fonların silinməsi — ən sadə və effektiv üsuldur. Android-də android:windowBackground-ı yalnız Activity və ya tema üçün təyin etmək kifayətdir, hər View üçün yox. iOS-da bütün qeyri-şəffaf UIView-lər üçün opaque = true bu elementlər üçün overdrawı praktiki olaraq sıfıra endirir.

Google I/O 2019 məlumatına görə, Google Maps-də overdraw optimallaşdırması qatların birləşdirilməsi və çəkmə sahəsini məhdudlaşdırmaq üçün ClipRect istifadəsi hesabına kadr render vaxtını 40% azaltmağa imkan verdi. Google Android tərtibatçılarına aşağıdakı təcrübələri tövsiyə edir:

  • ClipRect — Canvas çəkmə sahəsini məhdudlaşdırır. Görünən sahədən kənarda heç nə yoxdursa — GPU resurs sərf etmir.
  • ViewStub — nadir istifadə olunan və ya yükləmə zamanı görünməyən elementlər üçün. Komponent yalnız inflate çağırışı zamanı render edilir.
  • mergeinclude — View iyerarxiyasının dərinliyini azaldır ki, bu da render keçidlərinin sayını aşağı salır.
  • Flat buffers — iç-içə Layout-ların bir ConstraintLayout və ya RelativeLayout ilə əvəz edilməsi.

iOS-da optimallaşdırma CALayer konfiqurasiyası vasitəsilə əldə edilir: masksToBounds = true təyini təbəqə sərhədlərindən kənar məzmunu kəsir, shouldRasterize isə statik təbəqələr üçün raster təsvirin keşləşdirilməsini aktivləşdirir.

Kod nümunələri: Android və iOS-da Overdrawın aradan qaldırılması

KotlinSwift-də overdrawın aradan qaldırılmasının tipik ssenarilərini nümayiş etdirən praktiki nümunələrə baxaq. Birinci nümunə Android-də ClipRect vasitəsilə optimallaşdırmanı göstərir:

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()
        )
        // Məzmunu yalnız kəsilmiş sahədə çəkin
        super.onDraw(canvas)
    }
}

İkinci nümunə — Swift-də, element yarı-şəffaf olmamalıdırsa, təbəqə üçün şəffaflığın söndürülməsini göstərir:

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

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

Üçüncü nümunə — Android-də xəritənin gec yüklənməsi üçün ViewStub istifadəsidir. ViewStub görünən olana qədər render edilmir ki, bu da ekranın inisializasiyası mərhələsində overdrawı aradan qaldırır:

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" />

// Tələb əsasında genişləndir
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()

Tez-tez verilən suallar

Overdraw nədir sadə sözlərlə?

Overdraw — ekrandakı pikselin bir kadr ərzində bir neçə dəfə yenidən çəkildiyi vəziyyətdir. Təsəvvür edin ki, bir vərəq kağızı boyayır və üzərinə rəsmləri olan bir neçə şəffaf film yapışdırırsınız — üst təbəqə hər dəfə dəyişəndə alt təbəqələr yenidən çəkilməlidir.

Android-də Overdrawı necə yoxlamaq olar?

Tərtibatçı parametrlərində Debug GPU Overdraw-u aktivləşdirin. Overdraw 1x olan elementlər bənövşəyi, 2x — mavi, 3x — yaşıl, 4x — çəhrayı, 5x+ — qırmızı rəngə boyanır. Optimal ekran — əsasən qırmızı zonalar olmadan bənövşəyi.

Niyə Overdraw mobil tətbiqlərdə FPS-i aşağı salır?

Hər əlavə piksel yenidən çəkməsi rəngi, teksturanı və işıqlandırmanı emal edən fraqment şaderinin çağırılmasını tələb edir. 60 FPS-də kadra 16.6 ms ayrılır — əgər overdraw GPU-nu 2–3 dəfə çox piksel emal etməyə məcbur edərsə, limit aşılır və FPS 30-a düşür.

Overdraw batareyanın iş müddətinə təsir edirmi?

Bəli, birbaşa. Artıq iş görən GPU daha çox enerji sərf edir. Google tədqiqatına görə, overdrawın 4x-dən 1x-ə endirilməsi GPU enerji sərfiyyatını 35–50% azaldır ki, bu da xüsusilə yüksək dəqiqlikli ekranları olan cihazlarda nəzərə çarpır.

Hansı Overdraw səviyyəsi normal sayılır?

Sadə ekranlar üçün — 1x–1.5x (az miqdarda mavi ilə bənövşəyi). Zəngin interfeyslər üçün — 2x-ə qədər. 3x və daha yüksək səviyyə (çəhrayı, qırmızı) optimallaşdırma tələb edir. Google ekran üzrə orta hesabla overdraw 2.5x-i keçməməyi tövsiyə edir.

Nəticə

  • Overdraw — piksellərin həddindən artıq yenidən çəkilməsi, mobil interfeyslərdə GPU-nun aşağı performansının əsas səbəbidir.
  • Əsas səbəblər: çoxqatlı fonlar, şəffaf örtüklər, View-lərin həddindən artıq iç-içəliyi və opaque bayraqlarının olmaması.
  • Diaqnostika Android-də Debug GPU Overdraw və XCode-da Core Animation aləti vasitəsilə aparılır.
  • Optimallaşdırmaya artıq fonların silinməsi, ClipRect, ViewStub və opaque = true istifadəsi daxildir.
  • Overdrawın 3x-dən 1x-ə endirilməsi FPS-i 30–50% artıra və GPU enerji sərfiyyatını azalda bilər.
  • Android-də iç-içə LinearLayout-lar əvəzinə düz iyerarxiya üçün ConstraintLayout istifadəsi tövsiyə olunur.
  • Overdrawı inkişafın hər mərhələsində nəzarətdə saxlayın — bu, buraxılışdan əvvəl optimallaşdırmaqdan daha asandır.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun