Overdraw — is het overmatig meerdere keren overtekenen van dezelfde pixels in één frame. Wanneer een complexe interface met veel overlappende elementen op het scherm wordt weergegeven, wordt de GPU gedwongen om elke pixel herhaaldelijk te verwerken, wat direct van invloed is op de framerate en het energieverbruik. Volgens Google Android Developer Documentation, 2025 kan een vermindering van overdraw met 50% de renderprestaties met wel 30% verbeteren. Overdraw-optimalisatie is een verplichte stap bij het ontwikkelen van apps met vloeiende animaties en een responsieve interface.
Belangrijkste punten
Overdraw — is de situatie waarin dezelfde schermpixel meerdere keren wordt overgetekend tijdens één renderframe. In het ideale scenario zou elke pixel precies één keer moeten worden geschreven, maar in echte interfaces voert de GPU vanwege geneste Views, achtergrondafbeeldingen en transparante lagen herhaalde schrijfbewerkingen uit.
Elke extra overtekening verhoogt de renderframetijd. Bij een standaard frequentie van 60 FPS is ongeveer 16.6 ms beschikbaar voor de verwerking van één frame. Als overdraw deze limiet overschrijdt, daalt de framerate naar 30 FPS of lager, wat de vloeiendheid van de interface merkbaar verslechtert.
Volgens Android Performance Patterns van Google besteedt een app met een overdraw-coëfficiënt van 3x drie keer zoveel tijd aan de fragmentshader als een app met overdraw 1x. Op apparaten met lage GPU-prestaties leidt dit tot merkbare haperingen tijdens scrollen en animaties.
Voor mobiele ontwikkelaars is het begrijpen van overdraw van cruciaal belang: het is deze factor die het vaakst schokkerig scrollen en lage framerates veroorzaakt op ogenschijnlijk eenvoudige schermen met veel geneste elementen.
De GPU-pijplijn bestaat uit verschillende fasen: vertex shader, rasterisatie en fragment shader. Fragment shader — het duurste onderdeel, omdat het wordt uitgevoerd voor elke pixel van elk primitief. Bij overdraw x2 verwerkt de fragment shader twee keer zoveel pixels, wat de frametijd direct verhoogt.
Moderne mobiele GPU's zoals Qualcomm Adreno en Apple GPU hebben Early-Z Test en Hidden Surface Removal mechanismen die overdraw gedeeltelijk compenseren. Deze optimalisaties werken echter alleen onder bepaalde omstandigheden en men moet niet uitsluitend op hardwareversnelling vertrouwen.
Bij het renderen van halfdoorzichtige elementen is hardwarematige Early-Z bijvoorbeeld niet effectief en wordt elke pixel volledig verwerkt — overdraw kan in dergelijke scenario's 5x en meer bereiken.
Meerlaagse achtergronden — een van de belangrijkste oorzaken van overdraw in mobiele apps. Wanneer een Activity of ViewController een achtergrondkleur instelt, kan elke geneste View een eigen achtergrond toevoegen en wordt de pixel op elk niveau van de hiërarchie overgetekend.
Onderzoek van Uber Engineering toonde aan dat het verwijderen van overbodige achtergronden in hun Android-app overdraw met 32% verminderde en de schermrendertijd met 25%. Een vergelijkbare situatie in iOS: het instellen van opaque = true voor ondoorzichtige Views elimineert alfa-menging en voorkomt meervoudig schrijven van pixels.
Op het iOS-platform ontstaat overdraw vaak door het gebruik van transparante UIStackView, CALayer met shouldRasterize en overlappende UIBlurEffect. Apple raadt aan om overdraw te controleren via het Core Animation-hulpmiddel in XCode — het toont overtekenzones als een rode overlay.
Debug GPU Overdraw — het ingebouwde Android-hulpmiddel dat het scherm in verschillende kleuren kleurt afhankelijk van de overdraw-multipliciteit. Paars betekent 1x, blauw — 2x, groen — 3x, roze — 4x, rood — 5x en meer. Het ideale scherm moet overwegend paars zijn.
In iOS wordt een vergelijkbare diagnose uitgevoerd door het Core Animation-hulpmiddel in XCode Instruments. Het visualiseert overtekenzones en toont het exacte aantal schrijfbewerkingen per pixel in de Color Blended Layers-modus. Groene lagen — ondoorzichtig (optimaal), rode — bevatten transparantie en veroorzaken overdraw.
Na diagnose is het belangrijk om de FPS voor en na optimalisatie te meten. Een verschil van 10–15 FPS bij het corrigeren van overdraw is een normaal resultaat voor een complex scherm met lijsten en animaties.
Overbodige achtergronden verwijderen — de eenvoudigste en meest effectieve methode. In Android volstaat het om android:windowBackground alleen voor de Activity of thema in te stellen, niet voor elke View. In iOS vermindert opaque = true voor alle ondoorzichtige UIView overdraw voor deze elementen tot vrijwel nul.
Volgens Google I/O 2019 maakte overdraw-optimalisatie in Google Maps het mogelijk om de renderframetijd met 40% te verminderen door lagen te combineren en ClipRect te gebruiken om het tekengebied te beperken. Google beveelt Android-ontwikkelaars de volgende praktijken aan:
In iOS wordt optimalisatie bereikt via CALayer-configuratie: het instellen van masksToBounds = true snijdt inhoud buiten de laaggrenzen af, en shouldRasterize schakelt het cachen van de rasterweergave in voor statische lagen.
Laten we praktische voorbeelden in Kotlin en Swift bekijken die typische scenario's voor het verwijderen van overdraw demonstreren. Het eerste voorbeeld toont optimalisatie via ClipRect in 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()
)
// Teken inhoud alleen binnen het bijgesneden gebied
super.onDraw(canvas)
}
}
Het tweede voorbeeld — in Swift, toont het uitschakelen van transparantie voor een laag als het element niet halfdoorzichtig mag zijn:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
Het derde voorbeeld — het gebruik van ViewStub voor het uitgesteld laden van een kaart in Android. ViewStub wordt pas gerenderd wanneer het zichtbaar wordt, wat overdraw elimineert in de initialisatiefase van het scherm:
<!-- 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" />
// Op aanvraag uitvouwen
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Veelgestelde vragen
Overdraw — is wanneer een pixel op het scherm meerdere keren wordt overgetekend in één frame. Stel je voor dat je een vel papier schildert en er meerdere transparante folies met tekeningen op plakt — de onderste lagen moeten elke keer opnieuw worden getekend wanneer de bovenste laag verandert.
Schakel Debug GPU Overdraw in in de ontwikkelaarsinstellingen. Elementen met overdraw 1x worden paars gekleurd, 2x — blauw, 3x — groen, 4x — roze, 5x+ — rood. Het optimale scherm is overwegend paars zonder rode zones.
Elke extra pixelovertekening vereist een aanroep van de fragment shader, die kleur, textuur en belichting verwerkt. Bij 60 FPS is er 16.6 ms per frame — als overdraw de GPU dwingt om 2–3 keer meer pixels te verwerken, wordt de limiet overschreden en daalt de FPS naar 30.
Ja, direct. Een GPU die overbodig werk verricht, verbruikt meer energie. Volgens Google-onderzoek vermindert het verlagen van overdraw van 4x naar 1x het GPU-energieverbruik met 35–50%, wat vooral merkbaar is op apparaten met schermen met een hoge resolutie.
Voor eenvoudige schermen — 1x–1.5x (paars met een beetje blauw). Voor rijke interfaces — tot 2x. Niveau 3x en hoger (roze, rood) vereist optimalisatie. Google raadt aan om gemiddeld niet meer dan overdraw 2.5x per scherm te overschrijden.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook