Skip to content
On this page

ARCHITECTURE R-TYPE

πŸ“Š DIAGRAMME D'ARCHITECTURE COMPLÈTE

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          R-TYPE ARCHITECTURE                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

COUCHE 1: NETWORKING (TCP/UDP)
═══════════════════════════════════════════════════════════════════════════

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  ServerHub (TCP - Port 4242)                                     β”‚
    │  - Gère Lobby                                                    │
    β”‚  - Liste des rooms                                               β”‚
    β”‚  - CrΓ©ation/Join rooms                                           β”‚
    β”‚  - RoomManager                                                   β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚           β”‚           β”‚               β”‚
         ↓           ↓           ↓               ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Room 1 β”‚  β”‚ Room 2 β”‚  β”‚ Room 3 β”‚  β”‚ Room N...  β”‚
    β”‚UDP:5001β”‚  β”‚UDP:5002β”‚  β”‚UDP:5003β”‚  β”‚UDP:5000+N  β”‚
    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
         β”‚           β”‚           β”‚              β”‚
         ↓           ↓           ↓              ↓
    ServerRoom  ServerRoom  ServerRoom    ServerRoom
    (Process)   (Process)   (Process)     (Process)


COUCHE 2: GAME LOGIC (Server Authoritative)
═══════════════════════════════════════════════════════════════════════════

    Chaque ServerRoom contient:
    
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  ServerRoom                                                 β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ GameServer (ECS Registry)                              β”‚β”‚
    β”‚  β”‚                                                        β”‚β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚
    β”‚  β”‚  β”‚ Physics      β”‚  β”‚ Collision    β”‚  β”‚ Shooter     β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ System       β”‚  β”‚ System       β”‚  β”‚ System      β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Gravity    β”‚  β”‚ - Detection  β”‚  β”‚ - Auto fire β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Velocity   β”‚  β”‚ - Resolution β”‚  β”‚ - Cooldown  β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Boundaries β”‚  β”‚ - Damage     β”‚  β”‚             β”‚ β”‚β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚
    β”‚  β”‚                                                        β”‚β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚β”‚
    β”‚  β”‚  β”‚ Spawn        β”‚  β”‚ Movement     β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ System       β”‚  β”‚ System       β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ - Enemies    β”‚  β”‚ - Input      β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ - Powerups   β”‚  β”‚ - Apply vel  β”‚                  β”‚β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ Packet Processing                                      β”‚β”‚
    β”‚  β”‚ - InputPacket β†’ processPlayerInput()                   β”‚β”‚
    β”‚  β”‚ - Sequence number validation                           β”‚β”‚
    β”‚  β”‚ - Duplicate/OOO detection                              β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ State Broadcasting                                     β”‚β”‚
    β”‚  β”‚ - GameStatePacket (20Hz)                               β”‚β”‚
    β”‚  β”‚ - Entity snapshots                                     β”‚β”‚
    β”‚  β”‚ - Score, game_over                                     β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 3: CLIENT (Graphical + Networking)
═══════════════════════════════════════════════════════════════════════════

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  r-type_graphical_client                                     β”‚
    β”‚                                                              β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ RTypeGame (State Machine)                              β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚  β”‚  MENU    β”‚ β†’ β”‚  LOBBY   β”‚ β†’ β”‚    PLAYING       β”‚  β”‚ β”‚
    β”‚  β”‚  β”‚  State   β”‚   β”‚  State   β”‚   β”‚    State         β”‚  β”‚ β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  MENU STATE:                                                 β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ - Singleplayer                                         β”‚ β”‚
    β”‚  β”‚ - Multiplayer  ← Transition vers LOBBY                 β”‚ β”‚
    β”‚  β”‚ - Options                                              β”‚ β”‚
    β”‚  β”‚ - Quit                                                 β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  LOBBY STATE:                                                β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ClientHub (TCP)                                        β”‚ β”‚
    β”‚  β”‚ β”œβ”€ requestRoomList()                                   β”‚ β”‚
    β”‚  β”‚ β”œβ”€ createRoom(name)                                    β”‚ β”‚
    β”‚  β”‚ └─ joinRoom(id)                                        β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ UI:                                                    β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚ ROOM NAME      PLAYERS    STATUS                β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ TestRoom       2/4        Waiting        [JOIN] β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ CoopMode       1/4        Waiting        [JOIN] β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ HardcoreRun    4/4        In Game              β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ [C] Create Room   [R] Refresh   [ESC] Back to Menu   β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  PLAYING STATE:                                              β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ClientRoom (UDP)                                       β”‚ β”‚
    β”‚  β”‚ β”œβ”€ sendInput(InputPacket)                              β”‚ β”‚
    β”‚  β”‚ β”œβ”€ receiveState(GameStatePacket)                       β”‚ β”‚
    β”‚  β”‚ └─ getCurrentRTT()                                     β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ Game Rendering:                                        β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚          R-TYPE GAME                            β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚                                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚  [Player]  β†’β†’β†’β†’  [Enemy]  ←←←←                 β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚                                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚  Score: 1500           Lives: 3                 β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ Network Metrics Overlay:                               β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚ πŸ“‘ Network Metrics                              β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ RTT: 45ms          β˜…β˜…β˜…β˜…β˜†                        β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ Loss: 0.1%                                      β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ ↑ Up: 8.3 KB/s                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ ↓ Down: 12.5 KB/s                               β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ πŸ“¦ Sent/Recv: 523/498                           β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ FPS: 60                                         β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ [F3] Toggle                                     β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 4: PACKETS & COMPRESSION
═══════════════════════════════════════════════════════════════════════════

    PacketsManager
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  Serialization/Deserialization                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ InputPacket  β”‚  β”‚ GameState    β”‚  β”‚ Login/Logout    β”‚  β”‚
    β”‚  β”‚ - playerId   β”‚  β”‚ Packet       β”‚  β”‚ Packets         β”‚  β”‚
    β”‚  β”‚ - sequence   β”‚  β”‚ - frame      β”‚  β”‚                 β”‚  β”‚
    β”‚  β”‚ - moveUp/    β”‚  β”‚ - entities[] β”‚  β”‚                 β”‚  β”‚
    β”‚  β”‚   Down/etc   β”‚  β”‚ - score      β”‚  β”‚                 β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ Ping/Pong    β”‚  β”‚ Spawn/       β”‚  β”‚ Room            β”‚  β”‚
    β”‚  β”‚ Packets      β”‚  β”‚ Destroy      β”‚  β”‚ Packets         β”‚  β”‚
    β”‚  β”‚ - pingId     β”‚  β”‚ Packets      β”‚  β”‚ - list          β”‚  β”‚
    β”‚  β”‚ - timestamp  β”‚  β”‚              β”‚  β”‚ - create        β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  Compression (LZ4)                                         β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ GameStatePacket: 480 bytes β†’ 182 bytes (62% saving) β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Encryption (XOR)                                          β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ Basic obfuscation for packet data                    β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Metrics Tracking                                          β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ - recordPacketSent(bytes)                            β”‚ β”‚
    β”‚  β”‚ - recordPacketReceived(bytes)                        β”‚ β”‚
    β”‚  β”‚ - getMetrics() β†’ NetworkMetrics struct               β”‚ β”‚
    β”‚  β”‚   - packets_sent/received                            β”‚ β”‚
    β”‚  β”‚   - bytes_sent/received                              β”‚ β”‚
    β”‚  β”‚   - bandwidth_up/down KB/s                           β”‚ β”‚
    β”‚  β”‚   - avg_packet_size                                  β”‚ β”‚
    β”‚  β”‚   - uptime                                           β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 5: ECS (Entity Component System)
═══════════════════════════════════════════════════════════════════════════

    Registry
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  Entities                                                  β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ Entity 1 β”‚  β”‚ Entity 2 β”‚  β”‚ Entity 3 β”‚  β”‚ Entity N β”‚  β”‚
    β”‚  β”‚ Player 1 β”‚  β”‚ Enemy 1  β”‚  β”‚ Bullet 1 β”‚  β”‚ ...      β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  Components (SparseArray)                                  β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ Position  β”‚ [x:100, y:200] [x:350, y:150] ...       β”‚ β”‚
    β”‚  β”‚ Velocity  β”‚ [vx:5, vy:0]   [vx:-2, vy:3]  ...       β”‚ β”‚
    β”‚  β”‚ Health    β”‚ [hp:100]       [hp:50]        ...       β”‚ β”‚
    β”‚  β”‚ Damage    β”‚ [dmg:10]       [dmg:25]       ...       β”‚ β”‚
    β”‚  β”‚ Sprite    β”‚ [tex:player]   [tex:enemy1]   ...       β”‚ β”‚
    β”‚  β”‚ Rigidbody β”‚ [DYNAMIC]      [KINEMATIC]    ...       β”‚ β”‚
    β”‚  β”‚ Gravity   β”‚ [fx:0,fy:9.8]  [none]         ...       β”‚ β”‚
    β”‚  β”‚ Boundary  β”‚ [0,800,0,600]  [0,800,0,600]  ...       β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Systems (operate on Components)                           β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ PhysicsSystem:                                       β”‚ β”‚
    β”‚  β”‚   for entity with (Position, Velocity, Gravity):    β”‚ β”‚
    β”‚  β”‚     velocity += gravity * dt                        β”‚ β”‚
    β”‚  β”‚     position += velocity * dt                       β”‚ β”‚
    β”‚  β”‚     checkBoundaries(position, boundary)             β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ CollisionSystem:                                     β”‚ β”‚
    β”‚  β”‚   for entity1 with (Position, Hitbox):              β”‚ β”‚
    β”‚  β”‚     for entity2 with (Position, Hitbox):            β”‚ β”‚
    β”‚  β”‚       if collides(entity1, entity2):                β”‚ β”‚
    β”‚  β”‚         handleCollision(entity1, entity2)           β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ShooterSystem:                                       β”‚ β”‚
    β”‚  β”‚   for entity with (ShooterComponent, Position):     β”‚ β”‚
    β”‚  β”‚     shootTimer += dt                                β”‚ β”‚
    β”‚  β”‚     if shootTimer >= shootInterval:                 β”‚ β”‚
    β”‚  β”‚       spawnBullet(position)                         β”‚ β”‚
    β”‚  β”‚       shootTimer = 0                                β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          R-TYPE ARCHITECTURE                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

COUCHE 1: NETWORKING (TCP/UDP)
═══════════════════════════════════════════════════════════════════════════

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  ServerHub (TCP - Port 4242)                                     β”‚
    │  - Gère Lobby                                                    │
    β”‚  - Liste des rooms                                               β”‚
    β”‚  - CrΓ©ation/Join rooms                                           β”‚
    β”‚  - RoomManager                                                   β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚           β”‚           β”‚               β”‚
         ↓           ↓           ↓               ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Room 1 β”‚  β”‚ Room 2 β”‚  β”‚ Room 3 β”‚  β”‚ Room N...  β”‚
    β”‚UDP:5001β”‚  β”‚UDP:5002β”‚  β”‚UDP:5003β”‚  β”‚UDP:5000+N  β”‚
    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
         β”‚           β”‚           β”‚              β”‚
         ↓           ↓           ↓              ↓
    ServerRoom  ServerRoom  ServerRoom    ServerRoom
    (Process)   (Process)   (Process)     (Process)


COUCHE 2: GAME LOGIC (Server Authoritative)
═══════════════════════════════════════════════════════════════════════════

    Chaque ServerRoom contient:
    
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  ServerRoom                                                 β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ GameServer (ECS Registry)                              β”‚β”‚
    β”‚  β”‚                                                        β”‚β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚
    β”‚  β”‚  β”‚ Physics      β”‚  β”‚ Collision    β”‚  β”‚ Shooter     β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ System       β”‚  β”‚ System       β”‚  β”‚ System      β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Gravity    β”‚  β”‚ - Detection  β”‚  β”‚ - Auto fire β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Velocity   β”‚  β”‚ - Resolution β”‚  β”‚ - Cooldown  β”‚ β”‚β”‚
    β”‚  β”‚  β”‚ - Boundaries β”‚  β”‚ - Damage     β”‚  β”‚             β”‚ β”‚β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚
    β”‚  β”‚                                                        β”‚β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚β”‚
    β”‚  β”‚  β”‚ Spawn        β”‚  β”‚ Movement     β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ System       β”‚  β”‚ System       β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ - Enemies    β”‚  β”‚ - Input      β”‚                  β”‚β”‚
    β”‚  β”‚  β”‚ - Powerups   β”‚  β”‚ - Apply vel  β”‚                  β”‚β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ Packet Processing                                      β”‚β”‚
    β”‚  β”‚ - InputPacket β†’ processPlayerInput()                   β”‚β”‚
    β”‚  β”‚ - Sequence number validation                           β”‚β”‚
    β”‚  β”‚ - Duplicate/OOO detection                              β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β”‚                                                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
    β”‚  β”‚ State Broadcasting                                     β”‚β”‚
    β”‚  β”‚ - GameStatePacket (20Hz)                               β”‚β”‚
    β”‚  β”‚ - Entity snapshots                                     β”‚β”‚
    β”‚  β”‚ - Score, game_over                                     β”‚β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 3: CLIENT (Graphical + Networking)
═══════════════════════════════════════════════════════════════════════════

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  r-type_graphical_client                                     β”‚
    β”‚                                                              β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ RTypeGame (State Machine)                              β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚  β”‚  MENU    β”‚ β†’ β”‚  LOBBY   β”‚ β†’ β”‚    PLAYING       β”‚  β”‚ β”‚
    β”‚  β”‚  β”‚  State   β”‚   β”‚  State   β”‚   β”‚    State         β”‚  β”‚ β”‚
    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  MENU STATE:                                                 β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ - Singleplayer                                         β”‚ β”‚
    β”‚  β”‚ - Multiplayer  ← Transition vers LOBBY                 β”‚ β”‚
    β”‚  β”‚ - Options                                              β”‚ β”‚
    β”‚  β”‚ - Quit                                                 β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  LOBBY STATE:                                                β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ClientHub (TCP)                                        β”‚ β”‚
    β”‚  β”‚ β”œβ”€ requestRoomList()                                   β”‚ β”‚
    β”‚  β”‚ β”œβ”€ createRoom(name)                                    β”‚ β”‚
    β”‚  β”‚ └─ joinRoom(id)                                        β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ UI:                                                    β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚ ROOM NAME      PLAYERS    STATUS                β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ TestRoom       2/4        Waiting        [JOIN] β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ CoopMode       1/4        Waiting        [JOIN] β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ HardcoreRun    4/4        In Game              β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ [C] Create Room   [R] Refresh   [ESC] Back to Menu   β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                              β”‚
    β”‚  PLAYING STATE:                                              β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ClientRoom (UDP)                                       β”‚ β”‚
    β”‚  β”‚ β”œβ”€ sendInput(InputPacket)                              β”‚ β”‚
    β”‚  β”‚ β”œβ”€ receiveState(GameStatePacket)                       β”‚ β”‚
    β”‚  β”‚ └─ getCurrentRTT()                                     β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ Game Rendering:                                        β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚          R-TYPE GAME                            β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚                                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚  [Player]  β†’β†’β†’β†’  [Enemy]  ←←←←                 β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚                                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚  Score: 1500           Lives: 3                 β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β”‚                                                        β”‚ β”‚
    β”‚  β”‚ Network Metrics Overlay:                               β”‚ β”‚
    β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
    β”‚  β”‚ β”‚ πŸ“‘ Network Metrics                              β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ RTT: 45ms          β˜…β˜…β˜…β˜…β˜†                        β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ Loss: 0.1%                                      β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ ↑ Up: 8.3 KB/s                                  β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ ↓ Down: 12.5 KB/s                               β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ πŸ“¦ Sent/Recv: 523/498                           β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ FPS: 60                                         β”‚  β”‚ β”‚
    β”‚  β”‚ β”‚ [F3] Toggle                                     β”‚  β”‚ β”‚
    β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 4: PACKETS & COMPRESSION
═══════════════════════════════════════════════════════════════════════════

    PacketsManager
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  Serialization/Deserialization                             β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ InputPacket  β”‚  β”‚ GameState    β”‚  β”‚ Login/Logout    β”‚  β”‚
    β”‚  β”‚ - playerId   β”‚  β”‚ Packet       β”‚  β”‚ Packets         β”‚  β”‚
    β”‚  β”‚ - sequence   β”‚  β”‚ - frame      β”‚  β”‚                 β”‚  β”‚
    β”‚  β”‚ - moveUp/    β”‚  β”‚ - entities[] β”‚  β”‚                 β”‚  β”‚
    β”‚  β”‚   Down/etc   β”‚  β”‚ - score      β”‚  β”‚                 β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ Ping/Pong    β”‚  β”‚ Spawn/       β”‚  β”‚ Room            β”‚  β”‚
    β”‚  β”‚ Packets      β”‚  β”‚ Destroy      β”‚  β”‚ Packets         β”‚  β”‚
    β”‚  β”‚ - pingId     β”‚  β”‚ Packets      β”‚  β”‚ - list          β”‚  β”‚
    β”‚  β”‚ - timestamp  β”‚  β”‚              β”‚  β”‚ - create        β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  Compression (LZ4)                                         β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ GameStatePacket: 480 bytes β†’ 182 bytes (62% saving) β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Encryption (XOR)                                          β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ Basic obfuscation for packet data                    β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Metrics Tracking                                          β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ - recordPacketSent(bytes)                            β”‚ β”‚
    β”‚  β”‚ - recordPacketReceived(bytes)                        β”‚ β”‚
    β”‚  β”‚ - getMetrics() β†’ NetworkMetrics struct               β”‚ β”‚
    β”‚  β”‚   - packets_sent/received                            β”‚ β”‚
    β”‚  β”‚   - bytes_sent/received                              β”‚ β”‚
    β”‚  β”‚   - bandwidth_up/down KB/s                           β”‚ β”‚
    β”‚  β”‚   - avg_packet_size                                  β”‚ β”‚
    β”‚  β”‚   - uptime                                           β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


COUCHE 5: ECS (Entity Component System)
═══════════════════════════════════════════════════════════════════════════

    Registry
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  Entities                                                  β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ Entity 1 β”‚  β”‚ Entity 2 β”‚  β”‚ Entity 3 β”‚  β”‚ Entity N β”‚  β”‚
    β”‚  β”‚ Player 1 β”‚  β”‚ Enemy 1  β”‚  β”‚ Bullet 1 β”‚  β”‚ ...      β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β”‚                                                            β”‚
    β”‚  Components (SparseArray)                                  β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ Position  β”‚ [x:100, y:200] [x:350, y:150] ...       β”‚ β”‚
    β”‚  β”‚ Velocity  β”‚ [vx:5, vy:0]   [vx:-2, vy:3]  ...       β”‚ β”‚
    β”‚  β”‚ Health    β”‚ [hp:100]       [hp:50]        ...       β”‚ β”‚
    β”‚  β”‚ Damage    β”‚ [dmg:10]       [dmg:25]       ...       β”‚ β”‚
    β”‚  β”‚ Sprite    β”‚ [tex:player]   [tex:enemy1]   ...       β”‚ β”‚
    β”‚  β”‚ Rigidbody β”‚ [DYNAMIC]      [KINEMATIC]    ...       β”‚ β”‚
    β”‚  β”‚ Gravity   β”‚ [fx:0,fy:9.8]  [none]         ...       β”‚ β”‚
    β”‚  β”‚ Boundary  β”‚ [0,800,0,600]  [0,800,0,600]  ...       β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  Systems (operate on Components)                           β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ PhysicsSystem:                                       β”‚ β”‚
    β”‚  β”‚   for entity with (Position, Velocity, Gravity):    β”‚ β”‚
    β”‚  β”‚     velocity += gravity * dt                        β”‚ β”‚
    β”‚  β”‚     position += velocity * dt                       β”‚ β”‚
    β”‚  β”‚     checkBoundaries(position, boundary)             β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ CollisionSystem:                                     β”‚ β”‚
    β”‚  β”‚   for entity1 with (Position, Hitbox):              β”‚ β”‚
    β”‚  β”‚     for entity2 with (Position, Hitbox):            β”‚ β”‚
    β”‚  β”‚       if collides(entity1, entity2):                β”‚ β”‚
    β”‚  β”‚         handleCollision(entity1, entity2)           β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ ShooterSystem:                                       β”‚ β”‚
    β”‚  β”‚   for entity with (ShooterComponent, Position):     β”‚ β”‚
    β”‚  β”‚     shootTimer += dt                                β”‚ β”‚
    β”‚  β”‚     if shootTimer >= shootInterval:                 β”‚ β”‚
    β”‚  β”‚       spawnBullet(position)                         β”‚ β”‚
    β”‚  β”‚       shootTimer = 0                                β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237

πŸ”„ FLOW DE DONNΓ‰ES COMPLET

Flow 1: Connexion Initiale

Client                      ServerHub                 ServerRoom
  β”‚                            β”‚                          β”‚
  β”‚  TCP Connect (4242)        β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  LoginPacket               β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  LoginResponsePacket       β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  (success, playerId)       β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  requestRoomList()         β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  RoomListPacket            β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  [Room1, Room2, Room3...]  β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  joinRoom(roomId)          β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚                            β”‚  SpawnRoom (if needed)   β”‚
  β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚                            β”‚                          β”‚
  β”‚  RoomJoinedPacket          β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  (roomId, port:5001)       β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  Disconnect TCP            β”‚                          β”‚
  β”‚  Connect UDP (5001)        β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚                            β”‚                          β”‚
Client                      ServerHub                 ServerRoom
  β”‚                            β”‚                          β”‚
  β”‚  TCP Connect (4242)        β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  LoginPacket               β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  LoginResponsePacket       β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  (success, playerId)       β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  requestRoomList()         β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  RoomListPacket            β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  [Room1, Room2, Room3...]  β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  joinRoom(roomId)          β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚                            β”‚  SpawnRoom (if needed)   β”‚
  β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚                            β”‚                          β”‚
  β”‚  RoomJoinedPacket          β”‚                          β”‚
  β”‚<────────────────────────────                          β”‚
  β”‚  (roomId, port:5001)       β”‚                          β”‚
  β”‚                            β”‚                          β”‚
  β”‚  Disconnect TCP            β”‚                          β”‚
  β”‚  Connect UDP (5001)        β”‚                          β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚                            β”‚                          β”‚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Flow 2: Game Loop (60Hz Client, 20Hz Server)

Client (60 FPS)              ServerRoom (20 TPS)         Client Render
     β”‚                            β”‚                            β”‚
     β”‚  Read Input                β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί                  β”‚                            β”‚
     β”‚  (↑ pressed)               β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚  InputPacket               β”‚                            β”‚
     β”‚  seq#142, moveUp=true      β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚                            β”‚  Validate sequence         β”‚
     β”‚                            β”‚  (not duplicate/OOO)       β”‚
     β”‚                            β”‚                            β”‚
     β”‚                            β”‚  GameServer.               β”‚
     β”‚                            β”‚  processPlayerInput()      β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  PhysicsSystem.update()    β”‚
     β”‚                            β”‚  - Apply velocity          β”‚
     β”‚                            β”‚  - Update position         β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  CollisionSystem.update()  β”‚
     β”‚                            β”‚  - Check collisions        β”‚
     β”‚                            β”‚  - Apply damage            β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  ShooterSystem.update()    β”‚
     β”‚                            β”‚  - Auto fire bullets       β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  SpawnSystem.update()      β”‚
     β”‚                            β”‚  - Spawn enemies           β”‚
     β”‚                            β”‚                            β”‚
     β”‚  GameStatePacket           β”‚                            β”‚
     β”‚<────────────────────────────                            β”‚
     β”‚  frame#75, entities[...]   β”‚                            β”‚
     β”‚  score, gameOver           β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚  applyGameState()          β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
     β”‚                            β”‚                    Update positions
     β”‚                            β”‚                    Update sprites
     β”‚                            β”‚                            β”‚
     β”‚  render()                  β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
     β”‚                            β”‚                    Draw background
     β”‚                            β”‚                    Draw entities
     β”‚                            β”‚                    Draw UI
     β”‚                            β”‚                    Draw metrics
     β”‚                            β”‚                    display()
Client (60 FPS)              ServerRoom (20 TPS)         Client Render
     β”‚                            β”‚                            β”‚
     β”‚  Read Input                β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί                  β”‚                            β”‚
     β”‚  (↑ pressed)               β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚  InputPacket               β”‚                            β”‚
     β”‚  seq#142, moveUp=true      β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚                            β”‚  Validate sequence         β”‚
     β”‚                            β”‚  (not duplicate/OOO)       β”‚
     β”‚                            β”‚                            β”‚
     β”‚                            β”‚  GameServer.               β”‚
     β”‚                            β”‚  processPlayerInput()      β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  PhysicsSystem.update()    β”‚
     β”‚                            β”‚  - Apply velocity          β”‚
     β”‚                            β”‚  - Update position         β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  CollisionSystem.update()  β”‚
     β”‚                            β”‚  - Check collisions        β”‚
     β”‚                            β”‚  - Apply damage            β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  ShooterSystem.update()    β”‚
     β”‚                            β”‚  - Auto fire bullets       β”‚
     β”‚                            β”‚    β”‚                       β”‚
     β”‚                            β”‚    ↓                       β”‚
     β”‚                            β”‚  SpawnSystem.update()      β”‚
     β”‚                            β”‚  - Spawn enemies           β”‚
     β”‚                            β”‚                            β”‚
     β”‚  GameStatePacket           β”‚                            β”‚
     β”‚<────────────────────────────                            β”‚
     β”‚  frame#75, entities[...]   β”‚                            β”‚
     β”‚  score, gameOver           β”‚                            β”‚
     β”‚                            β”‚                            β”‚
     β”‚  applyGameState()          β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
     β”‚                            β”‚                    Update positions
     β”‚                            β”‚                    Update sprites
     β”‚                            β”‚                            β”‚
     β”‚  render()                  β”‚                            β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
     β”‚                            β”‚                    Draw background
     β”‚                            β”‚                    Draw entities
     β”‚                            β”‚                    Draw UI
     β”‚                            β”‚                    Draw metrics
     β”‚                            β”‚                    display()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Flow 3: PING/PONG pour RTT

Client                      ServerRoom
  β”‚                            β”‚
  β”‚  PingPacket                β”‚
  β”‚  pingId=123                β”‚
  β”‚  timestamp=T1              β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚  Store (pingId, T1)        β”‚                
  β”‚                            β”‚
  β”‚                            β”‚  Receive Ping
  β”‚                            β”‚
  β”‚  PongPacket                β”‚
  β”‚<────────────────────────────
  β”‚  pingId=123                β”‚
  β”‚                            β”‚
  β”‚  Calculate RTT:            β”‚
  β”‚  T2 = now()                β”‚
  β”‚  RTT = T2 - T1             β”‚
  β”‚  _current_rtt = RTT        β”‚
  β”‚                            β”‚
Client                      ServerRoom
  β”‚                            β”‚
  β”‚  PingPacket                β”‚
  β”‚  pingId=123                β”‚
  β”‚  timestamp=T1              β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
  β”‚  Store (pingId, T1)        β”‚                
  β”‚                            β”‚
  β”‚                            β”‚  Receive Ping
  β”‚                            β”‚
  β”‚  PongPacket                β”‚
  β”‚<────────────────────────────
  β”‚  pingId=123                β”‚
  β”‚                            β”‚
  β”‚  Calculate RTT:            β”‚
  β”‚  T2 = now()                β”‚
  β”‚  RTT = T2 - T1             β”‚
  β”‚  _current_rtt = RTT        β”‚
  β”‚                            β”‚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Flow 4: Network Metrics Update

PacketsManager              NetworkMetricsUI          Render
      β”‚                            β”‚                     β”‚
      β”‚  recordPacketSent()        β”‚                     β”‚
      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β–Ί                   β”‚                     β”‚
      β”‚  _bytes_sent += 150        β”‚                     β”‚
      β”‚  _packets_sent++           β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚  recordPacketReceived()    β”‚                     β”‚
      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β–Ί                   β”‚                     β”‚
      β”‚  _bytes_received += 480    β”‚                     β”‚
      β”‚  _packets_received++       β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚                            β”‚  update()           β”‚
      β”‚                            β”‚  (every 1 sec)      β”‚
      β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί           β”‚
      β”‚                            β”‚                     β”‚
      β”‚  getMetrics()              β”‚                     β”‚
      β”‚<────────────────────────────                     β”‚
      β”‚  returns:                  β”‚                     β”‚
      β”‚  - packets_sent: 523       β”‚                     β”‚
      β”‚  - packets_received: 498   β”‚                     β”‚
      β”‚  - bandwidth_up: 8.3 KB/s  β”‚                     β”‚
      β”‚  - bandwidth_down: 12.5    β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚                            β”‚  render()           β”‚
      β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
      β”‚                            β”‚              Draw overlay
      β”‚                            β”‚              with metrics
PacketsManager              NetworkMetricsUI          Render
      β”‚                            β”‚                     β”‚
      β”‚  recordPacketSent()        β”‚                     β”‚
      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β–Ί                   β”‚                     β”‚
      β”‚  _bytes_sent += 150        β”‚                     β”‚
      β”‚  _packets_sent++           β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚  recordPacketReceived()    β”‚                     β”‚
      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β–Ί                   β”‚                     β”‚
      β”‚  _bytes_received += 480    β”‚                     β”‚
      β”‚  _packets_received++       β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚                            β”‚  update()           β”‚
      β”‚                            β”‚  (every 1 sec)      β”‚
      β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί           β”‚
      β”‚                            β”‚                     β”‚
      β”‚  getMetrics()              β”‚                     β”‚
      β”‚<────────────────────────────                     β”‚
      β”‚  returns:                  β”‚                     β”‚
      β”‚  - packets_sent: 523       β”‚                     β”‚
      β”‚  - packets_received: 498   β”‚                     β”‚
      β”‚  - bandwidth_up: 8.3 KB/s  β”‚                     β”‚
      β”‚  - bandwidth_down: 12.5    β”‚                     β”‚
      β”‚                            β”‚                     β”‚
      β”‚                            β”‚  render()           β”‚
      β”‚                            β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚
      β”‚                            β”‚              Draw overlay
      β”‚                            β”‚              with metrics
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28