PlayStation 5 en C# : Comment des passionnés écrivent l'émulateur SharpEmu
Écrire un émulateur pour une console moderne est une tâche que beaucoup associent à des murs interminables de C++ pur et de magie de bas niveau. Cependant, les développeurs du projet SharpEmu ont décidé de prendre un chemin différent et ont choisi .NET. Cela semble ambitieux, étant donné que nous parlons de la PlayStation 5 — un système extrêmement complexe avec une architecture x86-64 et une API graphique spécifique.
Pourquoi un programmeur aurait-il besoin d'un autre émulateur
Si vous suivez la scène, vous avez probablement entendu parler de ShadPS4. Ce projet fait déjà de grands progrès dans l'exécution de Bloodborne et d'autres hits PS4. Les auteurs de SharpEmu ont immédiatement affiché un avertissement : ils ne cherchent pas à concurrencer ou à dupliquer le travail de quelqu'un d'autre. Leur objectif est exclusivement la PS5.
SharpEmu est un projet expérimental. Il est construit de zéro à des fins éducatives et de recherche. Les développeurs aiment simplement explorer l'architecture système et faire du reverse engineering. Pour nous, c'est une occasion rare de voir comment fonctionne une console moderne "sous le capot" en utilisant une pile technologique .NET familière.
Ce que le projet peut faire aujourd'hui
Le projet en est à un stade précoce. Ne vous attendez pas à télécharger un binaire et exécuter God of War Ragnarök en 4K. L'équipe se concentre sur l'infrastructure et la précision de l'émulation, pas sur l'exécution de jeux spécifiques.
Pourtant, il y a déjà des résultats :
- Chargement des fichiers
eboot.binet.elf. L'émulateur analyse correctement la structure des exécutables de la console. - Exécution d'instructions CPU natives.
- Lecture des métadonnées : noms de jeux, versions et autres informations de service.
- Travail avec les modules système (PRX) et support partiel des fonctions du kernel.
- Support initial du scénario PlayGo et de la sortie vidéo.
Il est intéressant de noter que certains jeux atteignent déjà le stade d'initialisation de l'AGC (moteur de shaders graphiques) et appellent sceVideoOut. Par exemple, dans Demon's Souls Remake, l'émulateur a déjà préparé des shaders que les développeurs prévoient de convertir en SPIR-V pour le rendu via Vulkan.
Pile technologique et sources d'inspiration
Choisir C# pour un tel projet est une décision intéressante. Le .NET moderne (version 8 et supérieur) offre d'excellentes performances, et travailler avec la mémoire et les structures de données est souvent plus agréable qu'en C++.
Les auteurs de SharpEmu ne cachent pas qu'ils s'appuient sur l'expérience de collègues. Plusieurs projets bien connus ont influencé leur code et leur architecture :
- Ryujinx : ils ont adopté de là les patterns pour implémenter les opérations de bas niveau en C# et la gestion du système de fichiers.
- Kyty : l'un des premiers émulateurs PS5, qui a servi de manuel sur l'exécution de code natif.
- ShadPS4 : a aidé à comprendre les principes généraux de l'architecture des consoles Sony pour les générations actuelles et précédentes.
Actuellement, la plateforme cible principale est Windows. Cela simplifie le débogage dans les premières phases. Le support pour Linux et macOS est prévu pour plus tard, une fois que la base de code sera plus stable.
Comment l'essayer
Si vous voulez regarder à l'intérieur ou même aider le projet avec du code, le construire ne sera pas difficile. Vous aurez besoin du dernier .NET SDK.
Clonez le dépôt :
git clone https://github.com/par274/sharpemu.git
Construisez le projet :
dotnet build
Pour exécuter une image de jeu via la ligne de commande, utilisez PowerShell :
.\SharpEmu "путь_к_eboot.bin" 2>&1 | Tee-Object -FilePath "log.txt"
Pour qui est ce projet
SharpEmu ne deviendra probablement pas votre client de jeu principal dans les prochaines années. Mais il est idéal pour ceux qui veulent apprendre :
- La programmation système en C#.
- Comment fonctionnent les compilateurs JIT et la traduction d'instructions.
- Le reverse engineering des plateformes fermées.
Le projet semble "propre" et académique. Il n'a pas de fichiers ou clés propriétaires ; tous les tests sont effectués sur des dumps des consoles personnelles des auteurs.
SharpEmu est un excellent exemple de la façon dont des tâches complexes comme l'émulation matérielle sont résolues en utilisant des langages de haut niveau modernes. Pour l'instant, le projet est plus une "sandbox" pour les ingénieurs. Si vous êtes intéressé par la façon dont les commandes GPU sont envoyées dans la PS5 ou comment fonctionne le planificateur de tâches dans son kernel, jetez un œil au code source. Lire du code C# est clairement plus facile que de comprendre les subtilités des templates C++.
Vous pouvez suivre les mises à jour dans leur communauté Discord, un lien vers laquelle se trouve dans le dépôt. Là, les développeurs partagent souvent les logs et les succès pour passer à l'étape suivante du chargement de jeux lourds.
Projets similaires