android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES
上個月在 V 站看到有同學發布了一個 Rust 寫的 Gameboy 模擬器。當時我恰好在系統化學習 Go 語言,作為馬里奧 /馬力歐 /瑪麗(誤)的忠實粉絲,就想著自己能不能用 Go 寫個模擬器玩玩。于是我瞄準了 NES 模擬器,考慮到 NES 是上個世紀 80 年代的古董硬件,可能比較容易實現。
接下來我開始在網上搜索關于 NES 硬件的信息。忽然有一個神奇的網站出現在我眼前,它就是 nesdev.com 。這個網站有一個Wiki,里面的內容包羅萬象,有 NES 的硬件細節,也有 NES 游戲開發的教程。對照著文檔,大概用了一天的時間完成了 INES ROM 文件(網上下到的.nes 文件都是這種格式)的讀取,然后用了不到一周的業余時間就基本實現了 NES CPU ( 6502 )指令解釋器。NES 的 PPU (類似顯卡)是難點,大概陸陸續續寫個幾個星期才完成基本功能。主要因為 NES 的硬件太弱,很多游戲為了壓榨機能在開發過程中用了大量的 hack,如果對 PPU 的模擬必須不夠精確,游戲運行時就會出現各種奇怪的現象。用的 GUI 庫是 fyne.io ,在部分操作系統上會內存泄漏,打算之后換個其他的庫試試( Go 語言目前好像沒有成熟的 GUI 庫)。另外 APU (類似聲卡)的模擬還沒有實現(主要我對聲學一竅不通,也暫時不想隨便引用個第三方庫解決,就先拖著了)。
另外一個難點是卡帶的模擬。NES 原生只有 2kB 內存+2kB 顯存,為了拓展內存和顯存的容量,很多游戲的卡帶帶有一個俗稱 Mapper 的芯片。配合卡帶上額外的 ROM 或 RAM 芯片,Mapper 可以將卡帶上 ROM 或 RAM 的一部分空間(稱為 bank )映射進 NES 的內存或顯存地址空間,還可以在游戲運行中動態切換。麻煩的是,不同的游戲使用的 Mapper 芯片是不同的,你必須先實現了對某種 Mapper 的模擬,才能運行使用這種 Mapper 的游戲 ROM,然而已知的 Mapper 種類就有幾百種。目前我的模擬器只實現了 INES 文件格式定義的 0-3 號 Mapper,但已經可以運行不少游戲了(包括超級馬力歐兄弟一代和魂斗羅)。
目前這個項目還比較初期,只能慢慢完善了。如果很多人感興趣的話我打算寫幾篇文章,做個自制 NES 模擬器的教程。
演示
演示游戲為 Nova The Squirrel,是一個仿星之卡比系列的開源山寨游戲。
總結
以上是生活随笔為你收集整理的android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String字符串中数字排序(Java)
- 下一篇: java基于springboot+vue