1. Les différents threads

Une application Windows Phone 7 dispose de deux 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.

2. Le piège de l'émulateur

Lorsque vous testez vos applications sur votre PC grâce à l'émulateur fourni par Microsoft, il faut savoir 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.

3. 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.

 
Sélectionnez
// 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).

Compteurs de performance WP7 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 textures)
4) # surface
5) # IRT
6) Fill rate (représente le nombre de pixels 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 sont rendues par le GPU.

4. 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 le 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 important d'objets, il est préférable d'éviter au maximum l'utilisation de Linq et foreach.

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

 
Sélectionnez
DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")

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

 
Sélectionnez
DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage")

5. Astuces

Voici quelques astuces fournies par les deux 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).

6. Remerciements

Merci à ClaudeLELOUPClaudeLELOUP pour les corrections.