Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Silverlight Underground

Retrogaming, Casual Games, Emulation with Silverlight
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 :
Posted: mercredi 18 mars 2009 22:48 par InnoveWare

Commentaires

KooKiz a dit :

J'ai regardé rapidement mais je n'ai pas trouvé de moyen direct pour générer un stream à partir du WriteableBitmap (pour générer une image au format bmp).

Je vais creuser ça, mais si tu as déjà ta petite idée sur le sujet, n'hésite pas :p

# mars 19, 2009 09:58

InnoveWare a dit :

Il y a deux utilisations possibles de WriteableBitmap, l'une c'est de pouvoir lire et écrire du contenu dans une image.

L'autre c'est d'effectuer le rendu des contrôles Silverlight de ton application dans une image bitmap. Il faut utiliser pour cela la méthode Render(element, transformation_optionnelle).

Si j'ai bien compris tu veux en fait lire le contenu de ton WriteableBitmap pour le sauver sur disque en bmp (avec le nouveau SaveAsFileDialog par exemple). A priori, il suffit de relire les pixels de ton WriteableBitmap.

int color = surface[width * y + x];

Le seul problème possible ici est lié à la sécurité. Cela devrait en théorie fonctionner pour les images que tu as crée sur tes propres contrôles. Par contre, dans le cas d'une image que tu aurais repris d'un contenu externe (cross-domain), tu auras une erreur de sécurité.

Maintenant Silverlight 3 est en beta donc peut être ça ne marche pas du tout et ce dans tous les cas (cross-domain ou non cross-domain). Regarde si tu reçois une color ou bien la valeur nulle.

# mars 21, 2009 19:46

KooKiz a dit :

Donc en gros c'est ce que je craignais : il n'y a rien de prévu pour convertir les données brutes (la couleur de chaque pixel) en un format d'image exploitable par une autre application (bmp ou png).

Enfin, le format bmp est relativement simple, ça ne devrait pas prendre trop de temps. Merci pour tes éclaircissements !

# mars 21, 2009 21:07
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 5 heures et 56 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59