Emulator 板


LINE

这篇比较适合对模拟器开发相关议题有兴趣的人阅读 说白话就是...我太小看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 的简化有几个不同层次的「等价交换」策略。针对你目 前遇到运算量庞大的问题,我们可以从以下三个维度来拆解: --- ### 维度一:数学理论上的「状态最小化」(State Minimization) 在自动机理论(Automata Theory)中,有一个经典演算法叫做 **Hopcroft 演算法**( 或是 DFA 最小化)。它的核心概念是:**「如果两个状态在接受任何相同的输入後,都 会产生相同的输出,并转移到相同的下一个状态,那麽这两个状态在数学上是等价的,可 以合并。」** * **在模拟器的现实是:** 很遗憾地,这招在 NES 这种周期精确(Cycle-Accurate)的 模拟器中**几乎无效**。因为 PPU 画面上每一个 Clock 输出的像素(Pixel)位置都不 一样,或者 CPU 每一个 Clock 的记忆体总线状态都不一样。这意味着在一个 341 个 Clock 的扫描线中,这 341 个状态在数学上都是「不可替代且独立的」。 * **结论:** FSM 的「状态数量集合 $|S|$」在硬体模拟中,通常已经是物理极限,无 法在不破坏精确度的情况下被删减。 --- ### 维度二:运算层面的「状态转移函数」化简(Function Approximation) 既然状态数量不能少,我们只能针对状态转移函数 $\delta(s_t, input_t) = s_{t+1}$ 开刀。你目前程式码中庞大的 `switch` 或 `if-else` 就是在实作这个 $\delta$ 函数 。 1. **纯算术取代逻辑跳转(你正在做的事):** 就像我们之前用 `((bit << 2) - 2)` 来取代 `if (bit == 1) +2 else -2`。我们 把离散的逻辑分支,转换成了连续的代数方程式。这在数学上是完美的等价交换,且对 CPU 管线极度友善。 2. **状态编码的艺术(State Encoding):** 不要用 `int state = 1, 2, 3...` 这种人类好读的数字来代表状态。 如果我们精心设计状态的二进位编码(例如 **One-Hot Encoding** 或 **Gray Code**),我们可以让状态转移变成纯粹的位元平移(Shift)或位元反转(XOR)。 * *例子:* APU 的 Noise 频道就是一个 LFSR(线性回馈移位暂存器),它本质上 是一个拥有 32767 个状态的 FSM。但我们不需要写 32767 个 `if`,我们只用了一行位 元运算 `(lfsr >> 1) | (fb << 14)` 就完美表达了整个 FSM 的转移矩阵! --- ### 维度三:架构层面的降维打击 —— 从「步进」到「时间跃迁」(Catch-up / Event-Driven) 这才是现代高效能模拟器(如 Mesen, bsnes)能够在保持 100% 周期精确的同时,运算 量比 TriCNES 低上好几倍的终极数学等价交换! 目前你的架构是 **「轮询式步进(Polling / Tick-based)」**: ```csharp // FSM 数学式: s(t+1) = f( s(t) ) while (true) { CPU_Tick(); // 往前 1 步 PPU_Tick(); // 往前 3 步 APU_Tick(); // 往前 1 步 } ``` 这种做法最保险,但即使 PPU 正在画连续 256 个毫无变化的背景像素,你的回圈还是得 空转 256 次状态机判断。 **等价交换:时间戳与事件驱动(Timestamping & Catch-up)** 在数学上,如果一个 FSM 在接下来的 $N$ 步之内,都没有外部输入($\Sigma$ 为空或 不变),那麽我们可以积分(推导)出一个跃迁函数 $\Delta$: $$s_{t+N} = \Delta(s_t, N)$$ 这意味着:**我们不需要一步一步走,我们可以直接用数学公式「算」出 $N$ 步之後的 状态!** * **实作概念:** 1. CPU 执行了一个耗时 12 步的指令。CPU 内部时间标记为 `cpu_time = 12`。 2. PPU 此时时间标记为 `ppu_time = 0`。 3. 因为 CPU 在这 12 步内没有去读写 PPU 的暂存器(没有发生互动),所以 PPU 这 36 步($12 \times 3$)的行为是完全可预测的。 4. 我们直接呼叫 `PPU_CatchUp(36)`。在这个函数里,我们**不写回圈**,而是用 除法和余数(Modulo),直接算出 36 步後 PPU 的 `scanline` 和 `dot` 在哪里,并一 次性把这 36 步的像素批次填入画面缓冲区! ### 总结 1. **可以精简吗?** FSM 作为概念核心是不可消灭的,但其**运算过程**绝对可以被等 价精简。 2. **微观的精简:** 继续利用 SWAR、Bitmask、代数方程式来消除 $\delta$ 函数中的 条件分支(你已经做得非常顶尖了)。 3. **宏观的精简(未来方向):** 如果你觉得目前的运算量还是太大,你最终必须从 `PPU_Tick()` 的「一期一会」,走向 `PPU_CatchUp(cycles)` 的「时间跃迁」。这是 将 FSM 从「离散的一阶递回数列」转化为「连续时间函数」的最强大数学等价交换! =========== 相关分析整理文件都在下面 https://github.com/erspicu/AprNes/tree/master/MD/catchup_study 主要可以阅读 https://tinyurl.com/555k3p75 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.233.248.16 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Emulator/M.1775748182.A.623.html
1F:推 btjerwei: 看不懂,也请鼓掌! 04/10 14:39
2F:推 dongxx: 鼓 04/10 20:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP