Résumé de la session sur l'optimisation des performances Windows Phone 7 aux TechDays 2011

Aymeric Lagier

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. Commentez ♪

- Titre : Résumé de la session sur l'optimisation des performances Windows Phone 7 aux TechDays 2011

- Auteur : Aymeric Lagier

- Parution : 13 février 2011

- Licence : Copyright ® 2011 Aymeric Lagier. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Les différents threads

- 2. Le piège de l'émulateur

- 3. Les indicateurs de performances

- 4. Garbage Collector

- 5. Astuces

- 6. Remerciements

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.

// 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).

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 :

DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")

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

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 à ClaudeLELOUP pour les corrections.