libretro 코어 완전 해부 – snes9x, mGBA, mupen64plus는 무엇인가
RetroArcade에서 게임을 실행하면 내부적으로 snes9x, mGBA, mupen64plus_next 같은 이름이 동작합니다. 이것이 바로 libretro 코어입니다. "에뮬레이터"라고 뭉뚱그려 부르지만, 실제로는 화면·입력을 담당하는 껍데기와 게임을 실제로 돌리는 엔진이 분리되어 있습니다. 이 구조를 이해하면 "왜 같은 콘솔인데 코어가 여러 개인지", "왜 N64는 무거운지"가 한 번에 풀립니다.
libretro — 프론트엔드와 코어를 나누는 약속
libretro는 "프론트엔드(화면·입력·세이브·UI를 담당하는 프로그램)"와 "코어(특정 게임기를 흉내 내는 엔진)"가 서로 대화하는 방식을 정해 둔 표준 인터페이스(API)입니다. 같은 약속만 지키면 어떤 프론트엔드든 어떤 코어든 끼워 쓸 수 있습니다. 가장 유명한 프론트엔드가 데스크톱용 RetroArch이고, RetroArcade가 사용하는 EmulatorJS는 "브라우저용 프론트엔드"인 셈입니다.
💡 비유하자면 libretro는 "콘센트 규격"입니다. 규격(API)만 맞으면 어떤 가전(코어)이든 어떤 콘센트(프론트엔드)에 꽂아도 작동합니다.
코어(core)는 정확히 무엇을 하나
코어는 특정 게임기의 CPU·그래픽·사운드 칩을 소프트웨어로 재현합니다. 프론트엔드가 ROM 데이터를 코어에 넘기면, 코어는 그것을 한 프레임씩 계산해 "이번 프레임의 화면 픽셀과 오디오 샘플"을 돌려줍니다. 프론트엔드는 그 결과를 화면에 그리고 스피커로 내보낼 뿐입니다. 즉 에뮬레이션의 핵심 두뇌는 코어이고, 프론트엔드는 입출력 창구입니다.
RetroArcade가 사용하는 코어들
| 시스템 | 코어 | 특징 |
|---|---|---|
| PlayStation | pcsx_rearmed | ARM·모바일 환경에 최적화되어 가볍고 빠름. 브라우저에 적합 |
| SNES | snes9x | 호환성과 속도의 균형이 좋은 표준 SNES 코어 |
| GBA | mGBA | 정확도와 속도를 모두 잡은 현대 GBA 표준 코어 |
| Nintendo 64 | mupen64plus_next | GLideN64 기반. N64 구조 특성상 가장 무거움 |
| NES | fceumm | 가볍고 호환성 높은 NES 코어 |
| Genesis/MD | genesis_plus_gx | 메가 드라이브·마스터 시스템·게임 기어까지 폭넓게 지원 |
이 코어 구성은 WebAssembly 에뮬레이션 글에서 다룬 "왜 브라우저에서 네이티브에 가까운 속도가 나는가"와 직접 연결됩니다.
정확도 vs 성능 — 한 콘솔에 코어가 여러 개인 이유
같은 게임기를 재현하는 코어가 여러 개인 경우가 많습니다. 핵심은 정확도와 성능의 트레이드오프입니다. 예를 들어 SNES에는 snes9x 외에 bsnes(higan) 계열이 있는데, bsnes는 실제 칩 동작을 극단적으로 정밀하게 흉내 내 호환성·정확도가 최고 수준이지만 그만큼 무겁습니다. 반대로 snes9x는 약간의 근사치를 허용하는 대신 훨씬 가볍게 돌아갑니다.
브라우저처럼 자원이 제한된 환경에서는 "충분히 정확하면서도 가벼운" 코어가 유리합니다. 그래서 RetroArcade는 정확도 최상위(bsnes·Mednafen 같은) 코어보다, 속도·호환성 균형이 좋은 코어를 기본으로 채택합니다. N64에서 정확도와 성능이 특히 까다로운 이유는 N64 에뮬레이션이 어려운 이유에서 자세히 다뤘습니다.
자주 묻는 질문 (FAQ)
libretro와 RetroArch는 같은 건가요?
아닙니다. libretro는 "약속(API)"이고, RetroArch는 그 약속을 따르는 대표적인 프론트엔드(프로그램)입니다. RetroArcade가 쓰는 EmulatorJS도 같은 libretro 코어를 브라우저에서 구동하는 또 다른 프론트엔드입니다.
코어마다 호환성이 다른 이유는?
코어마다 재현 방식과 정밀도가 다르기 때문입니다. 어떤 게임은 특정 코어에서 완벽히 돌고 다른 코어에서는 그래픽 오류가 날 수 있습니다. 정확도 중심 코어일수록 호환성은 높지만 더 무겁습니다.
브라우저 코어는 데스크톱 코어와 다른 코어인가요?
같은 소스의 libretro 코어를 WebAssembly로 컴파일한 것입니다. 즉 데스크톱 RetroArch에서 쓰는 snes9x와 브라우저의 snes9x는 본질적으로 동일한 엔진이며, 실행 환경(네이티브 vs WASM)만 다릅니다.