Performances d'affichage de Silverlight 3
Comme vous le savez certainement, Silverlight 3 Beta est désormais téléchargeable en version de développement après l'annonce faîte au Salon MIX 09.
J'en ai profité pour faire quelques tests des nouvelles API et plus particulièrement celles concernant l'affichage bitmap et l'accélération matérielle (GPU).
Pour mon jeu de test, j'ai pris la version actuelle de mon Quake en Silverlight et une résolution basse (320x240).
Voici le résultat obtenu sans modification de code ni accélération GPU :

J'ai ensuite testé en activant l'accélération matérielle. Très simplement, il suffit d'ajouter le paramètre suivant à la page HTML.
<param name="EnableGPUAcceleration" value="true" />

Comme vous pouvez le constater, les performances sont nettement meilleures (25%) !
Concernant l'affichage bitmap de Quakelight, j'utilise actuellement une technique de PNG Wrapper (j'y reviendrai dans un prochain article). C'est à dire que je pré-encode chaque image dans un format PNG optimisé. Silverlight se charge ensuite de décoder cette image PNG pour l'afficher à l'écran. L'encodage est lui-même très performant si on le compare à d'autres techniques existantes (PNG Encoder), mais on stagne à la vitesse de Silverlight pour décoder le PNG...
Silverlight 3 propose une nouvelle API WriteableBitmap qui permet d'écrire des pixels dans une image directement. Autrement dit, ni encodage ni décodage PNG ne sont nécessaires. On devrait donc en théorie obtenir un gain de performance énorme. Allez zou on teste !
// On crée notre surface 320x240 au format Blue Green Red.
WriteableBitmap surface = new WriteableBitmap(320, 240, PixelFormats.Bgr32);
// On écrit un pixel dans le buffer (attention à l'ordre pour les couleurs)
surface.Lock();
surface[surface.PixelWidth * 160 + 120] = (RED << 16) | (GREEN << 8) | BLUE;
surface.Invalidate();
surface.Unlock();

Bon là j'avoue que j'y perds un peu mon latin. Les performances obtenues sont à vrai dire les mêmes qu'avec mon encodage/décodage en PNG d'origine. L'API est donc intéressante au niveau code mais ne permet pas de générer des images plus vite que ce que permet déjà Silverlight 2. Malheureusement, pas de Quake à 200 FPS ici...
En conclusion, je pense qu'il serait intéressant que je rende mes propres API compatibles avec Silverlight 3. Cela permettrait à tout le monde de les utiliser dans Silverlight 2 mais aussi d'offrir d'autres fonctionnalités au WriteableBitmap de Silverlight 3 (l'encodage PNG permet de supporter d'autres formats de pixel et donc par exemple des effets de palette).
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :