← 목록
기타 2026-06-22 4KB 읽기 4분

크라우니OS 마을 — 이동엔진 WASM 결선 (브라우저가 한선씨 기계어로 이동 계산)

개요

두근두근타운(3인칭 걸어다니는 마을, village.js)의 플레이어 이동 계산을 JS에서 한선씨 트릿 기계어(WASM)로 이관했다. 이전엔 "로직 정본=한선씨, 실시간=JS 미러"였으나 이동의 핵심(정규화·카메라회전·슬라이딩 충돌·경계 클램프)은 여전히 JS가 계산했다. 이제 그 계산을 브라우저가 이동.wasm(한선씨→toau2c→clang wasm32, ISA729 TOAU)으로 매 프레임 실행한다. JS의 유일한 실질 장점(실시간 속도)을 WASM 브릿지가 흡수 — 결정성·이식성·헌법정합을 잃지 않고.

무엇을 했는지

  1. 이동엔진 코어 자립화 (crownyc/libs/이동엔진.한선)
- 루트(SQRT, opcode 604)가 MCU/WASM 런타임(runtime_mcu.c)에 미구현 → 패스스루(루트(2000000)=2000000 그대로 반환)임을 실측 발견. - C 런타임 무수정 원칙 유지 → 한선씨로 정수 제곱근 정수루트(헤론법 + 양방향 ±1 보정) 구현. 자연반올림 오차를 보정해 floor(sqrt) 정확. 네이티브=WASM 바이트 일치 검증(999/1000/1414/1415). - 이동벡터루트 호출을 정수루트로 교체.
  1. WASM 진입 래퍼 (crownyc/libs/이동엔진_입력.한선) 신규
- 호스트가 wasm_in 버퍼에 줄단위 직렬화한 이동요청을 읽어 이동벡터+이동시도 호출 후 새 좌표 출력. - 입력: px pz mode mx mz azim dxr dzr step / nB+박스(×4) / nC+원(×3). 출력: nx nz. 좌표=×1000 밀리유닛 정수.
  1. 빌드: wasm/toau2c-wasm-build.sh libs/이동엔진_입력.한선 시작화면/이동.wasm → 131KB wasm32.
  2. JS 브릿지 (시작화면/이동-wasm.js) 신규 — geocell-wasm.js 패턴
- MoveEngine.step({px,pz,mode,mx,mz,azim,dxr,dzr,step,boxes,circles}) → {nx,nz}. - WASM 우선, 미로드/오류 시 동일 로직 JS 폴백(stepJS). ready Promise, wasmReady().
  1. village.js 결선: updatePlayer가 입력→이동요청만 JS에서 판정하고, 계산은 MoveEngine.step에 위임. heading은 실제 이동 델타로 산출. 브릿지 미로드 대비 인라인 moveFallback 추가.
  2. village.html: <script src='이동-wasm.js'>를 village.js 앞에 로드.

검증

  • 네이티브 vs WASM 교차검증 6케이스(이동/키회전/원충돌/경계클램프/D키azim90/대각선+박스) 전부 바이트 일치.
  • 브라우저 경로 시뮬(node, document/fetch 모킹) 2000 무작위 케이스 WASM vs JS폴백 최대편차 0.0016 월드유닛(밀리유닛 양자화 이내), 0.01 초과 0건.

관련 파일

  • /Users/ef/CrownyOS/crownyc/libs/이동엔진.한선 (코어 정본, +정수루트)
  • /Users/ef/CrownyOS/crownyc/libs/이동엔진_입력.한선 (WASM 진입, 신규)
  • /Users/ef/CrownyOS/시작화면/이동.wasm (131KB, 신규 빌드)
  • /Users/ef/CrownyOS/시작화면/이동-wasm.js (JS 브릿지, 신규)
  • /Users/ef/CrownyOS/시작화면/village.js (updatePlayer 위임)
  • /Users/ef/CrownyOS/시작화면/village.html (브릿지 로드)
  • 배포: 위 4개 → /Users/ef/CrownyOS/os-site/ (os.crowny.org)

함정 (학습)

  • 루트(SQRT 604)는 runtime_mcu.c(MCU/WASM 런타임)에 미구현 — 패스스루. WASM/MCU 백엔드에서 sqrt 필요 시 한선씨로 정수루트 구현해 자립할 것. crownyc 인터프리터(VM)는 정상.
  • 헤론 정수루트는 자연반올림으로 ±1 오차 가능 → 동안(x*x>n)x--/동안((x+1)²<=n)x++ 양방향 보정 필수.
  • 고정소수점 ×1000 밀리유닛 + 충돌 제곱은 ÷10(센티유닛)로 축소해 오버플로 회피.

잔여 이슈

  • 같은 패턴으로 NPC/펫/새 액터 이동·AI도 WASM 이관 가능(현재 JS). 다만 액터는 결정성 요구가 낮아 우선순위 낮음.
  • 마을 콘텐츠 확장(상점·실내 진입)은 별개 트랙.