Overdraw dans les applications mobiles : ce que c'est, causes et optimisation

Auteur : IT Sectr Publié le : 2026-06-12 Temps de lecture : 10 min

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 un phénomène où un pixel est pixellisé plus d'une fois par image, créant une charge excessive sur le GPU.
  • GPU passe jusqu'à 40% de son temps à redessiner des pixels cachés si la scène contient des éléments complètement superposés.
  • Debug GPU Overdraw sur Android permet de détecter visuellement les zones de redessin excessif par un code couleur.
  • ClipRect et Canvas.saveLayer sont les principaux outils pour limiter manuellement la zone de redessin sous Android.
  • ViewStub et le chargement différé des composants réduisent l'overdraw grâce à l'initialisation retardée des éléments d'interface invisibles.

Qu'est-ce que l'Overdraw dans les graphiques mobiles ?

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.

Comment l'Overdraw affecte les performances du GPU

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.

Principales causes du redessin excessif

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.

  • Superpositions transparentes — les éléments avec canal alpha au-dessus d'autres éléments provoquent toujours de l'overdraw.
  • ClipChildren=false — la désactivation du découpage des éléments enfants entraîne le rendu de zones invisibles.
  • Utiliser ShapeDrawable au lieu de couleurs simples augmente la charge sur le shader de fragments.
  • Imbrication excessive — chaque niveau de hiérarchie de vue ajoute une couche potentielle de redessin.

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.

Comment diagnostiquer l'Overdraw : outils et méthodes

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.

  • Profile GPU Rendering sous Android montre un histogramme du temps de rendu. Les barres vertes hautes indiquent des problèmes d'overdraw.
  • Renderscript est un outil plus avancé pour analyser le pipeline de rendu sur les appareils Android 10+.
  • Metal Debugger dans XCode permet d'analyser chaque passe de rendu et de voir le nombre exact d'appels au shader de fragments.

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.

Techniques d'optimisation de l'Overdraw dans les applications mobiles

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 :

  • ClipRect — limite la zone de dessin du Canvas. S'il n'y a rien en dehors de la zone visible, le GPU ne gaspille pas de ressources.
  • ViewStub — pour les éléments rarement utilisés ou invisibles au chargement initial. Le composant ne rend que lorsque inflate est appelé.
  • merge et include — réduisent la profondeur de la hiérarchie des vues, ce qui diminue le nombre de passes de rendu.
  • Tampons plats — remplacer les mises en page imbriquées par un seul ConstraintLayout ou RelativeLayout.

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.

Exemples de code : élimination de l'Overdraw sous Android et iOS

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 :

kotlin
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 :

swift
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 :

xml
<!-- 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

Qu'est-ce que l'Overdraw en termes simples ?

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.

Comment vérifier l'Overdraw sur Android ?

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.

Pourquoi l'Overdraw réduit-il les FPS dans les applications mobiles ?

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.

L'Overdraw affecte-t-il l'autonomie de la batterie ?

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.

Quel niveau d'Overdraw est considéré comme normal ?

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é

  • Overdraw est le redessin excessif de pixels, la principale cause de faibles performances du GPU dans les interfaces mobiles.
  • Principales causes : arrière-plans multicouches, superpositions transparentes, imbrication excessive des vues et absence de drapeaux opaque.
  • Le diagnostic s'effectue via Debug GPU Overdraw sur Android et l'outil Core Animation dans XCode.
  • L'optimisation comprend la suppression des arrière-plans excessifs, l'utilisation de ClipRect, ViewStub et opaque = true.
  • Réduire l'overdraw de 3x à 1x peut augmenter les FPS de 30–50% et diminuer la consommation d'énergie du GPU.
  • Sous Android, il est recommandé d'utiliser ConstraintLayout pour une hiérarchie plate au lieu de LinearLayout imbriqués.
  • Contrôlez l'overdraw à chaque étape du développement — c'est plus facile que d'optimiser après coup avant la publication.

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.

Discuter du projet

Lisez aussi