Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Silverlight Underground

Retrogaming, Casual Games, Emulation with Silverlight
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 :

Emulateur Chip8 en Silverlight
http://www.nokola.com/chipgr8/
Un émulateur Chip8 développé par Nokola.

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

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

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

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

Emulateur PC en Silverlight
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 Big Smile

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

Emulateur PC en Silverlight
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 :

Commentaires

InnoveWare a dit :

Si vous connaissez d'autres émulateurs en Silverlight que je n'aurai pas cité, n'hésitez pas à me le signaler.

# avril 17, 2009 10:45

Jb Evain a dit :

«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 ?»

On peut toujours utiliser System.Reflection.Emit avec en particulier les DynamicMethod. Par contre le modèle de sécurité de CoreCLR implique plus de contraintes, mais c'est toujours possible.

# avril 17, 2009 20:17

InnoveWare a dit :

En fait, j'ai déjà testé l'appel à des DynamicMethod en émettant du code MSIL. Cela fonctionne très bien pour du code simple (lecture de registres, lecture mémoire) ou des calculs (addition, multiplication). Le problème se pose au niveau sécurité. C'est à dire qu'avec Silverlight, la méthode dynamique génère une SecurityAccessException dès qu'on veut écrire ou modifier une variable ou une instance externe à la méthode.

La solution serait de générer une assembly complète mais je vois mal générer tout le code d'un émulateur comme cela.

# avril 18, 2009 09:37

Jb Evain a dit :

Il y a des solutions à ça aussi. Tu peux utiliser System.Linq.Expressions pour générer des DynamicMethod qui ont le droit de regarder des membres et méthodes privées (mais seulement dans tes assemblies). Mais du coup tu es limité à ce que tu peux exprimer par un expression tree.

# avril 18, 2009 10:51

InnoveWare a dit :

J'ai jeté un oeil en effet ça a l'air intéressant. Quid des performances pour générer du code avec des expressions ?

# avril 20, 2009 23:12

Jb Evain a dit :

L'overhead est très léger. Tu créer un graphe d'objet avec les factory methods de la classe System.Linq.Expressions.Expression, et tu appelles Compile sur la lambda. Ça génère une DynamicMethod, l'avantage, c'est qu'elle est construite avec l'argument qui permet au JIT de ne pas vérifier les contraintes de visibilité. Tu restes limité par CoreCLR cependant, donc tu ne peux pas accéder à des membres privés en dehors de tes assemblies à toi.

# avril 24, 2009 10:21
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le il y a 1 heure et 49 minutes

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le il y a 1 heure et 55 minutes

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le il y a 2 heures et 31 minutes

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30

- [TFS2010] A la recherche du Shelveset perdu par Blog de Jérémy Jeanson le 05-03-2013, 21:46

- .NET / Debug post-mortem : obtenir le fichier mscordacwks.dll correspondant à un dump quand on n'a plus d'accès direct à ce fichier par CoqBlog le 04-28-2013, 19:57