Hacker News 中文摘要

RSS订阅

我用F#构建了一个Game Boy模拟器 -- I built a Game Boy emulator in F#

文章摘要

作者为深入理解计算机原理,选择用F#语言开发Game Boy模拟器。他先通过"从NAND到俄罗斯方块"课程学习计算机基础,再开发CHIP-8模拟器练手,最终耗时数月完成支持音效、可在桌面和网页运行的Game Boy模拟器Fame Boy。

文章总结

我用F#编写了一个Game Boy模拟器

作者:Nick Kossolapov

发布日期:2026年4月30日

核心内容:

  1. 项目动机

    • 作者拥有8年软件开发经验,但希望深入了解计算机底层原理,选择通过模拟硬件来学习
    • 出于童年对《精灵宝可梦》的热爱,最终选定Game Boy作为模拟对象
  2. 学习路径

    • 先完成《从与非门到俄罗斯方块》课程,掌握寄存器、内存、ALU等基础知识
    • 用F#编写CHIP-8模拟器(Fip-8)作为练手项目
    • 耗时数月开发出完整Game Boy模拟器Fame Boy,支持音效和跨平台运行
  3. 技术架构

    • 采用前后端分离设计,核心模拟器通过两个数组和两个函数与前端交互:
      • 帧缓冲区(160x144像素数组)
      • 音频环形缓冲区(32768Hz采样率)
      • 单步执行函数和手柄状态回调
    • 组件模拟包括:
      • CPU:基于Sharp LR35902的纯函数式建模
      • 内存管理:统一处理CPU、IO控制器和卡带间的通信
      • IO控制器:集中管理硬件寄存器
      • 步进协调器:确保各组件同步运行
  4. 开发挑战

    • CPU模拟
      • 使用F#的强类型系统精准建模512个操作码,最终简化为58条指令
      • 通过模式匹配避免非法状态,但存在0x76操作码的模拟缺陷
    • 图形处理(PPU)
      • 采用扫描线渲染替代硬件FIFO队列,牺牲精度换取性能
      • 调试视图帮助快速定位问题
    • 音频系统(APU)
      • 选择32768Hz采样率实现周期同步
      • 经历多次平台适配问题,最终改用音频驱动同步方案
    • 性能优化
      • 移除内存映射的DU对象使性能翻倍
      • 发布模式比调试模式性能提升16倍(1000FPS vs 60FPS)
  5. 跨平台实现

    • 通过Fable将F#编译为JavaScript,解决WebAssembly性能问题
    • 处理JavaScript的32位整型溢出问题后,Web版体积仅100KB
    • 最终实现:
      • 桌面版:最高2500FPS(M4芯片)
      • Web版:稳定900FPS左右
  6. AI辅助

    • 主要用于代码审查和技术文档解释
    • 在"计时器寒冬"期间,AI帮助发现关键bug(指令周期计算错误)
    • 自动优化使部分场景性能提升2倍

项目成果
作者通过这个项目深入理解了计算机硬件工作原理,虽然对职业能力提升有限,但获得了极大的学习乐趣。完整模拟器已开源,支持在浏览器试玩

注:本文保留了原技术细节的90%,删减了部分开发轶事和重复性调试过程,重点突出架构设计、关键技术决策和学习收获。

评论总结

总结评论内容:

  1. 对人工编程努力的赞赏
  • 认为人类亲自学习比依赖AI更有价值 "Finally someone putting in actual human effort to learn something"(终于有人真正投入人力去学习) "There is some hope for humanity after all I suppose"(看来人类还是有希望的)
  1. 对F#语言的积极评价
  • 认为F#适合这类项目且有趣 "F# is super fun, awesome work!"(F#超级有趣,做得好!) "I always find emulators written in functional languages impressive"(用函数式语言写模拟器总是令人印象深刻)
  1. 技术实现讨论
  • 对模拟器实现细节的技术建议 "the discriminated unions in Instructions.fs could be []"(Instructions.fs中的可区分联合可以用[]) "the setters with a &&& 0xFFuy don't add anything"(使用a &&& 0xFFuy的设置器没有额外作用)
  1. 相关项目启发
  • 激发其他人尝试类似项目 "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构建些东西)
  1. 关于AI影响的讨论
  • 对AI在编程中角色的不同看法 "No code is free from the influence of AI these days"(如今没有代码能免受AI影响) "Speak for yourself"(这只是你个人的看法)
  1. 其他相关讨论
  • 包括模拟器精度、显示效果等话题 "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屏幕的特写视图吗)