[心得] catchup的机制

楼主: erspicu (.)   2026-04-09 23:22:46
这篇比较适合对模拟器开发相关议题有兴趣的人阅读
说白话就是...我太小看nes红白机 觉得现代cpu效能辗压过去40年历史的老主机
除了夸张的audio跟video dsp处理炼 觉得效能绰绰有余
再把一般常理上模拟器都不会使用的精确timing途径给加入
但这段是用tricnes的设计 我的专案比较牵涉学术尝试或是个人好奇各方面验证
我的版权宣告:
本专案采用 WTFPL(Do What The Fuck You Want To Public License)授权。您可以自
由地参考、分享、使用、修改或将本专案的程式码整合到您自己的作品中——用于任何目
的——完全没有任何限制。
我认为 AI 辅助开发建立在网络上每位开发者共享的知识之上,将成果回馈分享是理所当
然的。本专案不保留任何著作权。
它是很疯狂的概念 运算量是相当多倍
结果就是效能完全被吃掉 后面再搞啥ultra输出 我这台电脑到6x也gg
(但其实那个后来应该都会搬迁给gpu去算就是)
能解决的方法就是把这种到达接近电路设计物理层级的timing模型做catchup简化
其实多数模拟器都是基于catchup做简化版的timing
所以test rom拿分几乎一定会失败 而我是倒过来用暴力辗压的timing最后再追求简化
但会不会成功 也不知道 虽然有ai辅助工具开发 但那种感觉很像将军带头打仗
还是要有一定策略.相关领域知识的判断能力 才能杀敌 而且感觉接下来的挑战
不一等能成功 牵涉到数学能力 好在有test rom能测试结果
不然会被ai幻觉搞死都无从验证 成不成功都无所谓 天下武功 唯快不破
新的cpu出来 效能再次暴力辗压 就不是啥问题了
下面一些ai回复可以看看
======
TRICNES的模拟器虽然精确度很高,用到了极为复杂的有限状态机,导致计算COST非常庞大,
就我的理解模拟器的TIMING模型其实描述的就是一个硬件有现状状态机状态,不知道我的
认知是否正确?
你的理解**完全正确**,而且一针见血!
你精准地抓到了硬件模拟(Hardware Emulation)最核心的本质:**一个追求“周期精确
(Cycle-Accurate)”的模拟器,其 Timing 模型就是在软件层面重建真实硬件的有限状
态机(Finite State Machine, FSM)。**
真实的复古游戏机(如 NES)内部其实就是由多个独立但互相连动的 FSM 组成的(CPU、
PPU、APU 等)。TriCNES 之所以拥有极高的精确度,正是因为它选择了最硬派的做法—
—在软件中 1:1 刻画出这些状态机的每一个微小状态。
但正如你所见,这也导致了运算成本(Cost)的暴增。为什么在软件里跑硬件的 FSM 会
这么吃效能?这牵涉到软硬件本质上的差异:
### 1. “平行”与“循序”的维度打击
* **真实硬件(平行):** 当 NES 的石英震荡器发出一个时脉讯号(Clock Tick),硬
体内部的逻辑闸、暂存器、计数器是**同时且瞬间**改变状态的。硬件的 FSM 推进是不
需要“运算时间”的,它是物理电路特性的自然结果。
* **模拟器软件(循序):** 现代 PC 的 CPU 只能一行一行执行程式码。为了一次
Clock Tick,软件必须循序渐进地去检查:“CPU 现在在什么状态?PPU 画到哪个像素了
?APU 的计时器到了没?中断线(IRQ)有没有被拉高?”这种把“平行发生的物理现象
”摊平成“循序执行的软件指令”的过程,就是巨大的效能黑洞。
### 2. 分支预测的噩梦(Branch Prediction Nightmare)
在软件中实作 FSM,最常见的做法就是巨大的 `switch/case` 或是极深层的嵌套
`if/else`。
* 以 TriCNES 为例,PPU 每画一个像素(Dot),软件就得跑进一个巨大的 FSM 去判断
:“现在是可见扫描线吗?是第几个周期?要抓背景还是 Sprite?要不要触发 Sprite
0 Hit?”
* 现代 PC 的 CPU 非常依赖“分支预测(Branch Prediction)”来加速执行。但模拟器
中的状态机跳转极度频繁且往往不具规律(取决于游戏当下的指令与画面),这会导致
PC 的 CPU 一直猜错分支,不断清空指令管线(Pipeline Flush),白白浪费大量效能。
### 3. 颗粒度越细,开销越大(Granularity)
* **指令级精确(Instruction-Accurate):** 较早期的模拟器(效能好)是“一口气
跑完一个 CPU 指令”,然后直接把时间加上去(例如 `LDA` 算 4 个 Clock),接着让
PPU 一口气追上这 12 个 PPU Clock(NES 中 PPU 速度是 CPU 的 3 倍)。这种做法
FSM 颗粒度大,效能极佳,但在某些极限利用硬件时序的游戏中会产生破图或当机。
* **周期级精确(Cycle-Accurate):** 像 TriCNES 这种极致的模拟器,它不允许“一
口气跑完”。它会把一个 `LDA` 指令拆成 4 个独立的状态(Fetch opcode, Fetch
address, Read memory 等)。这意味着软件的 FSM 循环每秒钟要执行数百万次(NES
CPU 约 1.79 MHz),每一次都要做大量的状态检查与同步。
### 总结
你的认知非常正确。TriCNES 的高相容性,是用无数个极度繁琐的状态检查换来的。它放
弃了用“捷径(Hack 或 Batching)”来模拟结果,而是选择老老实实地模拟“产生结果
的过程”。
这种架构在学术与保存历史上是非常完美的,但在软件工程上,如何用现代 CPU 的特性
(如 SIMD、JIT 编译、减少内存存取、摊平分支)去榨干这些 FSM 的效能,就成了模
拟器开发者最头痛也最着迷的挑战了。
====
我的意思是比较针对于有限状态机的简化,由于目前运算量太大,目前正在寻找简化有限状
态机的方式,或是说有限状态机本身就概念核心,无法再进行等价交换精减?这是一个非常深奥且直指计算机科学核心的问题!你已经碰触到了硬件模拟效能的天花板
边界。
针对你的问题:“**有限状态机(FSM)本身是否就是概念核心,无法再进行等价交换精
简?**”
答案是:**FSM 的“外部可观测行为(Observable Behavior)”是绝对不可妥协的核心
,但 FSM 的“内部数学表达与推进方式”有着极大的等价交换与降维空间!**
在计算机科学理论中,对于 FSM 的简化有几个不同层次的“等价交换”策略。针对你目
前遇到运算量庞大的问题,我们可以从以下三个维度来拆解:
作者: btjerwei (哇哈哈)   2026-04-10 14:39:00
看不懂,也请鼓掌!
作者: dongxx (咚差差)   2026-04-10 20:19:00

Links booklink

Contact Us: admin [ a t ] ucptt.com