fr en

Session sur l'optimisation des performances Windows Phone 7

2011-02-12 3 Min. lecture .NET Silverlight Windows Phone 7 Aymeric

Voici mes notes sur la session de Luc Vo Van (Microsoft) et Simon Ferquel (Access IT) sur la performance et l’optimisation des applications Windows Phone 7 donnée aux techdays 2011. En attendant d’avoir la présentation Powerpoint ainsi que le webcast, voici ce que j’ai retenu de cette conférence très intéressante.

Les différents threads

Une application Windows Phone 7 dispose de 2 threads :

  • le thread UI (CPU) qui s’occupe du code créé par l’utilisateur, des événements, des converters, etc…
  • le thread de composition (GPU) qui s’occupe lui des animations simples, du clipping rectangulaire, de l’opacité, des render transform et perspective transform.

Le but étant de décharger au maximum le thread UI pour garder une application fluide et agréable à utiliser.

Le piège de l’émulateur

Lorsque vous testez vos applications sur votre PC grâce à l’émulateur fourni par Microsoft, il faut savoir que plusieurs choses :

  • l’émulateur émule un processeur x86 et non un processeur ARM comme sur les téléphones WP7. Certaines choses diffèrent comme la gestion des doubles.
  • même si vous disposez d’un Core 2 Duo, l’émulateur n’utilisera qu’un seul coeur.
  • le GPU utilisé dans l’émulateur est celui de votre PC (qui est bien plus puissant que celui de votre téléphone).

N’oubliez donc pas de tester régulièrement votre application sur votre téléphone.

Les indicateurs de performances

Dans le constructeur de la classe App de votre application (App.xaml.cs), vous pouvez dé-commenter certaines lignes afin d’activer les outils d’analyse de performances.

// Display the current frame rate counters
Application.Current.Host.Settings.EnableFrameRateCounter = true;

// Show the areas of the app that are being redrawn in each frame.
Application.Current.Host.Settings.EnableRedrawRegions = true;

// Enable non-production analysis visualization mode,
// which shows areas of a page that are being GPU accelerated with a colored overlay.
Application.Current.Host.Settings.EnableCacheVisualization = true;
  • EnableFrameCounter est activé par défaut et affiche des petits compteurs sur la droite de l’application (cf capture ci-dessous).

EnableFrameCounter

  1. Thread de composition (bonne valeur : environ 60)
  2. Thread UI (si la valeur est faible, la réaction de l’UI est moins bonne)
  3. Textures (mémoire utilisée par les texture)
  4. # surface
  5. # IRT
  6. Fill rate (représente le nombre de pixel dessinés par frame). Une valeur supérieure à 3 implique de mauvaises performances.
  • EnableRedrawRegions permet de savoir quelles zones sont redessinées à sur chaque frame.
  • EnableCacheVisualisation définit quelles zones de l’écran son rendues par le GPU.

Garbage Collector

Sur Windows Phone 7, le garbage collector est déclenché à chaque fois qu’un mégaoctet est alloué. Lorsqu’il est déclenché, le GC bloque the thread UI (et donc l’interface graphique).

Pour rendre ce processus moins visible, il est conseillé d’appeler la méthode GC.Collect() lorsque l’utilisateur change de page ou déclenche un évènement. Si c’est à l’initiative de l’utilisateur, il s’attend à avoir un temps de chargement et ,ne sera donc pas surpris.

Pour éviter d’instancier un nombre conséquent d’objets, il est préférable d’éviter au maximum l’utilisation de Linq et des foreach.

Il est possible de connaître la quantité de mémoire utilisée par l’application :

DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")

ainsi que la quantité maximale de mémoire que l’application a utilisé

DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage")

Astuces

Voici quelques astuces fournies par les 2 intervenants :

  • ne pas utiliser de clipping rond (celui-ci est géré par le CPU et non par le GPU comme pour le clipping rectangulaire).
  • utiliser des JPEG plutôt que des PNG (le décodage des PNG se fait au niveau logiciel alors que celui des JPEG se fait au niveau matériel).
  • préférer le contrôle Pivot au contrôle Panorama car celui-ci est virtualisé et ne charge que les pages précédentes courantes et suivantes contrairement au Panorama qui charge toutes les pages.
  • dans le cas d’un Panorama, mettez les éléments de toutes les pages (sauf la page courante) en collapsed.
  • pour faire passer un élément du blanc au gris, utilisez la propriété Opacity (gérée par le GPU).