Overdraw — bir kadr davomida bir xil piksellarning bir necha marta haddan tashqari qayta chizilishidir. Ekranda ko'plab ustma-ust tushadigan elementlarga ega murakkab interfeys ko'rsatilganda, GPU har bir pikselni qayta-qayta qayta ishlashga majbur bo'ladi, bu esa to'g'ridan-to'g'ri kadr chastotasi va energiya sarfiga ta'sir qiladi. Google Android Developer Documentation, 2025 ma'lumotlariga ko'ra, overdrawni 50% kamaytirish renderlash unumdorligini 30% gacha oshirishi mumkin. Overdraw optimallashtirish — silliq animatsiyalar va sezgir interfeysga ega ilovalarni ishlab chiqishda majburiy bosqichdir.
Asosiy fikrlar
Overdraw — bir ekran pikseli bitta renderlash kadri davomida bir necha marta qayta chiziladigan holatdir. Ideal stsenariyda har bir piksel aniq bir marta yozilishi kerak, ammo real interfeyslarda ichma-ich Viewlar, fon tasvirlari va shaffof qatlamlar tufayli GPU takroriy yozishlarni amalga oshiradi.
Har bir qo'shimcha qayta chizish kadr renderlash vaqtini oshiradi. Standart 60 FPS chastotasida bitta kadrni qayta ishlashga taxminan 16.6 ms ajratiladi. Agar overdraw bu limitdan oshib ketsa, kadr chastotasi 30 FPS yoki undan pastga tushadi, bu interfeys silliqligini sezilarli darajada yomonlashtiradi.
Android Performance Patterns ma'lumotiga ko'ra, overdraw koeffitsienti 3x bo'lgan ilova fragment shaderiga overdraw 1x bo'lgan ilovaga qaraganda uch baravar ko'p vaqt sarflaydi. Past GPU unumdorligiga ega qurilmalarda bu skrollash va animatsiya paytida sezilarli kechikishlarga olib keladi.
Mobil dasturchilar uchun overdrawni tushunish juda muhim: aynan shu omil ko'p sonli ichma-ich elementlarga ega, oddiy ko'rinadigan ekranlarda tez-tez skrollashning silkinishiga va past kadr chastotasiga sabab bo'ladi.
GPU konveyeri bir necha bosqichdan iborat: vertex shader, rasterlashtirish va fragment shader. Fragment shader — eng qimmat qism, chunki u har bir primitivning har bir pikseli uchun bajariladi. Overdraw x2 da fragment shader ikki baravar ko'p pikselni qayta ishlaydi, bu esa to'g'ridan-to'g'ri kadr vaqtini oshiradi.
Qualcomm Adreno va Apple GPU kabi zamonaviy mobil GPUlar Early-Z Test va Hidden Surface Removal mexanizmlariga ega bo'lib, ular overdrawni qisman kompensatsiya qiladi. Biroq, bu optimallashtirishlar faqat ma'lum shartlarda ishlaydi va faqat apparat tezlashtirishiga tayanmaslik kerak.
Masalan, yarim shaffof elementlarni renderlashda apparat Early-Z samarasiz va har bir piksel to'liq qayta ishlanadi — bunday stsenariylarda overdraw 5x va undan ko'proqqa yetishi mumkin.
Ko'p qatlamli fonlar — mobil ilovalarda overdrawning asosiy sabablaridan biridir. Activity yoki ViewController fon rangini o'rnatganda, har bir ichma-ich View o'z fonini qo'shishi mumkin va piksel ierarxiyaning har bir darajasida qayta chiziladi.
Uber Engineering tadqiqoti shuni ko'rsatdiki, Android ilovasida ortiqcha fonlarni olib tashlash overdrawni 32%, ekran renderlash vaqtini esa 25% kamaytirgan. iOS da ham xuddi shunday holat: shaffof bo'lmagan Viewlar uchun opaque = true o'rnatish alfa aralashtirishni yo'q qiladi va piksellarning takroriy yozilishining oldini oladi.
iOS platformasida overdraw tez-tez shaffof UIStackView, shouldRasterize bilan CALayer va ustma-ust tushadigan UIBlurEffect ishlatilishi sababli yuzaga keladi. Apple XCode da Core Animation vositasi orqali overdrawni tekshirishni tavsiya qiladi — u qayta chizish zonalarini qizil rangli qoplama shaklida ko'rsatadi.
Debug GPU Overdraw — Androidning o'rnatilgan vositasi bo'lib, overdraw ko'pligiga qarab ekranni turli ranglarga bo'yaydi. Binafsha rang 1x, ko'k — 2x, yashil — 3x, pushti — 4x, qizil — 5x va undan ko'pni anglatadi. Ideal ekran asosan binafsha bo'lishi kerak.
iOS da shunga o'xshash diagnostikani XCode Instruments tarkibidagi Core Animation vositasi amalga oshiradi. U qayta chizish zonalarini vizuallashtiradi va Color Blended Layers rejimida piksel boshiga yozishlarning aniq sonini ko'rsatadi. Yashil qatlamlar — shaffof emas (optimal), qizil — shaffoflikni o'z ichiga oladi va overdrawga sabab bo'ladi.
Diagnostikadan so'ng optimallashtirishdan oldin va keyin FPSni o'lchash muhimdir. Overdrawni tuzatishda 10–15 FPS farqi ro'yxatlar va animatsiyaga ega murakkab ekran uchun oddiy natijadir.
Ortiqcha fonlarni olib tashlash — eng oddiy va samarali usul. Android da android:windowBackground ni faqat Activity yoki tema uchun o'rnatish kifoya, har bir View uchun emas. iOS da barcha shaffof bo'lmagan UIView lar uchun opaque = true bu elementlar uchun overdrawni amalda nolga tushiradi.
Google I/O 2019 ma'lumotiga ko'ra, Google Maps da overdraw optimallashtirish qatlamlarni birlashtirish va chizish maydonini cheklash uchun ClipRect ishlatish hisobiga kadr renderlash vaqtini 40% ga kamaytirishga imkon berdi. Google Android dasturchilariga quyidagi amaliyotlarni tavsiya qiladi:
iOS da optimallashtirish CALayer konfiguratsiyasi orqali erishiladi: masksToBounds = true o'rnatish qatlam chegaralaridan tashqaridagi tarkibni kesadi, shouldRasterize esa statik qatlamlar uchun raster tasvirni keshlashni faollashtiradi.
Kotlin va Swift da overdrawni bartaraf etishning odatiy stsenariylarini ko'rsatadigan amaliy misollarni ko'rib chiqamiz. Birinchi misol Android da ClipRect orqali optimallashtirishni ko'rsatadi:
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()
)
// Tarkibni faqat kesilgan maydonda chizing
super.onDraw(canvas)
}
}
Ikkinchi misol — Swift da, element yarim shaffof bo'lmasligi kerak bo'lsa, qatlam uchun shaffoflikni o'chirishni ko'rsatadi:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
Uchinchi misol — Android da xaritaning kechiktirilgan yuklanishi uchun ViewStub dan foydalanish. ViewStub ko'rinadigan bo'lmaguncha renderlanmaydi, bu esa ekran ishga tushirish bosqichida overdrawni bartaraf etadi:
<!-- 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" />
// Talab bo'yicha kengaytirish
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Tez-tez so'raladigan savollar
Overdraw — ekrandagi piksel bir kadr davomida bir necha marta qayta chiziladigan holat. Tasavvur qiling, siz qog'oz varag'ini bo'yayapsiz va uning ustiga rasmlari bo'lgan bir nechta shaffof plyonkalarni yopishtiryapsiz — pastki qatlamlar yuqori qatlam har safar o'zgarganda qayta chizilishi kerak.
Dasturchi sozlamalarida Debug GPU Overdraw ni yoqing. Overdraw 1x bo'lgan elementlar binafsha, 2x — ko'k, 3x — yashil, 4x — pushti, 5x+ — qizil rangga bo'yaladi. Optimal ekran — asosan qizil zonalarsiz binafsha.
Har bir qo'shimcha piksel qayta chizish rang, tekstura va yoritishni qayta ishlaydigan fragment shader chaqiruvini talab qiladi. 60 FPS da kadrga 16.6 ms ajratiladi — agar overdraw GPU ni 2–3 baravar ko'p pikselni qayta ishlashga majburlasa, limit oshib ketadi va FPS 30 ga tushadi.
Ha, to'g'ridan-to'g'ri. Ortiqcha ish bajaradigan GPU ko'proq energiya sarflaydi. Google tadqiqotiga ko'ra, overdrawni 4x dan 1x ga kamaytirish GPU energiya sarfini 35–50% ga kamaytiradi, bu ayniqsa yuqori aniqlikdagi ekranli qurilmalarda seziladi.
Oddiy ekranlar uchun — 1x–1.5x (oz miqdordagi ko'k bilan binafsha). Boy interfeyslar uchun — 2x gacha. 3x va undan yuqori daraja (pushti, qizil) optimallashtirishni talab qiladi. Google ekran bo'yicha o'rtacha overdraw 2.5x dan oshmaslikni tavsiya qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.