Overdraw — är överdriven omritning av samma pixlar flera gånger inom en bildruta. När ett komplext gränssnitt med många överlappande element visas på skärmen tvingas GPU:n att bearbeta varje pixel upprepade gånger, vilket direkt påverkar bildfrekvensen och energiförbrukningen. Enligt Google Android Developer Documentation, 2025 kan en minskning av overdraw med 50% öka renderingsprestandan med upp till 30%. Overdraw-optimering är ett obligatoriskt steg vid utveckling av appar med smidiga animationer och responsiva gränssnitt.
Huvudpunkter
Overdraw — är situationen där samma skärmpixel ritas om flera gånger under en renderingsbildruta. I det ideala scenariot bör varje pixel skrivas exakt en gång, men i verkliga gränssnitt på grund av kapslade vyer, bakgrundsbilder och transparenta lager utför GPU:n upprepade skrivningar.
Varje extra omritning ökar renderingstiden för bildrutan. Vid standardfrekvensen 60 FPS är cirka 16.6 ms tilldelat för bearbetning av en bildruta. Om overdraw leder till att denna gräns överskrids sjunker bildfrekvensen till 30 FPS eller lägre, vilket märkbart försämrar gränssnittets jämnhet.
Enligt Android Performance Patterns från Google lägger en app med overdraw-koefficient 3x tre gånger så mycket tid på fragment shadern som en app med overdraw 1x. På enheter med låg GPU-prestanda leder detta till märkbara fördröjningar vid scrollning och animationer.
För mobilutvecklare är förståelse av overdraw avgörande: det är just denna faktor som oftast orsakar ryckig scrollning och låg bildfrekvens på till synes enkla skärmar med många kapslade element.
GPU-pipelinen består av flera steg: vertex shader, rastrering och fragment shader. Fragment shader — den dyraste delen eftersom den exekveras för varje pixel i varje primitiv. Vid overdraw x2 bearbetar fragment shadern dubbelt så många pixlar, vilket direkt ökar bildrutetiden.
Moderna mobila GPU:er som Qualcomm Adreno och Apple GPU har mekanismer för Early-Z Test och Hidden Surface Removal som delvis kompenserar overdraw. Dessa optimeringar fungerar dock bara under vissa förhållanden och man bör inte förlita sig enbart på hårdvaruacceleration.
Vid rendering av halvgenomskinliga element är hårdvaru-Early-Z till exempel ineffektiv och varje pixel bearbetas fullständigt — overdraw i sådana scenarier kan nå 5x och mer.
Flerskiktiga bakgrunder — en av huvudorsakerna till overdraw i mobilappar. När en Activity eller ViewController ställer in en bakgrundsfärg kan varje kapslad vy lägga till sin egen bakgrund och pixeln ritas om på varje nivå i hierarkin.
Forskning från Uber Engineering visade att borttagning av överflödiga bakgrunder i deras Android-app minskade overdraw med 32% och skärmrenderingstiden med 25%. Liknande situation i iOS: att ställa in opaque = true för ogenomskinliga vyer eliminerar alfa-blandning och förhindrar flerfaldig skrivning av pixlar.
På iOS-plattformen uppstår overdraw ofta på grund av användning av transparenta UIStackView, CALayer med shouldRasterize och överlappande UIBlurEffect. Apple rekommenderar att kontrollera overdraw via Core Animation-verktyget i XCode — det visar omritningszoner som en röd överlagring.
Debug GPU Overdraw — det inbyggda Android-verktyget som färgar skärmen i olika färger beroende på overdraw-multipliciteten. Lila färg betyder 1x, blå — 2x, grön — 3x, rosa — 4x, röd — 5x och mer. Den ideala skärmen bör vara övervägande lila.
I iOS utförs liknande diagnostik av Core Animation-verktyget i XCode Instruments. Det visualiserar omritningszoner och visar det exakta antalet skrivningar per pixel i Color Blended Layers-läget. Gröna lager — ogenomskinliga (optimala), röda — innehåller transparens och orsakar overdraw.
Efter diagnos är det viktigt att mäta FPS före och efter optimering. En skillnad på 10–15 FPS vid korrigering av overdraw är ett normalt resultat för en komplex skärm med listor och animationer.
Ta bort överflödiga bakgrunder — den enklaste och mest effektiva metoden. I Android räcker det att ställa in android:windowBackground endast för Activity eller temat, inte för varje vy. I iOS minskar opaque = true för alla ogenomskinliga UIView overdraw till nästan noll för dessa element.
Enligt Google I/O 2019 möjliggjorde overdraw-optimering i Google Maps en minskning av bildrutans renderingstid med 40% genom att kombinera lager och använda ClipRect för att begränsa ritområdet. Google rekommenderar följande praxis för Android-utvecklare:
I iOS uppnås optimering genom CALayer-konfiguration: att ställa in masksToBounds = true beskär innehåll utanför lagrets gränser, och shouldRasterize aktiverar cachning av rasterrepresentationen för statiska lager.
Låt oss titta på praktiska exempel i Kotlin och Swift som demonstrerar typiska scenarier för borttagning av overdraw. Det första exemplet visar optimering genom ClipRect i Android:
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()
)
// Rita innehåll endast inom beskuret område
super.onDraw(canvas)
}
}
Det andra exemplet — i Swift, visar avaktivering av transparens för lagret om elementet inte ska vara halvgenomskinligt:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
Det tredje exemplet — användning av ViewStub för fördröjd laddning av karta i Android. ViewStub renderas inte förrän det blir synligt, vilket eliminerar overdraw i initialiseringsfasen av skärmen:
<!-- 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" />
// Expandera på begäran
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Vanliga frågor
Overdraw — är när en pixel på skärmen ritas om flera gånger i en bildruta. Föreställ dig att du målar ett pappersark och klistrar på flera transparenta filmer med ritningar — de nedre lagren måste ritas om varje gång det övre lagret ändras.
Aktivera Debug GPU Overdraw i utvecklarinställningarna. Element med overdraw 1x färgas lila, 2x — blå, 3x — grön, 4x — rosa, 5x+ — röd. Optimal skärm — övervägande lila utan röda zoner.
Varje extra pixelomritning kräver ett anrop till fragment shadern, som bearbetar färg, textur och belysning. Vid 60 FPS är 16.6 ms tilldelat per bildruta — om overdraw tvingar GPU:n att bearbeta 2–3 gånger fler pixlar överskrids gränsen och FPS sjunker till 30.
Ja, direkt. En GPU som utför överflödigt arbete förbrukar mer energi. Enligt Google-forskning minskar en minskning av overdraw från 4x till 1x GPU:ns energiförbrukning med 35–50%, vilket är särskilt märkbart på enheter med högupplösta skärmar.
För enkla skärmar — 1x–1.5x (lila med en liten mängd blått). För rika gränssnitt — upp till 2x. Nivå 3x och högre (rosa, röd) kräver optimering. Google rekommenderar att inte överskrida overdraw 2.5x i genomsnitt per skärm.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också