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 — 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.
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 Adreno və Apple 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.
Ç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.
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.
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.
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.
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:
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.
Kotlin və Swift-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:
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:
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:
<!-- 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 — 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.
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.
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.
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.
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ə
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.
Həm də oxuyun