Contexte du port

Le projet G‑Diffuser consiste à décompiler F‑Zero X et à le transférer sur la Nintendo 3DS. La version v1.0.0 résulte de deux phases : une première de 24 jours (11 août – 3 septembre 2026) qui a produit un build natif 60 fps en 3D pour le New 3DS, puis une seconde de 43 jours (7 septembre – 19 octobre 2026) qui a ajouté la prise en charge de l’Old 3DS, un moteur de rendu natif et le kit d’extension 64 DD. Trois binaires ont été livrés depuis le même arbre source : un .cia/.3dsx pour l’Old 3DS/2DS, un pour le New 3DS/New 2DS XL et un build New 3DS incluant le kit d’extension. Tous lisent des archives d’actifs pré‑cuisinées depuis la carte SD, sans ROM ni image disque embarquée.

Architecture et optimisations

Le port s’appuie sur trois piliers : la décompilation originale (inspectredc/fzerox), la bibliothèque libultraship qui reproduit le runtime N64 (Kenix3) et le module port/3ds, qui compte 15 039 lignes de code à la fin de la première phase. Ce module intègre le backend Citro3D, la stéréoscopie, l’audio DSP, la gestion d’entrée, le cycle de vie de l’application et un thread de rendu dédié. La phase deux a introduit un rendu natif qui évite le parcours complet de la display‑list par image ; il repose sur un interpréteur propriétaire limité à une boucle par catégorie de course et dimensionné pour tenir dans le cache d’instructions de 16 KB du processeur ARM9.

Cette approche cible le goulet d’étranglement identifié par les compteurs matériels : les misses du cache d’instructions, et non le nombre d’instructions exécutées. En réduisant les accès au cache, le temps moyen d’une frame sur un Grand Prix 2D est passé à 16,5 ms, soit 60 fps. Le rendu utilise un thread sur le cœur 2, un mode « one‑frame‑ahead », et un cache de sortie de pont remplacé par une mémoïsation de la classification des sous‑display‑lists.

[perf] preset = auto

Ce paramètre active le rendu natif par défaut sur les deux consoles. Un mode explicite peut réactiver le chemin « render‑thread/per‑draw‑stereo », conservé pour les tests.

Performances et limites

Sur le New 3DS, le rendu stéréoscopique atteint une médiane de 59,6 fps avec 53 % des images à la cadence maximale. Le Old 3DS, limité à 268 MHz, a d’abord démarré à 10 fps avec le profil -DGDX_3DS_O3DS=ON. Après optimisation du verrou audio (gain de ~20 ms/frame) et l’introduction du rendu natif, la plupart des circuits affichent 59–60 fps en 3D, tandis que les cours les plus lourds (Silence, Sand Ocean) restent à 30 fps en raison du frame‑skip safety net. La mémoire disponible a été réduite à 64 MiB d’application, la zone RDRAM a été divisée, l’audio a été diffusé en flux et les uploads de textures ont été plafonnés pour respecter les contraintes de l’Old 3DS.

Le port conserve la totalité du gameplay : Grand Prix, Time Trial, Practice, Death Race et l’éditeur de machines, avec la musique et les effets gérés par le DSP réel. Le tableau de bord inférieur propose trois dispositions HUD et un affichage d’attente hors course. La prise en charge du mode suspend/reprise, la fermeture depuis le HOME, la mise en veille du couvercle et l’arrêt complet fonctionnent sans plantage.