EmulatorJS 是什麼?模擬引擎詳解

EmulatorJS 是開源的 JavaScript 封裝層,讓 libretro 核心能在任何現代瀏覽器中執行。以下說明它的功能、重要性,以及它能和不能模擬什麼。

Mira Köhler 最後審閱

定義

EmulatorJS 是一個開源的 JavaScript 前端,包裝已編譯為 WebAssembly 的 libretro 模擬器核心。它在 2017 年首次發佈,現在由 GitHub 上的貢獻者社群維護。它公開了一個簡單穩定的 API——載入 ROM 、設置控制、儲存狀態、擷取螢幕截圖——並隱藏了底層核心的複雜性。

內部運作原理

libretro 是一個專案,用來標準化模擬器核心(模擬主機的 CPU、記憶體和圖形的程式)與前端(連接控制、音訊和畫布的使用者介面)之間的介面。EmulatorJS 取用現有用 C/C++ 撰寫的 libretro 核心——例如 SNES 用的 Snes9x、NES 用的 FCEUmm、Game Boy Advance 用的 mGBA——並使用 Emscripten 將其編譯為 WebAssembly。

當你載入遊戲時,EmulatorJS 會將適當的核心串流至 Web Worker,將 ROM 位元組傳遞給它,並公開一個由核心每秒渲染 60 次的畫布。音訊通過 Web Audio 的 AudioWorklet 進行低延遲播放。輸入來自鍵盤、螢幕上的觸控覆蓋層或 Gamepad API。

支援的系統

EmulatorJS 支援廣泛的卡帶時代和早期光碟時代的硬體:

  • 任天堂:NES、SNES、Game Boy、Game Boy Color、Game Boy Advance、Nintendo 64
  • Sega:Master System、Genesis/Mega Drive、Sega CD、32X、Saturn
  • NEC:PC Engine / TurboGrafx-16、PC-FX
  • Atari:2600、5200、7800、Lynx、Jaguar
  • Sony:PlayStation 1
  • SNK:Neo Geo、Neo Geo Pocket / Color
  • 其他:Arcade (MAME)、MSX、ColecoVision、Vectrex、WonderSwan

目前無法模擬的內容

EmulatorJS 受限於在瀏覽器中順利執行的內容。PlayStation 2、GameCube、Xbox、Wii 和 3DS 都不在考慮範圍內——它們需要 GPU 驅動、瀏覽器出於安全考量而限制的 JIT 編譯,以及數 GB 的 RAM。隨著 WebGPU 和 SharedArrayBuffer 的成熟,最終會支援這些平台,但截至 2026 年中期,它們仍只能在原生環境中執行。

EmulatorJS vs RetroArch vs 自訂 WASM 移植

RetroArch 是 libretro 的桌面和行動前端——它最接近 EmulatorJS,但在原生環境而非瀏覽器中執行。自訂 WebAssembly 移植(例如手動調整的 Snes9x 版本)有時在原始效能上勝過 EmulatorJS,因為它們去掉了 libretro 抽象層,但犧牲了廣泛的系統支援。對於任何想要支援兩個或三個以上平台的瀏覽器網站,EmulatorJS 是實際的預設選擇。

常見問題

EmulatorJS 是唯一的瀏覽器模擬器嗎?
不是,但它的部署最廣泛。個別核心的自訂 WebAssembly 移植確實存在(Snes9x、mGBA、FCEUmm),流媒體模擬服務也有自有引擎。
EmulatorJS 是開源的嗎?
是的。它採用 MIT 授權,原始碼位於 GitHub。它封裝的 libretro 核心各自有各自的授權(大多數是 GPL)。
EmulatorJS 能離線運作嗎?
一旦核心和 ROM 載入完成,模擬器就完全在你的瀏覽器中執行,沒有網路呼叫。關閉並重新開啟分頁將需要重新下載核心,除非主機網站使用 service worker 快取它。