EmulatorJS 是什麼?模擬引擎詳解
EmulatorJS 是開源的 JavaScript 封裝層,讓 libretro 核心能在任何現代瀏覽器中執行。以下說明它的功能、重要性,以及它能和不能模擬什麼。
作者: Mira Köhler · 發布: · 更新:
由 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 快取它。