크라우니 마을 멀티플레이 — 회원/초대/만남/채팅 설계 + 용량·부하
개요
"내 마을 = 내 셀(웹페이지)"에 친구를 초대해
같은 셀(룸)에서 만나 채팅한다.
서비스:
presence.crowny.org:9788 (crowny-presence) — 룸(=셀) 단위 경량 WebSocket 릴레이.
정본 프로토콜:
셀코어월드/마을프레즌스.한선 (컴파일·실행 검증 ✓).
4가지 흐름
- 크라우니 회원가입/로그인 — 기존
crowny.org:9852 SSO(인증판정.한선) 재사용. 토큰→{userId, 이름}. 게스트 모드(로컬 닉네임)로 즉시 플레이도 가능.
- 캐릭터/라이온 정하기 — 이미 구현(👤/🦁 인게임 피커,
crowny.human/crowny.lion). 선택값이 프레즌스 패킷에 포함되어 친구 화면에 내 모습으로 보임.
- 친구 초대 — 내 마을 = 내 셀 = 내 URL. 초대 = 링크 공유
os.crowny.org/village?room=<cellId>. 링크 열면 같은 룸 입장. 친구목록은 크라우니 계정에 저장(선택).
- 만나서 채팅 — 룸 입장 → 상태 브로드캐스트 → 원격 플레이어를 아바타로 렌더(기존 drawCharacter 재사용, 이름표 + 말풍선). 채팅=텍스트 브로드캐스트.
프로토콜
- 상태 패킷
[id, x, z, h, anim, humanIdx, lionIdx] ≈ 16B(양자화/델타), 6Hz throttle.
- 채팅
{from, text} 브로드캐스트 → 머리 위 말풍선.
- 관심영역(interest management): 룸이 커지면 가까운 N명만 수신·렌더(원거리는 저빈도).
- 저장 0 — 프레즌스는 휘발(인메모리 룸). 채팅 로그는 기본 미저장(중요 룸만 셀저장소/해시체인 선택 앵커).
용량 · 시스템 부하 (정본 계산값)
클라이언트 대역폭
- 업로드 ≈ 96 B/s (16B×6Hz)
- 다운로드(룸 30명) ≈ 2.8 KB/s ≈ 3KB/s → 2G/3G(≈50KB/s)에서도 여유
서버(릴레이) — 순수 재방송
- 동접 1000 · 룸 ~33 · 6,000 msg/s → 1코어 충분, RAM 수 MB. 룸 단위 수평 샤딩으로 무한 확장.
$20 폰 렌더 부하
- 원격 아바타는 가까운 10명만 렌더 = +720 쿼드/프레임(사람+수호자). Canvas2D 480p 여유.
저장
- 프레즌스 0. 프로필/친구 = 크라우니 계정(KB 단위). 채팅 로그 옵션(소량).
셀코어DB 전체와의 관계
- 룸 = 셀(셀레지스트리.psv의 cell_id). "내 마을" 셀에 친구가 들어오는 구조.
- 첫 로드 54KB(코어+내마을) + 프레즌스 클라이언트 ~2KB → 저사양 폰 예산 유지.
다음 단계(구현 순서)
- presence 릴레이 서버(한선씨 WS, 게이트웨이가 WS 종단) — 룸 join/state/chat 재방송.
- village.js: 프레즌스 클라이언트(WS 연결·내 상태 송신·원격 아바타 렌더·말풍선·채팅 입력). 미연결 시 무해(싱글플레이 유지).
- crowny.org SSO 로그인 진입 + 게스트 닉네임.
- 초대 링크(
?room=) 파싱 → 자동 입장.
- 관심영역·델타 양자화 최적화.