VR · Quest 3 · OpenGL ES · 03/11

Time Crisis · VR

Namco System 22 · Meta Quest 3

Time Crisis, le gun arcade de Namco, en stéréoscopie 6DoF dans un Quest 3 — Area 1 jouable de bout en bout, à 59.90 fps soutenus, 0 underrun sur 12 945 callbacks.

Capture stéréoscopique de la scène VR (Namco System 22, Meta Quest 3).
Capture stéréoscopique de la scène VR (Namco System 22, Meta Quest 3).

Comment ça est né

Time Crisis, c'est le gun arcade de Namco sur System 22 — l'un des jeux les plus joués du monde, et le genre de machine que tout le monde a tenté d'émuler mais peu de gens ont rendu vraiment jouable dans un casque VR. L'objectif : pas Time Crisis dans un mur virtuel, mais Time Crisis en stéréoscopie 6DoF, avec la visée au casque et les bras qui suivent le pointeur.

Le point de départ, c'est MAME — le meilleur émulateur d'arcade, mais pensé pour un écran 2D. J'ai forké la version qui contient déjà le code System 22 (le fork c211168), et j'ai ajouté par-dessus une couche OpenXR native pour Meta Quest 3. C'est cette couche — et tout le travail de rendu et d'audio — qui fait le projet.

Le contexte

Le projet est un fork de MAME (c211168) sur lequel j'ai ajouté un moteur OpenXR natif pour Meta Quest 3. Le rendu est en OpenGL ES (pas Vulkan, par choix — plus stable sur la stack Quest pour du raster arcade), l'audio en AAudio, et le visuel est en stéréoscopie 6DoF à 1280×960 par œil.

Le but, c'est que Area 1 de Time Crisis soit jouable de bout en bout dans le casque, avec la visée 6DoF au pointeur et les bras qui suivent le modèle. J'ai défini une « golden playable area » (Area 1) comme zone de référence : c'est elle qui est validée sur le hardware physique, et c'est elle qui sert de base pour étendre aux autres zones.

Le port inclut aussi le moteur Sega Model 2 (Rally) comme second système arcade dans le même sélecteur — ce qui veut dire que le projet gère deux familles de GPU arcade distinctes, avec leurs propres shaders, leur propre pipeline de blending, et leur propre politique d'audio.

Ce qui distingue ce projet d'un simple « émulateur dans un casque », c'est la profondeur du travail de rendu : shaders SPIR-V / OpenGL ES optimisés, segmentation du blending avec Early-Z, politique d'audio profilée pour éliminer les underruns, et une cadence soutenue mesurée, pas juste annoncée.

Le point dur

Attenir 60 fps soutenus sur du raster arcade dans un Quest 3

Le System 22 de Namco est un GPU arcade qui mélange polygones, textures, shading et blending d'une manière qui n'a jamais été pensée pour un casque VR à 60-90 Hz. Sur Quest 3, la marge de latence est minuscule : si tu perds un frame, tu perds la cadence, et le joueur le ressent. J'ai dû segmenter le blending avec l'Early-Z pour séparer ce qui peut être masqué (le GPU passe de 5,4 ms à 2,6-2,8 ms par œil sur le Model 2), et j'ai profilé l'audio pour que les underruns n'entraînent pas de drops de frame.

Le deuxième point dur, c'est la chauffe : un Quest 3 en VR soutenue monte vite. J'ai mesuré un pic à 70 °C en début de session, et j'ai travaillé le profiling pour ramener le régime à 51 °C en régime établi — c'est ce qui permet de tenir 59.90 fps sans throttling. Le tout est « baked » en C++ autonome, découplé de l'émulateur, pour viser la cadence maximale.

Fonctionnalités

Stéréoscopie 6DoF OpenGL ES natif Quest 3

Le rendu passe d'un affichage 2D à une scène immersive à six degrés de liberté, dans le casque, à 1280×960 par œil.

Time Crisis jouable Area 1, golden playable area

La zone de référence Time Crisis est jouable de bout en bout sur le hardware physique Quest 3, visée 6DoF au pointeur.

Moteur Sega Model 2 Rally, second système arcade

Le même sélecteur gère aussi le moteur Model 2 (Rally) — deux familles de GPU arcade dans un seul port.

Optimisation GPU 5,4 → 2,6 ms/œil (Model 2)

Segmentation du blending avec Early-Z : on sépare le travail masquable pour faire respirer le GPU.

Audio profilé AAudio · 0 underrun / 12945

Une politique audio Sega/Namco profilée qui élimine les underruns mesurés sur la session de référence.

Cadence mesurée 59.90 fps soutenus

La cadence n'est pas annoncée, elle est mesurée sur le hardware, avec un régime de chauffe stabilisé.

Arbitrages techniques

OpenGL ES plutôt que Vulkan Plus stable sur la stack Quest pour du raster arcade, moins de surface de bug sur la chaîne de rendu. Contrepartie : Moins de flexibilité que Vulkan pour certains patterns, mais suffisant pour du arcade.
AAudio plutôt que OpenSL ES Latence audio plus basse, meilleur contrôle du buffer, et c'est ce qui permet d'atteindre 0 underrun sur 12945 callbacks. Contrepartie : API plus récente, à valider sur tous les appareils Quest.
Fork de MAME plutôt que réécriture Le code System 22 et Model 2 existe déjà, et est testé ; on ne réécrit pas un emulateur d'arcade. Contrepartie : On est lié à l'état du fork, et on doit porter ses dépendances.
Rendu « baked » en C++ autonome Découpler le rendu du cœur émulateur pour viser la cadence maximale. Contrepartie : Un second chemin de rendu à maintenir, à synchroniser avec l'état de l'émulateur.

Stack technique

RenduOpenGL ES · SPIR-V · 6DoF stéréo
CœurMAME fork c211168 · C++17
VROpenXR 1.1.63 · Quest 3
AudioAAudio · politique Sega/Namco
OutilsNDK 23.2 · arm64
Cadence59.90 fps · 70 → 51 °C

En chiffres

0fps soutenus
70 → 51°C pic → régime
0 / 12 945underruns audio
0systèmes arcade
1280×960par œil

Parcours du projet

  1. Fork & boot

    Fork MAME c211168, moteur OpenXR natif Quest 3, Time Crisis démarre dans le casque.

  2. Stéréoscopie 6DoF

    Rendu 1280×960/œil, visée au pointeur, bras qui suivent le modèle.

  3. Golden playable area

    Area 1 validée de bout en bout sur le hardware physique Quest 3.

  4. Optimisation GPU & audio

    Segmentation du blending (Early-Z), politique AAudio profilée, 0 underrun / 12945 callbacks.

  5. Régime établi

    59.90 fps soutenus, chauffe 70 → 51 °C, sélecteur System 22 / Model 2 (Rally).

Ce que ça a rendu

  • 01
    Time Crisis jouable en VR

    Area 1 jouable de bout en bout sur Quest 3, visée 6DoF au pointeur — une première pour ce titre.

  • 02
    Deux moteurs arcade

    System 22 et Model 2 dans le même port, avec un sélecteur de titres.

  • 03
    Cadence tenue

    59.90 fps soutenus, 0 underrun sur la session de référence, régime de chauffe stabilisé à 51 °C.