文章摘要
作者为深入理解计算机原理,选择用F#语言开发Game Boy模拟器。他先通过"从NAND到俄罗斯方块"课程学习计算机基础,再开发CHIP-8模拟器练手,最终耗时数月完成支持音效、可在桌面和网页运行的Game Boy模拟器Fame Boy。
文章总结
我用F#编写了一个Game Boy模拟器
作者:Nick Kossolapov
发布日期:2026年4月30日
核心内容:
项目动机
- 作者拥有8年软件开发经验,但希望深入了解计算机底层原理,选择通过模拟硬件来学习
- 出于童年对《精灵宝可梦》的热爱,最终选定Game Boy作为模拟对象
学习路径
- 先完成《从与非门到俄罗斯方块》课程,掌握寄存器、内存、ALU等基础知识
- 用F#编写CHIP-8模拟器(Fip-8)作为练手项目
- 耗时数月开发出完整Game Boy模拟器Fame Boy,支持音效和跨平台运行
技术架构
- 采用前后端分离设计,核心模拟器通过两个数组和两个函数与前端交互:
- 帧缓冲区(160x144像素数组)
- 音频环形缓冲区(32768Hz采样率)
- 单步执行函数和手柄状态回调
- 组件模拟包括:
- CPU:基于Sharp LR35902的纯函数式建模
- 内存管理:统一处理CPU、IO控制器和卡带间的通信
- IO控制器:集中管理硬件寄存器
- 步进协调器:确保各组件同步运行
- 采用前后端分离设计,核心模拟器通过两个数组和两个函数与前端交互:
开发挑战
- CPU模拟:
- 使用F#的强类型系统精准建模512个操作码,最终简化为58条指令
- 通过模式匹配避免非法状态,但存在0x76操作码的模拟缺陷
- 图形处理(PPU):
- 采用扫描线渲染替代硬件FIFO队列,牺牲精度换取性能
- 调试视图帮助快速定位问题
- 音频系统(APU):
- 选择32768Hz采样率实现周期同步
- 经历多次平台适配问题,最终改用音频驱动同步方案
- 性能优化:
- 移除内存映射的DU对象使性能翻倍
- 发布模式比调试模式性能提升16倍(1000FPS vs 60FPS)
- CPU模拟:
跨平台实现
- 通过Fable将F#编译为JavaScript,解决WebAssembly性能问题
- 处理JavaScript的32位整型溢出问题后,Web版体积仅100KB
- 最终实现:
- 桌面版:最高2500FPS(M4芯片)
- Web版:稳定900FPS左右
AI辅助
- 主要用于代码审查和技术文档解释
- 在"计时器寒冬"期间,AI帮助发现关键bug(指令周期计算错误)
- 自动优化使部分场景性能提升2倍
项目成果:
作者通过这个项目深入理解了计算机硬件工作原理,虽然对职业能力提升有限,但获得了极大的学习乐趣。完整模拟器已开源,支持在浏览器试玩。
注:本文保留了原技术细节的90%,删减了部分开发轶事和重复性调试过程,重点突出架构设计、关键技术决策和学习收获。
评论总结
总结评论内容:
- 对人工编程努力的赞赏
- 认为人类亲自学习比依赖AI更有价值 "Finally someone putting in actual human effort to learn something"(终于有人真正投入人力去学习) "There is some hope for humanity after all I suppose"(看来人类还是有希望的)
- 对F#语言的积极评价
- 认为F#适合这类项目且有趣 "F# is super fun, awesome work!"(F#超级有趣,做得好!) "I always find emulators written in functional languages impressive"(用函数式语言写模拟器总是令人印象深刻)
- 技术实现讨论
- 对模拟器实现细节的技术建议
"the discriminated unions in Instructions.fs could be [
]"(Instructions.fs中的可区分联合可以用[ ]) "the setters with a &&& 0xFFuydon't add anything"(使用a &&& 0xFFuy的设置器没有额外作用)
- 相关项目启发
- 激发其他人尝试类似项目 "I've had it in the back of my mind to write a Rust compiler for the game boy"(我一直想用Rust为Game Boy写编译器) "Makes me want to build something with F"(这让我想用F构建些东西)
- 关于AI影响的讨论
- 对AI在编程中角色的不同看法 "No code is free from the influence of AI these days"(如今没有代码能免受AI影响) "Speak for yourself"(这只是你个人的看法)
- 其他相关讨论
- 包括模拟器精度、显示效果等话题 "wasn't there an emulator...which had a visual panel showing each CPU cycle"(不是有个能显示每个CPU周期的模拟器吗) "does anyone have some really zoomed in views of GB screens"(有人有GB屏幕的特写视图吗)