作者:
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 的簡化有幾個不同層次的「等價交換」策略。針對你目
前遇到運算量龐大的問題,我們可以從以下三個維度來拆解: