아키텍처 개요
브라우저(web: Canvas/PWA) ──WS──> signaling(CF Worker) ── GameDO(권위 tick/state 150ms)
│ Firebase Auth(uid) └ RoomDO/PoolDO(매치메이킹) · Lobby DO
└── leaderboard(CF Worker + D1: 점수/유저네임)
core(순수 도메인) ← engine(로컬 루프) / netcode-core+raw+interpolated(온라인 렌더 전략)
- 권위 서버 모델: room별 GameDO가 단일 GameState·tick 소유, 브라우저는 씬 클라이언트. (초기 P2P의 상태 발산 버그를 이 재설계로 해결.)
- origin 독립: 백엔드 URL 하드코딩 + CORS
*+ WSS → 어느 호스트에서 서빙해도 동일 백엔드에 연결.
레이어 구성 요약
| 레이어 | 저장소 | 역할 |
|---|---|---|
| 도메인 | core | 순수 게임 도메인(Snake·Food·GameState·Collision·FoodSpawner) — 프레임워크 독립 |
| 로컬 루프 | engine | 1P·2P-로컬 게임 루프/입력 |
| UI/통합 | web | Canvas 렌더·PWA·모바일·전체 통합 |
| 권위 서버 | signaling | Cloudflare Worker + Durable Object — 권위 GameDO·매치메이킹·로비 |
| 로비 도메인 | online-core | LobbyRegistry DO·온라인 계약 |
| 매치메이킹 | quickmatch | 랜덤 매치메이킹 클라이언트 |
| 네트코드 | netcode-core / netcode-raw / netcode-interpolated | 플러그블 네트코드 계약 + 전략(스냅샷 / 60fps 보간+서버 리컨실리에이션) |
| 프로토콜 | protocol | wire 프로토콜 타입 SSOT |
| 인증 | auth | Firebase Google 로그인·안정 uid |
| 점수 | leaderboard | Cloudflare Worker + D1 — 점수·유저네임 |
전체 저장소·버전·GitLab URL은 저장소 지도 참고.
설계 핵심
- DDD:
core는 프레임워크에 의존하지 않는 순수 도메인. 온라인/로컬 어느 경로든 동일 도메인을 재사용. - 플러그블 네트코드:
netcode-core가NetcodeClient계약을 정의하고,raw(베이스라인 스냅샷) /interpolated(60fps 보간 + 서버 리컨실리에이션) 전략을 교체 가능하게 구성. - 권위 서버 전환의 이유: 초기 P2P(WebRTC) 접근은 두 브라우저 간 상태 발산 버그를 안고 있었고, 이를 room별 GameDO가 단일 상태·tick을 소유하는 권위 서버 모델로 재설계해 해결했다.