Artemis-N3DS : Le streaming sur un client à deux écrans
Artemis-N3DS adapte Moonlight Embedded à la famille Nintendo 3DS. Le projet réunit découverte et jumelage de l’hôte, interface console, commandes et affichage vidéo. Le parcours matériel de la New 3DS demande une attention particulière.
Langages du dépôtC++ 76.05%6
Parts calculées à partir des octets GitHub Linguist.
| Langage | % | Octets |
|---|---|---|
| C++ | 385 430 | |
| C | 79 616 | |
| CMake | 22 072 | |
| Makefile | 14 414 | |
| Shell | 3 221 | |
| Dockerfile | 2 051 |
Aperçu
Pourquoi il existe
Défi d'ingénierie sous fortes contraintes : streaming 60 FPS sur architecture ARM11 double écran.
Cas d’usage
Accès distant et jeu PC sur matériel New 3DS.
Démarrage
Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.
makedocker build --network=host -t moonlight-n3ds .
docker run --rm -it -v .:/moonlight-N3DS -w /moonlight-N3DS moonlight-n3ds:latest
makeRéférences du dépôt
Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.
Prérequis et premier essai
Requirements
README.md
- New 3DS / New 3DS XL / New 2DS XL recommended (hardware H.264 decode)
- Original 3DS / 2DS works with software decode only — expect lower FPS
- PC running Sunshine (or compatible GameStream host) on the same network
- CFW + FBI for CIA install
Install
README.md
Configuration et utilisation
Configuration
README.md
Développement et contributions
Contribute
README.md
- Fork the repo
- Make your changes
- Open a pull request
Fonctions et composants 2
- Gestion de la session
- n3ds_main.cpp réunit découverte, jumelage, profils et état de connexion. L’hôte et l’application sélectionnés déterminent la demande de streaming. Le cycle de vie graphique est suivi séparément de la configuration du flux.
- Médias et interaction
- L’audio, les commandes et la vidéo ont leurs modules dans src. Les capacités matérielles influencent les indications affichées. L’interface peut reprendre après un flux, tandis qu’une fermeture système explicite doit terminer l’application.
Architecture
Les composants et leurs liens restent lisibles en texte. Le diagramme ajoute une vue interactive.
- Découverte et jumelage
- Application et profil
- Connexion GameStream
- Moteurs vidéo et audio
- Écrans et commandes 3DS
Liens vérifiés dans le dépôt.
Mermaid Diagramme interactif (chargement à l’ouverture)
Vue générale des composants et des échanges vérifiés dans le dépôt.

flowchart LR
subgraph group_host["Hosts and pairing"]
node_discovery["Host discovery<br/>[host_discovery.cpp]"]
node_pairing[("Pair records<br/>[pair_record.cpp]")]
node_gamestream["GameStream client<br/>[client.c]"]
node_xml["Protocol XML<br/>[xml.c]"]
end
subgraph group_session["Session coordination"]
node_main["Application flow<br/>[n3ds_main.cpp]"]
node_ui["Console menus<br/>[n3ds_ui.cpp]"]
node_connection["Stream connection"]
node_dispatcher["Message dispatcher<br/>[dispatcher.cpp]"]
end
subgraph group_stream["Stream pipeline"]
node_presentation["Presentation state"]
node_decoder["Video decoders"]
node_mvd["Hardware decode<br/>[n3ds_video_mvd.cpp]"]
node_software["Software decode"]
node_renderer["Screen renderers"]
node_graphics["Graphics lifecycle"]
node_audio["Audio output<br/>[n3ds_audio.cpp]"]
end
subgraph group_interaction["Input and helpers"]
node_input["Console input<br/>[n3ds_input.cpp]"]
node_touch["Touch handlers<br/>[TouchHandler.hpp]"]
node_menuhub["In-stream helper hub"]
node_bottomui["Bottom-screen UI"]
end
subgraph group_state["Settings and telemetry"]
node_config[("Configuration<br/>[config.cpp]")]
node_appcache[("App list cache<br/>[app_list_cache.cpp]")]
node_profiles["Stream profiles<br/>[stream_profile.cpp]"]
node_telemetry[("Stream telemetry")]
node_benchmark["Performance metrics"]
end
node_user(("3DS user"))
node_user -->|"uses"| node_main
node_main -->|"finds hosts"| node_discovery
node_main -->|"pairs host"| node_pairing
node_main -.->|"manages host"| node_gamestream
node_gamestream -->|"parses responses"| node_xml
node_discovery -->|"uses records"| node_pairing
node_main -->|"shows menus"| node_ui
node_main -->|"lists apps"| node_appcache
node_main -->|"starts session"| node_connection
node_main -->|"loads settings"| node_config
node_main -->|"selects profile"| node_profiles
node_main -->|"handles controls"| node_input
node_input -->|"posts events"| node_dispatcher
node_input -->|"owns handlers"| node_touch
node_main -->|"dispatches events"| node_dispatcher
node_user -->|"opens helpers"| node_menuhub
node_menuhub -->|"posts actions"| node_dispatcher
node_menuhub -.->|"draws interface"| node_bottomui
node_user -->|"chooses stream"| node_connection
node_connection -.->|"receives video"| node_decoder
node_decoder -.->|"hardware path"| node_mvd
node_decoder -.->|"software path"| node_software
node_decoder -->|"renders frames"| node_renderer
node_renderer -->|"uses layout state"| node_presentation
node_renderer -->|"uses graphics lifecycle"| node_graphics
node_connection -.->|"streams audio"| node_audio
node_user -->|"views or saves metrics"| node_telemetry
node_user -->|"views performance"| node_benchmark
node_main -->|"uses telemetry store"| node_telemetry
class node_discovery,node_pairing,node_gamestream,node_xml,node_user toneBlue
class node_main,node_ui,node_connection,node_dispatcher toneAmber
class node_presentation,node_decoder,node_mvd,node_software,node_renderer,node_graphics,node_audio toneMint
class node_input,node_touch,node_menuhub,node_bottomui toneRose
class node_config,node_appcache,node_profiles,node_telemetry,node_benchmark toneIndigoUn client GameStream pour Nintendo 3DS. Les utilisateurs découvrent ou ajoutent un hôte compatible Sunshine, associent la console, choisissent une application et lancent la diffusion par les sous-systèmes de session, vidéo, rendu, entrées et écran inférieur.
- Composants
- 25
- Connexions
- 29
- Liens appuyés par le code ou le README
- 23/29
Version texte du diagramme
- Découverte et jumelage → Application et profil
- Application et profil → Connexion GameStream
- Connexion GameStream → Moteurs vidéo et audio
- Moteurs vidéo et audio → Écrans et commandes 3DS
- Écrans et commandes 3DS → Connexion GameStream
Suivre un parcours dans le code
Suivez SelectedHost et le profil avant d’entrer dans le traitement des médias. Une fermeture système et un retour normal au menu sont deux transitions distinctes; un indicateur explicite évite de les confondre.
Déploiement et exploitation
Les ports, le stockage et les relations de démarrage ci-dessous viennent de la configuration du dépôt. depends_on indique l’ordre de démarrage, pas la disponibilité du service.
Types et structure des fichiers
77 types déclarés, dont 12 dans l’aperçu des relations de base.
Diagramme des types
classDiagram
direction TB
class tc0387bd4c68b["SelectedHost"] {
<<struct>>
}
class t72fa5c6e15be["RemoteApp"] {
<<struct>>
}
class tf7c6d6aec7da["InputLoopContext"] {
<<struct>>
}
class ta7f589e4be09["VideoDecoderBase"] {
accept()
_accept_touch_state_changed()
_accept_keyboard_state_changed()
}
class tb2f58dc75feb["MockVideoDecoder"] {
}
class t391f53097446["SoftVideoDecoder"] {
submit_decode_unit()
_write_yuv_to_framebuffer()
}
class t4ad2ea8a811e["MvdDecoder"] {
submit_decode_unit()
_decode()
}
class t891d7e467987["_SERVER_DATA"] {
<<struct>>
}
class ta59617f1a5fa["cb_ctx"] {
<<struct>>
}
class tcb0c88684e67["_HTTP_DATA"] {
<<struct>>
}
class taa2e3cf225d0["_CERT_KEY_PAIR"] {
<<struct>>
}
class t91f7677e0266["xml_query"] {
<<struct>>
}
class b34b203f09b57["ISubscriber"] {
<<unresolved_base>>
}
b34b203f09b57 <|-- ta7f589e4be09
ta7f589e4be09 <|-- tb2f58dc75feb
ta7f589e4be09 <|-- t391f53097446
ta7f589e4be09 <|-- t4ad2ea8a811e
Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.
Index des types
SelectedHost(struct) ·src/n3ds_main.cpp:74RemoteApp(struct) ·src/n3ds_main.cpp:79InputLoopContext(struct) ·src/n3ds_main.cpp:943VideoDecoderBase(class) ·src/video/video.hpp:48Méthodes dans l’aperçu :
accept, _accept_touch_state_changed, _accept_keyboard_state_changed.Bases déclarées :
ISubscriber.MockVideoDecoder(class) ·src/video/video.hpp:66Bases déclarées :
VideoDecoderBase.SoftVideoDecoder(class) ·src/video/video.hpp:73Méthodes dans l’aperçu :
submit_decode_unit, _write_yuv_to_framebuffer.Bases déclarées :
VideoDecoderBase.MvdDecoder(class) ·src/video/video.hpp:90Méthodes dans l’aperçu :
submit_decode_unit, _decode.Bases déclarées :
VideoDecoderBase._SERVER_DATA(struct) ·libgamestream/client.h:36cb_ctx(struct) ·libgamestream/discover.c:38_HTTP_DATA(struct) ·libgamestream/http.h:32_CERT_KEY_PAIR(struct) ·libgamestream/mkcert.h:24xml_query(struct) ·libgamestream/xml.c:29
Référence
101 / 101 fichiers admissibles lus (174 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 6 diagnostic de syntaxe.
Ce que couvre l’analyse
Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.
Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.
Carte des fichiers
flowchart TD
root["Artemis-N3DS"]
f0["src/hardware_capabilities.cpp"]
root --> f0
f1["src/n3ds_main.cpp"]
root --> f1
f2["src/video/video.hpp"]
root --> f2
f3["CMakeLists.txt"]
root --> f3
f4["Makefile"]
root --> f4
f5["README.md"]
root --> f5
f6["3ds/build-expat.sh"]
root --> f6
f7["3ds/build-ffmpeg.sh"]
root --> f7
f8["3ds/build-openssl.sh"]
root --> f8
f9["libgamestream/CMakeLists.txt"]
root --> f9
f10["libgamestream/client.c"]
root --> f10
f11["libgamestream/client.h"]
root --> f11
f12["libgamestream/discover.c"]
root --> f12
f13["libgamestream/discover.h"]
root --> f13
f14["libgamestream/errors.h"]
root --> f14
f15["libgamestream/http.c"]
root --> f15
Fichiers à lire 3
Références
- GitHubDépôt source
- READMEDocumentation du dépôt
- Streaming portable et homebrew — Artemis-Switch, moonlight-N3DS, sm64coopdx-switchArticle du blog