Overdraw est un redessin excessif des mêmes pixels plusieurs fois par image. Lorsqu'une interface complexe avec de nombreux éléments superposés est affichée à l'écran, le GPU est obligé de traiter chaque pixel à plusieurs reprises, ce qui affecte directement la fréquence d'images et la consommation d'énergie. Selon la documentation Google Android Developer, 2025, réduire l'overdraw de 50% peut augmenter les performances de rendu jusqu'à 30%. L'optimisation de l'overdraw est une étape obligatoire lors du développement d'applications avec des animations fluides et des interfaces réactives.
Points clés
Overdraw est une situation où le même pixel d'écran est redessiné plusieurs fois dans une seule image de rendu. Dans un scénario idéal, chaque pixel devrait être écrit exactement une fois, mais dans les interfaces réelles, en raison des vues imbriquées, des images d'arrière-plan et des couches transparentes, le GPU effectue des écritures répétées.
Chaque redessin supplémentaire augmente le temps de rendu de l'image. À un taux standard de 60 FPS, chaque image dispose d'environ 16,6 ms. Si l'overdraw fait dépasser cette limite, la fréquence d'images chute à 30 FPS ou moins, ce qui dégrade sensiblement la fluidité de l'interface.
Selon Android Performance Patterns de Google, une application avec un facteur d'overdraw de 3x passe trois fois plus de temps sur le shader de fragments qu'une application avec un overdraw de 1x. Sur les appareils GPU peu performants, cela entraîne des ralentissements notables lors du défilement et de l'animation.
Pour les développeurs mobiles, comprendre l'overdraw est d'une importance cruciale : ce facteur est la cause la plus fréquente de défilement saccadé et de faibles fréquences d'images sur des écrans apparemment simples avec un grand nombre d'éléments imbriqués.
Le pipeline GPU se compose de plusieurs étapes : shader de sommets, pixellisation et shader de fragments. Le shader de fragments est la partie la plus coûteuse car il s'exécute pour chaque pixel de chaque primitive. Avec un overdraw 2x, le shader de fragments traite deux fois plus de pixels, ce qui augmente directement le temps d'image.
Les GPU mobiles modernes tels que Qualcomm Adreno et Apple GPU disposent de mécanismes de test Early-Z et de suppression de surface cachée qui compensent partiellement l'overdraw. Cependant, ces optimisations ne fonctionnent que dans certaines conditions et il ne faut pas se fier uniquement à l'accélération matérielle.
Par exemple, lors du rendu d'éléments semi-transparents, l'Early-Z matériel est inefficace et chaque pixel est traité complètement — l'overdraw dans de tels scénarios peut atteindre 5x ou plus.
Les arrière-plans multicouches sont l'une des principales causes d'overdraw dans les applications mobiles. Lorsqu'une Activity ou un ViewController définit une couleur d'arrière-plan, chaque vue imbriquée peut ajouter son propre arrière-plan, et le pixel est redessiné à chaque niveau de la hiérarchie.
Une étude d'Uber Engineering a montré que la suppression des arrière-plans excessifs dans leur application Android réduisait l'overdraw de 32% et le temps de rendu de l'écran de 25%. Une situation similaire existe sous iOS : définir opaque = true pour les vues non transparentes élimine le mélange alpha et évite les écritures multiples de pixels.
Sur la plateforme iOS, l'overdraw se produit souvent en raison de l'utilisation de UIStackView transparents, de CALayer avec shouldRasterize et de UIBlurEffect superposés. Apple recommande de vérifier l'overdraw via l'outil Core Animation dans XCode — il montre les zones de redessin sous forme de superposition rouge.
Debug GPU Overdraw est un outil intégré d'Android qui colore l'écran de différentes couleurs selon le facteur d'overdraw. Le violet signifie 1x, le bleu — 2x, le vert — 3x, le rose — 4x, le rouge — 5x ou plus. Un écran idéal devrait être majoritairement violet.
Sous iOS, un diagnostic similaire est effectué par l'outil Core Animation dans XCode Instruments. Il visualise les zones de redessin et montre le nombre exact d'écritures de pixels en mode Color Blended Layers. Les couches vertes sont opaques (optimales), les rouges contiennent de la transparence et provoquent de l'overdraw.
Après le diagnostic, il est important de mesurer les FPS avant et après l'optimisation. Une différence de 10–15 FPS lors de la correction de l'overdraw est un résultat normal pour un écran complexe avec des listes et des animations.
Supprimer les arrière-plans excessifs est la méthode la plus simple et la plus efficace. Sous Android, définissez android:windowBackground uniquement pour l'Activity ou le thème, pas pour chaque vue. Sous iOS, opaque = true pour tous les UIView non transparents réduit l'overdraw à presque zéro pour ces éléments.
Selon Google I/O 2019, l'optimisation de l'overdraw dans Google Maps a permis de réduire le temps de rendu d'image de 40% grâce à la fusion de calques et à l'utilisation de ClipRect pour limiter la zone de dessin. Pour les développeurs Android, Google recommande les pratiques suivantes :
Sous iOS, l'optimisation est obtenue via la configuration de CALayer : définir masksToBounds = true coupe le contenu au-delà des limites de la couche, et shouldRasterize active la mise en cache du bitmap pour les couches statiques.
Voyons des exemples pratiques en Kotlin et Swift illustrant des scénarios typiques d'élimination de l'overdraw. Le premier exemple montre l'optimisation via ClipRect sous 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()
)
// Draw content only within clipped area
super.onDraw(canvas)
}
}
Le deuxième exemple en Swift montre comment désactiver la transparence d'un calque si l'élément ne doit pas être semi-transparent :
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
Le troisième exemple montre l'utilisation de ViewStub pour le chargement différé d'une carte sous Android. ViewStub ne rend pas jusqu'à ce qu'il devienne visible, ce qui élimine l'overdraw au stade de l'initialisation de l'écran :
<!-- 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" />
// Inflate on demand
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Foire aux questions
Overdraw est le fait qu'un pixel à l'écran soit redessiné plusieurs fois en une seule image. Imaginez que vous peignez une feuille de papier et que vous collez plusieurs films transparents avec des dessins par-dessus — les couches inférieures doivent être redessinées chaque fois que la couche supérieure change.
Activez Debug GPU Overdraw dans les paramètres développeur. Les éléments avec un overdraw 1x sont colorés en violet, 2x — en bleu, 3x — en vert, 4x — en rose, 5x+ — en rouge. Un écran optimal est majoritairement violet sans zones rouges.
Chaque redessin supplémentaire de pixel nécessite un appel au shader de fragments, qui traite la couleur, la texture et l'éclairage. À 60 FPS, chaque image dispose de 16,6 ms — si l'overdraw force le GPU à traiter 2–3 fois plus de pixels, la limite est dépassée et les FPS chutent à 30.
Oui, directement. Un GPU effectuant un travail excessif consomme plus d'énergie. Selon une étude de Google, réduire l'overdraw de 4x à 1x diminue la consommation d'énergie du GPU de 35–50%, ce qui est particulièrement notable sur les écrans haute résolution.
Pour les écrans simples — 1x–1,5x (violet avec une petite quantité de bleu). Pour les interfaces complexes — jusqu'à 2x. Les niveaux de 3x et plus (rose, rouge) nécessitent une optimisation. Google recommande de ne pas dépasser en moyenne 2,5x d'overdraw sur l'écran.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi