본문으로 건너뛰기

아키텍처 개요

브라우저(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) — 프레임워크 독립
로컬 루프engine1P·2P-로컬 게임 루프/입력
UI/통합webCanvas 렌더·PWA·모바일·전체 통합
권위 서버signalingCloudflare Worker + Durable Object — 권위 GameDO·매치메이킹·로비
로비 도메인online-coreLobbyRegistry DO·온라인 계약
매치메이킹quickmatch랜덤 매치메이킹 클라이언트
네트코드netcode-core / netcode-raw / netcode-interpolated플러그블 네트코드 계약 + 전략(스냅샷 / 60fps 보간+서버 리컨실리에이션)
프로토콜protocolwire 프로토콜 타입 SSOT
인증authFirebase Google 로그인·안정 uid
점수leaderboardCloudflare Worker + D1 — 점수·유저네임

전체 저장소·버전·GitLab URL은 저장소 지도 참고.


설계 핵심

  • DDD: core 는 프레임워크에 의존하지 않는 순수 도메인. 온라인/로컬 어느 경로든 동일 도메인을 재사용.
  • 플러그블 네트코드: netcode-coreNetcodeClient 계약을 정의하고, raw(베이스라인 스냅샷) / interpolated(60fps 보간 + 서버 리컨실리에이션) 전략을 교체 가능하게 구성.
  • 권위 서버 전환의 이유: 초기 P2P(WebRTC) 접근은 두 브라우저 간 상태 발산 버그를 안고 있었고, 이를 room별 GameDO가 단일 상태·tick을 소유하는 권위 서버 모델로 재설계해 해결했다.