Appearance
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
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
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
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
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
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