Overdraw — je nadměrné překreslování stejných pixelů několikrát v jednom snímku. Když se na obrazovce zobrazuje složité rozhraní s mnoha překrývajícími se prvky, GPU je nucen opakovaně zpracovávat každý pixel, což přímo ovlivňuje snímkovou frekvenci a spotřebu energie. Podle Google Android Developer Documentation, 2025 může snížení overdraw o 50% zvýšit výkon vykreslování až o 30%. Optimalizace overdraw — povinná fáze při vývoji aplikací s plynulými animacemi a responzivním rozhraním.
Hlavní body
Overdraw — je situace, kdy je stejný pixel obrazovky překreslován několikrát během jednoho vykreslovacího snímku. V ideálním scénáři by měl být každý pixel zapsán přesně jednou, ale v reálných rozhraních kvůli vnořeným View, obrázkům na pozadí a průhledným vrstvám GPU provádí opakované zápisy.
Každé další překreslení zvyšuje čas vykreslení snímku. Při standardní frekvenci 60 FPS je na zpracování jednoho snímku vyhrazeno přibližně 16.6 ms. Pokud overdraw způsobí překročení tohoto limitu, snímková frekvence klesne na 30 FPS nebo níže, což znatelně zhoršuje plynulost rozhraní.
Podle Android Performance Patterns od Google, aplikace s koeficientem overdraw 3x tráví třikrát více času na fragment shaderu než aplikace s overdraw 1x. Na zařízeních s nízkým výkonem GPU to vede k znatelným lagům při rolování a animacích.
Pro mobilní vývojáře je pochopení overdraw kriticky důležité: právě tento faktor nejčastěji způsobuje trhavé rolování a nízkou snímkovou frekvenci na zdánlivě jednoduchých obrazovkách s velkým počtem vnořených prvků.
Potrubí GPU se skládá z několika fází: vertex shader, rasterizace a fragment shader. Fragment shader — nejnákladnější část, protože se provádí pro každý pixel každého primitiva. Při overdraw x2 fragment shader zpracovává dvakrát více pixelů, což přímo zvyšuje čas snímku.
Moderní mobilní GPU, jako Qualcomm Adreno a Apple GPU, mají mechanismy Early-Z Test a Hidden Surface Removal, které částečně kompenzují overdraw. Tyto optimalizace však fungují pouze za určitých podmínek a neměli byste se spoléhat výhradně na hardwarovou akceleraci.
Například při vykreslování poloprůhledných prvků je hardwarový Early-Z neúčinný a každý pixel je zpracován zcela — overdraw v takových scénářích může dosáhnout 5x a více.
Vícevrstvá pozadí — jedna z hlavních příčin overdraw v mobilních aplikacích. Když Activity nebo ViewController nastaví barvu pozadí, každé vnořené View může přidat vlastní pozadí a pixel je překreslován na každé úrovni hierarchie.
Výzkum Uber Engineering ukázal, že odstranění nadbytečných pozadí v jejich Android aplikaci snížilo overdraw o 32% a čas vykreslení obrazovky — o 25%. Podobná situace v iOS: nastavení opaque = true pro neprůhledná View eliminuje alfa míchání a zabraňuje vícenásobnému zápisu pixelů.
Na platformě iOS overdraw často vzniká kvůli použití průhledných UIStackView, CALayer s shouldRasterize a překrývajících se UIBlurEffect. Apple doporučuje kontrolovat overdraw pomocí nástroje Core Animation v XCode — zobrazuje zóny překreslení jako červený překryv.
Debug GPU Overdraw — vestavěný nástroj Androidu, který barví obrazovku do různých barev v závislosti na násobnosti overdraw. Fialová barva znamená 1x, modrá — 2x, zelená — 3x, růžová — 4x, červená — 5x a více. Ideální obrazovka by měla být převážně fialová.
V iOS provádí podobnou diagnostiku nástroj Core Animation v rámci XCode Instruments. Vizualizuje zóny překreslení a ukazuje přesný počet zápisů na pixel v režimu Color Blended Layers. Zelené vrstvy — neprůhledné (optimální), červené — obsahují průhlednost a způsobují overdraw.
Po diagnostice je důležité změřit FPS před a po optimalizaci. Rozdíl 10–15 FPS při opravě overdraw je normální výsledek pro složitou obrazovku se seznamy a animacemi.
Odstranění nadbytečných pozadí — nejjednodušší a nejúčinnější metoda. V Androidu stačí nastavit android:windowBackground pouze pro Activity nebo téma, ne pro každé View. V iOS opaque = true pro všechna neprůhledná UIView snižuje overdraw prakticky na nulu pro tyto prvky.
Podle Google I/O 2019 umožnila optimalizace overdraw v Google Maps snížit čas vykreslení snímku o 40% díky sloučení vrstev a použití ClipRect pro omezení oblasti kreslení. Google doporučuje vývojářům Androidu následující postupy:
V iOS je optimalizace dosažena konfigurací CALayer: nastavení masksToBounds = true ořezává obsah mimo hranice vrstvy a shouldRasterize zapíná ukládání rastrové reprezentace do mezipaměti pro statické vrstvy.
Podívejme se na praktické příklady v Kotlin a Swift, které demonstrují typické scénáře odstranění overdraw. První příklad ukazuje optimalizaci pomocí ClipRect v Androidu:
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()
)
// Kreslit obsah pouze v oříznuté oblasti
super.onDraw(canvas)
}
}
Druhý příklad — ve Swift, ukazuje vypnutí průhlednosti pro vrstvu, pokud prvek nemá být poloprůhledný:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
Třetí příklad — použití ViewStub pro odložené načtení mapy v Androidu. ViewStub se nevykresluje, dokud se nestane viditelným, což eliminuje overdraw ve fázi inicializace obrazovky:
<!-- 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" />
// Rozbalit na požádání
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Často kladené otázky
Overdraw — je když se pixel na obrazovce překresluje několikrát v jednom snímku. Představte si, že malujete list papíru a na něj lepíte několik průhledných fólií s obrázky — spodní vrstvy se musí překreslovat pokaždé, když se horní vrstva změní.
Zapněte Debug GPU Overdraw v nastavení pro vývojáře. Prvky s overdraw 1x jsou zbarveny fialově, 2x — modře, 3x — zeleně, 4x — růžově, 5x+ — červeně. Optimální obrazovka — převážně fialová bez červených zón.
Každé další překreslení pixelu vyžaduje volání fragment shaderu, který zpracovává barvu, texturu a osvětlení. Při 60 FPS je na snímek vyhrazeno 16.6 ms — pokud overdraw nutí GPU zpracovávat 2–3krát více pixelů, limit je překročen a FPS klesne na 30.
Ano, přímo. GPU vykonávající nadměrnou práci spotřebovává více energie. Podle výzkumu Google snižuje snížení overdraw ze 4x na 1x spotřebu energie GPU o 35–50%, což je zvláště patrné na zařízeních s displeji s vysokým rozlišením.
Pro jednoduché obrazovky — 1x–1.5x (fialová s malým množstvím modré). Pro bohatá rozhraní — do 2x. Úroveň 3x a vyšší (růžová, červená) vyžaduje optimalizaci. Google doporučuje nepřekračovat v průměru overdraw 2.5x na obrazovku.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také