WebAssembly로 재컴파일해 브라우저에서 돌아가는 PSP판 God of War

God of War on PSP, recompiled to WebAssembly and running in the browser

github.com/snuri00 ▲ 150 댓글 83 sn001

요약

PSP판 God of War 두 편을 WebAssembly로 미리 번역해 브라우저에서 실행하는 프로젝트가 공개됐습니다.

GitHub 이용자 snuri00이 공개한 오픈소스 프로젝트입니다. 게임의 MIPS 기계어를 실행 전에 C++로 옮긴 뒤 WebAssembly로 컴파일합니다. 여기에 PSP 운영체제와 그래픽 칩을 다시 구현한 작은 런타임을 붙여 WebGL2로 화면을 그립니다.

왜 중요한가

  • 정적 재컴파일(실행 전에 기계어를 통째로 다른 언어로 번역하는 방식)로 휴대용 게임기 게임을 웹 페이지 하나로 옮길 수 있음을 보였습니다.
  • 다만 같은 스튜디오와 엔진의 게임 두 편만 확인돼, 다른 게임에도 통할지는 아직 모릅니다.

핵심 내용

  • Chains of Olympus는 부팅부터 전투까지 Chrome과 Firefox에서 60fps로 돌아가고, 해상도는 원본의 최대 4배까지 올릴 수 있습니다.
  • 후속작 Ghost of Sparta는 DRM 해제와 시스템 호출 몇 개를 더해 3배 해상도에서 55~60fps로 돌아갑니다.
  • 첫 빌드는 약 6fps였지만, 화면 한 장을 보일 때마다 8프레임을 그리던 문제 등을 고쳐 속도를 끌어올렸습니다.
  • 그래픽 처리를 별도 스레드로 옮겨, 바쁜 전투 장면의 프레임당 시간이 Firefox에서 약 17ms에서 10ms로 줄었습니다.
  • 저장소에는 게임 데이터가 없어 이용자가 가진 디스크 이미지를 직접 변환해야 하며, 결과물은 공개하지 말라고 당부합니다.

HN 반응

  • 운영체제와 그래픽 칩을 흉내 내는 이상 이것도 에뮬레이션이라는 지적과, 정적 재컴파일은 전통적인 에뮬레이션과 다르다는 반론이 맞섰습니다.
  • 일부 이용자는 AI 덕분에 옛 게임 이식이 쉬워져 보존에 좋다고 반겼지만, 보존이 아니라 리마스터에 가깝고 엉성한 이식만 늘어난다는 우려도 나왔습니다.

댓글

30개 표시 · 전체 111개
  1. wren6991 HN

    PSP 게임을 에뮬레이터 없이 브라우저에서 실행합니다. 게임의 MIPS 기계어 코드를 미리 C++로 변환하고, 이를 WebAssembly로 컴파일한 뒤, WebGL2로 화면을 그리는 PSP 운영체제와 그래픽 칩의 소규모 재구현과 연결합니다.

    이런 걸 짚는 게 좀 깐깐해 보일 수는 있는데, 이건 에뮬레이션 스택을 설명한 거잖아요. 많은 에뮬레이터가 이미 대상 기계어 코드를 중간 표현으로 끌어올려서 JIT으로 처리하고 있어요(WASM을 거치지 않을 뿐이죠).

  2. gzalo HN

    대부분의 사람들은 AOT(Ahead-of-time) 컴파일이나 정적 재컴파일을 전통적인 에뮬레이션으로 보지 않는다고 할 겁니다.

  3. pjmlp HN

    지난 세기부터 우리는 그걸 에뮬레이션이라고 불렀고, 지금도 달라진 게 없습니다.

    원래 하드웨어가 대상 시스템에 없다는 것이 핵심입니다.

    수많은 사례 중에서 유명한 예를 하나 들겠습니다.

    에뮬레이션은 예전부터 있던 개념이지만, FX!32는 한 걸음 더 나아갔습니다. 프로그램이 동작하는 방식을 분석한 뒤, 프로그램이 실행되고 나면 바이너리 변환을 이용해 네이티브 Alpha 코드로 된 DLL(동적 연결 라이브러리) 파일을 만들었고, 애플리케이션은 다음 실행 때 이를 사용할 수 있었습니다. 이 덕분에 초기 1.0 버전에서도 FX!32는 Win32 x86 애플리케이션을 네이티브 x86 코드의 40~50% 속도로 실행했고, 최적화가 개선되면 70%까지 나올 것으로 전망되었습니다. 1999년 컴팩이 내놓은 1.5 버전은 인텔 MMX 명령어 세트 에뮬레이션을 포함해 Alpha 21264(EV6) CPU를 지원하도록 추가되었습니다.

    https://en.wikipedia.org/wiki/FX!32

  4. athrowaway3z HN

    지난 세기부터 우리는 그걸 에뮬레이션이라고 불렀고, 지금도 달라진 게 없습니다.

    '에뮬레이션'은 디지털 시스템 밖에서도 쓰이는 일반적인 영어 단어입니다.

    어떤 집단은 그 분야에서 어휘를 넓혀야 하는 문제와 해법을 만났고, 그래서 이 일반적인 단어를 특정한 기법을 가리키는 말로 다시 쓰고 다른 기법에는 다른 용어를 쓰기로 했습니다.

    당신은 그게 다른 방식을 택한 또 다른 집단에 대한 당신의 기억과 맞지 않는다고 불평하는 겁니다.

    마음껏 불평하세요. 하지만 언어는 원래 이렇게 굴러갑니다. 지금 로블록스를 하는 아이들도 크면 똑같은 소동을 자기들 방식으로 되풀이할 겁니다.

  5. rowanG077 HN

    CPU는 더 이상 에뮬레이션하지 않더라도 나머지 시스템은 분명히 에뮬레이션하고 있잖아요. 그러니 전통적인 에뮬레이션과 아주 가깝다고 봅니다.

  6. wren6991 HN

    CPU 쪽도 좀 묘한 위치에 있습니다. 변환된 C++를 보면 명령어를 MIPS CPU 상태 객체를 조작하는 코드로 옮기고 있는 것 같거든요.

    https://github.com/jessicanataliagta/PSPRecomp/blob/main/src/runtime.cpp

  7. Rohansi HN

    그 정도면 WINE이 하는 일과 거의 같은데, WINE은 에뮬레이터가 아니라고들 하잖아요. 윈도 유저랜드를 작게 재구현하고 DirectX를 Vulkan/OpenGL로 변환하는 거니까요. 그럼 x86 -> ARM 바이너리 변환을 AOT로 해서 WINE으로 돌리면 그건 에뮬레이터인가요?

  8. armada651 HN

    https://github.com/wine-mirror/wine/blob/master/loader/main.c#L2

    WINE 스스로가 WINE은 에뮬레이터라고 말하고 있습니다.

    결국 에뮬레이션과 네이티브 코드 사이에는 스펙트럼이 있고, 어디에 선을 긋느냐는 임의적이고 주관적인 선택입니다.

  9. vrighter HN

    저라면 소프트웨어 라이브러리를 재구현하는 것, 아니 새 아키텍처로 포팅하는 것은 에뮬레이션으로 치지 않겠습니다. 게임 코드 자체를 변환할 수 있다면 그 코드가 의존하는 라이브러리라고 변환하지 못할 이유가 있나요?

  10. wren6991 HN

    WINE이 에뮬레이터가 아니라면 YAML도 마크업 언어가 아니겠네요.

  11. knome HN

    WINE을 에뮬레이션으로 본다면 실행 파일을 어떤 식으로든 변환할 거라고 기대하겠지만, WINE은 바이너리를 있는 그대로 불러와서 실행합니다. PE/COFF 로더를 제공하고, 윈도 API를 리눅스 네이티브 구현으로 대체하는 거죠. 원본 실행 파일의 기계어 코드가 프로세서에서 직접 실행됩니다.

  12. taspeotis HN

    Yelling At My Laptop(내 노트북에 소리 지르기)이겠죠.

  13. manwe150 HN

    얼마 전에 Fable한테 할 일 목록을 관리하고 편집할 수 있는 작은 CRUD 앱을 짜 달라고 했어요. 그랬더니 데이터베이스를 git에 저장하는 YAML 파일로 만들었더라고요. 왜 데이터베이스를 안 쓰냐고 물었더니, 원할 때 언제든 파일을 직접 편집할 수 있고, 원하는 곳으로 동기화할 수 있고, git 병합으로 일관성도 믿을 만하게 유지되니까 원격 데이터베이스 작업에 의존할 필요가 없다면서 그 선택을 옹호하더군요.

  14. taspeotis HN

    Yelling At Your Application(당신의 애플리케이션에 소리 지르기)이네요.

  15. wvenable HN

    제가 보기엔 바이너리를 그냥 통째로 컴파일해서 넣은 에뮬레이터 같습니다. 이런 코드가 엄청나게 많거든요.

    https://github.com/jessicanataliagta/PSPRecomp/blob/main/profiles/vcs/generated/generated_unit_0000.cpp

  16. mawadev HN

    보고 웃음이 났네요.

  17. accrual HN

    참고로 PSP로 나온 갓 오브 워 두 편은 이 플랫폼에서 그래픽이 가장 인상적인 게임으로 꼽혔습니다. 둘 다 콘솔 수명 후반(2008년과 2010년)에 나왔고요.

    IGN 리뷰는 그중 한 편을 두고 "상당수의 PS2 게임보다 나아 보인다"고 평했습니다. [0] 저도 한 편을 해 봤는데, 정말 크기만 줄인 PS2 게임을 하는 느낌이었습니다.

    [0] https://web.archive.org/web/20121020044819/http://www.ign.com/articles/2010/10/25/god-of-war-ghost-of-sparta-review

  18. __natty__ HN

    맞아요, 이 게임이 RAM 32MB짜리 포켓 사이즈 콘솔에서 돌아갔는데 그래픽이 그렇게 좋고 세밀했다니까요!

  19. mayli HN

    RAM 32MB라니, 대단하네요.

  20. ChrisRR HN

    저는 오히려 요즘은 기본적인 소프트웨어가 돌아가는 데 수백 MB의 RAM이 필요하다는 게 더 놀랍습니다.

  21. PetitPrince HN

    개발사는 Ready at Dawn입니다. 이후 인터랙티브 영화 The Order 1886(평가는 좋지 않았죠)을 만들었고, Facebook에 인수된 뒤에는 호평받은 VR 게임(Lone Echo, Lone Arena)을 만들었다가, VR로는 충분한 돈을 벌 수 없어서 문을 닫았습니다.

  22. rtpg HN

    제 기억엔 PSP를 오버클럭했던 걸로 아는데요?

  23. SpecialistK HN

    출시 때부터 2007년까지 PSP는 222MHz로 제한되어 있었습니다. 펌웨어 3.50 이후 333MHz 전체가 풀렸고요. 갓 오브 워 시리즈는 그 이후에 나왔으니 333MHz를 다 썼을 거라고 봅니다.

  24. mkotlikov HN

    상업용 소프트웨어 대부분이 서버 사이드 렌더링이나 스트리밍으로만 가는 건 언제쯤일까요? 2027년 1월쯤엔 GTA 6를 바이브 코딩으로 만들고 있는 거 아닐까요?

  25. pyvpx HN

    스태디아를 다시 켤 거예요. 요즘 개인용 그래픽 카드랑 메모리를 누가 살 수 있겠어요?

  26. pjc50 HN

    그런데 마이크로소프트는 자사 스트리밍 플랫폼 가격을 올리고 있어요. https://www.cnbc.com/2026/09/03/microsoft-xbox-game-pass-cloud-limits.html

  27. Zambyte HN

    그 GPU를 LLM 추론이나 학습에 쓸 수 있는데 게임 스트리밍을 감당할 여력이 누구한테 있겠어요?

  28. pyvpx HN

    구글이요. 그걸로 유명하잖아요. (힌트: TPU)

  29. fb03 HN

    AI가 에뮬레이션 거품을 완전히 박살 내고 있어요. 이젠 에뮬레이션을 하는 게 아니라 그냥 리버스 엔지니어링해서 게임을 바로 포팅하잖아요. 오래된 게임 보존에는 최고의 시대입니다. 이 인간들은 이제 그 게임들로 돈을 벌지도 않으면서 IP를 풀지도 않고, 옛 게임을 더 접근하기 쉬운 새 플랫폼용으로 내놓지도 않아요. 그래서 이런 개발자들이 해 온 작업이 정말 고맙습니다.

  30. Gonxa6282 HN

    솔직히 저는 멋진 시대라고 생각하지 않아요. AI는 다들 하나(혹은 두 개)의 프로젝트에 모여 기여하는 대신 각자 알아서 하게 부추기는 면이 있는데, 오픈 소스 전체에서 제가 걱정하는 부분이 바로 그거예요. AI를 써서 하나의 디컴파일 프로젝트에 기여하고, 그걸 최대한 좋게 만들면서 게임에 대한 지식을 모았다면 훨씬 더 나았을 거예요. 그런데 지금은 어설프게 바이브 코딩한 포팅이 산더미처럼 쏟아지고 있죠.

Hacker News에서 보기 ↗