하나의 앱, 세 가지 모드 (개인 · PC방 · 대회장)
RocketUp의 PC방·대회장 기능은 별도로 설치하는 전용 프로그램이 아닙니다. 개인용과 완전히 같은 앱 안에서 '모드 토글' 하나로 켜집니다. 설정에서 개인 / PC방 / 대회장 중 하나를 고르면 좌측에 좌석맵·핑 매트릭스·네트워크 궁합 탭이 즉시 나타나고, 개인으로 되돌리면 다시 감춰집니다.
선택한 모드는 각 PC의 로컬 설정 파일(app_mode.txt)에 저장되어 재실행 후에도 유지됩니다. PC방과 대회장은 내부적으로 완전히 동일한 인프라를 씁니다 — 좌석 발견, 좌석맵, 핑 비교 로직이 같고, 화면 상단 배지(‘PC방 모드’ / ‘대회장 모드’)만 달라집니다. 대회장은 같은 기능을 대회 운영자 관점에서 쓰는 프리셋이라고 이해하시면 됩니다.
이렇게 '같은 코드베이스 + 모드 토글' 구조를 택한 이유는, 개인 사용자가 쓰던 최적화·측정 기능을 PC방 환경에서 그대로 재사용하면서도 운영자에게 필요한 좌석 단위 시야만 얹기 위해서입니다.
- AppMode 열거형: Personal / PcCafe / Tournament 3단계
- 모드 전환 즉시 반영 — ModeChanged 이벤트로 좌석 탭 표시·숨김 자동 갱신
- %LOCALAPPDATA%\TeamPing\config\app_mode.txt 에 영속화(재실행 후 유지)
- PC방·대회장은 동일 인프라 공유, 상단 배지만 차등
- 별도 설치 파일 없이 기존 앱 안에서 토글
같은 공유기 뒤 PC 자동 그룹화 (venue)
PC방에서 가장 번거로운 일이 '어느 PC를 한 그룹으로 묶을지' 지정하는 것입니다. RocketUp은 이 과정을 없앴습니다. 각 PC의 앱이 중앙 서버에 자기 좌석 정보를 주기적으로 보내면, 서버는 요청이 나온 공인 IP(공유기의 NAT 출구 주소)를 기준으로 자동으로 같은 venue(장소)로 묶습니다. 같은 PC방 PC들은 하나의 공유기를 통해 인터넷에 나가므로 공인 IP가 같고, 다른 PC방은 IP가 달라 자연스럽게 분리됩니다.
덕분에 venue 코드 입력이나 별도 로그인·인증이 필요 없습니다. 서버는 공인 IP를 그대로 저장하지 않고 해시로 변환해 짧은 식별자(v_xxxxxxxxxx)만 사용하므로, 원본 IP를 노출하지 않으면서도 같은 장소는 항상 같은 그룹으로 안정적으로 묶입니다.
좌석 정보는 서버 메모리에만 두며, 일정 시간(약 20초) 동안 보고가 없는 좌석은 자동으로 사라져 유령 좌석이 남지 않습니다. 이 venue 집계 기능은 기존 룸(파티) 기능과 완전히 독립적으로 추가되어, 기존 동작에 영향을 주지 않습니다.
- 공인 IP(NAT egress) 기준 자동 그룹화 — venue 코드·인증 불필요
- 다단 프록시 대응: X-Forwarded-For 최좌측(원본 클라이언트 IP) 우선 사용
- 공인 IP는 SHA-256 해시 → 짧은 venue id로 변환(원본 IP 미노출)
- 서버 인메모리 집계, 약 20초 미보고 좌석 자동 만료
- 기존 룸 API와 완전 독립된 추가형 설계
좌석맵과 좌석별 핑 — 두 경로로 발견
좌석맵은 같은 장소의 PC를 카드 형태로 보여줍니다. '이 PC' 카드에는 호스트명·로컬 IP·게이트웨이(공유기) 주소·서브넷과 함께, 게이트웨이 핑과 외부 핑(게임 경로 대용 앵커)이 색상 등급과 함께 표시됩니다. 다른 좌석 카드에는 해당 PC까지의 왕복 지연(RTT)이나 그 좌석의 게이트웨이 핑이 나타납니다.
좌석 발견은 두 경로를 동시에 씁니다. 첫째, LAN 자동발견은 같은 네트워크의 PC끼리 UDP 브로드캐스트로 서로를 직접 찾습니다(약 2초 간격 비콘). 서버를 전혀 거치지 않아 부담이 없고, 발견 즉시 각 좌석에 직접 핑을 보내 실제 PC간 지연을 잽니다. 둘째, 서버 venue 집계는 앞서 설명한 공인 IP 그룹화로, VLAN이 브로드캐스트를 막아 서브넷이 갈린 환경에서도 좌석을 묶어줍니다. 앱은 이 둘을 병합해 하나의 좌석맵으로 보여주며, 각 카드에 출처(LAN / 서버 / LAN+서버)를 표시합니다.
한쪽 경로가 막혀도 다른 쪽이 계속 동작하도록 설계됐습니다. 브로드캐스트가 차단되면 서버 집계로, 서버가 불가하면 LAN 발견으로 보강됩니다.
- LAN 자동발견: UDP 브로드캐스트(포트 47777), 약 2초 비콘, 약 8초 미수신 시 좌석 만료
- 발견된 좌석마다 직접 ICMP 핑으로 실제 RTT 측정
- 서버 venue 집계(약 3초 폴링)로 VLAN·서브넷 분리 환경 보강
- LAN·서버 두 소스를 병합, 카드별 출처 표시(LAN / 서버 / LAN+서버)
- '이 PC' 카드: 호스트명·로컬IP·게이트웨이·서브넷 + 게이트웨이/외부 핑 등급 색상
핑 매트릭스와 네트워크 궁합
'네트워크 궁합'은 좌석들 사이의 네트워크 품질이 얼마나 고르게 좋은지를 한 줄로 요약합니다. 각 좌석이 측정한 외부 경로(게임 경로 대용 공용 앵커) 핑을 모아 평균과 좌석 간 편차를 계산하고, 가장 나쁜 좌석 값과 편차를 함께 보고 '우수 / 양호 / 주의' 등급을 매깁니다. 모든 자리가 비슷하게 낮은 핑이면 어느 자리에 앉아도 공정하고 쾌적하다는 뜻이고, 특정 좌석만 튀면 그 자리를 점검 대상으로 볼 수 있습니다.
등급 기준은 코드에 명시돼 있습니다 — 가장 나쁜 좌석이 30ms 이하이고 편차가 15ms 이하이면 '우수', 60ms·30ms 이하이면 '양호', 그 밖은 '주의'입니다. 이 값들은 임의로 부풀린 마케팅 수치가 아니라 화면 판정에 실제로 쓰이는 임계값입니다.
현재 버전은 '이 PC → 각 좌석' 방향의 핑을 등급화하고, 좌석들의 외부 핑 일관성으로 궁합을 산정합니다. 좌석 간 전면 N×M 매트릭스와 실제 게임 서버 기준 궁합은 서버 venue 집계를 통해 다음 단계에서 보강될 예정이며, 이 점은 화면에도 그대로 안내되어 있습니다.
- 궁합 = 좌석들의 외부(게임경로 대용) 핑 일관성 — 평균·편차·최악값 기반
- 등급 임계값(코드 명시): 우수 ≤30ms·편차≤15ms / 양호 ≤60ms·편차≤30ms / 그 외 주의
- 좌석 핑 색상 등급(코드 명시): ≤5ms 녹색, ≤20ms 노랑, 그 이상 적색
- 외부 품질 앵커로 빠르고 안정적인 공용 IP(1.1.1.1) 사용
- 전면 N×M 좌석간 매트릭스는 다음 단계 — 화면에 정직하게 명시
휘발성 재적용 — Deep Freeze 환경 대응
많은 PC방·대회장 PC는 Deep Freeze 같은 복원 솔루션을 써서, 재부팅하면 세션 중 바뀐 내용이 모두 초기 상태로 되돌아갑니다. 이 경우 네트워크 최적화로 적용했던 레지스트리·NIC 설정도 재부팅과 함께 사라집니다.
'휘발성 재적용' 모드를 켜면(기본은 꺼짐, PC방 권장), 앱이 부팅되어 실행될 때마다 직전에 적용했던 네트워크 최적화를 세션당 한 번 자동으로 다시 적용합니다. 중요한 점은 이 재적용이 별도의 위험한 경로가 아니라, 평소 사용자가 쓰던 검증된 최적화 실행 경로를 그대로 재사용한다는 것입니다 — 즉 관리자 권한 확인, 적용 전후 측정, 필요 시 롤백까지 동일하게 거칩니다. 재적용은 venue 모드이고, 이전에 최적화를 적용한 기록이 있으며, 이번 세션에 아직 재적용하지 않았을 때만 실행되어 중복 적용을 막습니다.
이 기능은 '설정을 영구히 고정'하는 것이 아니라, 휘발성 환경에서 '부팅마다 원래 상태로 한 번 복구'하는 방식임을 분명히 합니다.
- 기본 OFF, PC방 권장 — 설정에서 명시적으로 켜야 동작
- 부팅(앱 시작) 시 세션당 1회 자동 재적용, 중복 실행 차단
- 기존 검증 경로 재사용 — 관리자 권한 확인·측정·롤백 그대로 수행
- 조건 게이트: 켜짐 + venue 모드 + 이전 적용 기록 존재
- 적용 기록 마커 파일로 '재적용할 프로파일 유무' 판단
라우터 설정은 한 대만 — 경쟁 방지 락
같은 공유기 하나에 여러 PC가 동시에 라우터 SQM 설정을 밀어넣으면 설정 파일과 백업이 서로 충돌합니다. RocketUp은 이를 두 겹의 잠금으로 막습니다. 같은 프로세스 안에서의 중복 적용은 로컬 세마포어로 즉시 차단하고, 서로 다른 PC들 사이의 경쟁은 라우터 쪽 원자적 락(디렉터리 생성 방식)으로 조정합니다.
결과적으로 같은 공유기에는 '관리자석(호스트) 1대'만 실제 라우터 설정을 적용하고, 그 사이 다른 PC가 접근하면 '다른 PC가 설정 중'이라는 안내와 함께 그 PC는 라우터를 건드리지 않고 PC측 최적화만 수행합니다. 락은 일정 시간(약 180초) 갱신이 없으면 만료 회수되어, 설정하던 PC가 중간에 멈춰도 다른 PC가 이어받을 수 있습니다.
이 정책은 좌석맵 화면의 '라우터 설정 정책' 카드에도 그대로 안내되어, 운영자가 어떤 PC를 관리자석으로 둘지 명확히 알 수 있게 합니다.
- 같은 공유기 = 관리자석(호스트) 1대만 라우터 설정 적용
- 프로세스 내 중복 차단: 라우터별 로컬 세마포어
- PC 간 경쟁 차단: 라우터측 원자적 mkdir 락(약 180초 stale 회수)
- 락 점유 중 다른 PC는 PC측 최적화만 수행(라우터 미변경)
- 좌석맵 화면에 라우터 설정 정책 카드로 명시
보장되는 것: 같은 공유기 뒤 PC의 자동 그룹화, 좌석맵, LAN(UDP)·서버 두 경로 좌석 발견, 좌석별 핑 등급화와 궁합 요약, AppMode 토글, 휘발성 재적용(검증된 최적화 경로 재사용)은 모두 코드에 구현되어 있습니다. 조건부인 것: 좌석 발견은 네트워크 환경에 따라 달라져 브로드캐스트가 차단되면 서버 집계로, 서버가 불가하면 LAN 발견으로 각각 보강되며 둘 다 막히면 자기 PC만 보일 수 있습니다. 좌석 간 전면 N×M 매트릭스와 실제 게임 서버 기준 궁합은 아직 다음 단계 작업이며, 라우터 SQM 적용의 실제 효과는 공유기·ISP가 지원할 때의 best-effort입니다. 'N배 빨라짐' 같은 성능 배수는 측정 근거가 없어 제시하지 않습니다.