Un état de l'art des émulateurs en Silverlight
Après plusieurs années passées à réaliser des projets et écrire des émulateurs avec le langage Java, je suis passé sur Silverlight. Les performances entre Java et C#/.NET ne sont pas comparables mais expliquent pourquoi j'ai fini par abandonner le premier.
Développer un émulateur de console de jeux, d'ordinateur ou de machine arcade requiert deux fonctionnalités essentielles : un affichage bitmap rapide et une gestion sonore dynamique.
Premier hic, Silverlight 2 ne permet ni l'un ni l'autre. Bien entendu, il y a toujours des solutions de contournement.
Pour l'affichage, certains ont utilisé des rectangles pour représenter les pixels de l'écran. D'autres ont expérimenté de l'encodage en temps réel d'images PNG. J'ai moi-même utilisé le PNG wrapper que j'ai développé à l'origine pour Quake en Silverlight afin obtenir les meilleurs performances possibles.
Pour la gestion sonore, cela se complique aussi. On peut déjà oublier un éventuel encodage MP3 ou WMA en temps réel. Il n'y pas le choix ici, il faut pré-enregistrer les sons et musiques à émuler au format MP3 ou WMA. En fonction de la machine que l'on cherche à virtualiser, cela peut devenir assez complexe. En effet, il faut pouvoir associer un fichier déjà pré-enregistré à un évènement du CPU, du chipset sonore, etc.
Silverlight 3 change la donne puisqu'il offre de nouveaux espoirs aux développeurs. En terme d'affichage, avec l'API WriteableBitmap et l'accélération matérielle GPU, des performances accrues. Avec le RAW pipeline, la possibilité de gérer de nouveaux formats vidéo ou audio, et aussi de pouvoir faire sa propre génération sonore.
Ceci dit, il reste encore un point important qui n'a pas encore été traité. Ecrire un émulateur, c'est d'abord reproduire logiciellement le fonctionnement d'un processeur qui peut parfois être complexe. En général, on développe un interpréteur des opcodes de ce CPU. Pour émuler un Z80, cela peut paraître suffisant. Mais pour émuler disons un processeur R4000, il faut envisager d'autres techniques comme la recompilation dynamique de code.
En Java, on compile le code émulé en bytecode Java qui sera lui-même exécuté par le Class Loader. En C#, on peut imaginer de générer du code MSIL dynamiquement et le faire exécuter dans l'assembly. Mais avec Silverlight, on est dans une sandbox qui ne permettra pas ce genre de manipulations. Alors, possible ou pas ?
En conclusion, voici un petit état de l'art des émulateurs en Silverlight 2 et 3 :
http://www.nokola.com/chipgr8/
Un émulateur Chip8 développé par Nokola.

http://www.voxpeeps.com/silverlightspectrumemulator/
Un émulateur ZX Spectrum développé par Chris Hay.

http://hrup.dk/blogstuff/neslight2/neslight.html
Un émulateur Nintendo Entertainment System (NES) développé par Søren Alsbjerg Hørup.

http://www.benryves.com/bin/cogwheel/web/cogwheel.php
Un émulateur Sega Master System (SMS) développé par Ben Ryves.

http://silverlightc64.codeplex.com/
Un émulateur Commodore 64 (C64) développé par Pete Brown.

http://chenwes.myweb.hinet.net/silpc/
Un émulateur PC/Ms-Dos développé par Chen Wes.
Et je termine bien sûr avec mes propres projets 

http://www.innoveware.com/
Un émulateur arcade développé par Julien Frelat.

http://www.innoveware.com/
Un émulateur PC/Ms-Dos développé par Julien Frelat.
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 :