PS2 게임을 WebAssembly로 정적 재컴파일한 오픈소스 프로젝트, GT4 쇼룸 프레임이 초당 3에서 16으로 올라감
- ps2-web-recomp는 PS2 게임의 EE 코드를 AOT로 미리 번역하고 VU1 마이크로프로그램은 처음 본 것을 기록해 AOT로, 나머지는 브라우저에서 wasm으로 JIT하는 방식임
- Gran Turismo 4 쇼룸은 GS 렌더러를 WebGPU로 바꾼 뒤 초당 약 3프레임에서 16프레임으로 올랐고, 남은 시간의 대부분은 VU1 인터프리터가 차지함
- 사이클 정확도는 아니고, 블록마다 명령어 수만큼 사이클 예산을 차감하며 인터럽트, 타이머, DMA, vblank를 블록 경계에서 전달하는 방식으로 근사함
- 디스크 읽기가 아직 도착하지 않은 데이터는 1ms 뒤 재시도하는 에뮬레이티드 시간 대기로 처리해서, 느린 네트워크에서도 GT4 레이스 로딩 중 에뮬레이터가 멈추지 않음
- 네이티브 Linux 빌드는 Vulkan과 wgpu로 Steam Deck에서 비Steam 게임으로 실행되지만, 게임 ISO는 배포하지 않고 사용자가 PC에서 직접 변환해야 함
Hacker News opinions
정적 재컴파일인데 VU 같은 타이밍 민감한 하드웨어는 어떻게 처리하는지 궁금함. 사이클 단위 정확도 없이 어디까지 맞출 수 있는 건지 알고 싶음.
사이클 정확하지는 않음. 블록마다 명령어 수만큼 사이클 예산을 빼고, 인터럽트랑 타이머, DMA, vblank는 한 클록 위의 이벤트로 블록 경계에서 전달함. 순서는 맞고 타이밍은 근사임.
VU 프로그램은 실행파일에 없고 DMA로 올라옴. 처음 업로드될 때 기록해서 AOT로 컴파일하고, 못 본 건 브라우저에서 wasm으로 JIT함. MAC이랑 플래그가 4명령어 늦게 보이게 모델링 안 하면 GT4 차에 얼룩이 생긴다고 함.
이거 Forza에도 되면 좋겠다.
CD 로딩 없는 GT를 누가 하고 싶냐고 ㅋㅋ 근데 디스크 제대로 읽혔는지 숨 참고 기다리던 그 순간은 좀 그립긴 함.
스팀덱에서도 되면 좋겠음. 네이티브 리눅스 빌드는 이미 있어서 비Steam 게임으로 돌릴 수는 있는데, 호스트가 아직 스레드 하나만 쓰고 ISO는 PC에서 직접 변환해야 함.
브라우저에서 컴파일러 자체를 wasm으로 올리면 프로젝트를 브라우저에서 바로 변환할 수 있지 않음?
그게 맞는 방향인데 GoW2 기준으로 C++이 67만 줄이라 브라우저에서 clang 돌리는 건 무거움. 차라리 wasm을 직접 뱉게 하면 ISO도 로컬에서만 변환돼서 게임 파생물을 호스팅할 일이 없음.
에뮬레이터를 그대로 감싸놓고 재컴파일이라고 내세우는 프로젝트가 너무 많아서 진짜 재컴파일 찾기가 점점 어려워짐.