本帖最後由 good7 於 2026-7-4 09:41 編輯
2026/07/04 更新
模擬器的開發者給我回覆了,他說這個問題 snes9x 就有了。
有興趣的人看這裡:
https://github.com/shanytc/snes9x/pull/153
2026/07/02 更新
發現一個 bug,
在渲染器如果從 vulkan 切到 Direct3d/DirectDraw 時,
會發生畫面凍結,聲音還在繼續播的狀況,
就算點程式內的硬體、軟體重置也沒辦法,
只能重新啟動程式才能解決。
這個 bug 在最新官方的 v1.63.24 中也一樣未修復。(可能未發現)
本來有嘗試修復,但是越追越深入,感覺可能不好找到。
又使用這個切換就很少人會做的(不會將效能高的切到效能低的吧。)
(我七、八年前的 gtx 1060 都可以跑 vulkan 了,現在的電腦怎麼不行跑。)
使用率真的不高,很少會觸發,所以不修了,
只能看有沒有管道,回報給開發者去處理了。
還有 CRT Royale 只能在 vulkan 渲染器下用而已,不能用在 OpenGL 上面,
會有一些問題,在此告知。
(有下載過的人建議重新下載。)
下載(擇一下載):
https://u.pcloud.link/publink/sh ... buLMEqAdxTn6f047P9y
SuperSnes9x-16323_finel4.7z.RAR
(4.73 MB, 下載次數: 32)
2026/07/01 更新
一些顯示錯誤的更新。
增加「載入遊戲」更改熱鍵的設定(對想要單鍵開檔的人有用。)
有發現一個新問題,暫停開放下載。
2026/06/30 更新(正式版)
這是「正式版」發佈,還是一樣,有修復一些錯誤,和最佳化一些內容,其中沒有很詳細的記錄,
只有這幾個比較重要的最佳化列出來。
所以這個版本會比原版效能好一點,也會比較好用一些。
以後如果有空,或是我想再改造它的話,說不定還會
更新版本。
===================================
SIMD 最佳化列表 (平行運算)
===================================
[H-1] COLOR_ADD / COLOR_SUB / COLOR_ADD_BRIGHTNESS 色彩合成
檔案: z:\s9\gfx.h
行號: 138-154 (COLOR_ADD::fn)
156-161 (COLOR_ADD::fn1_2)
166-175 (COLOR_ADD_BRIGHTNESS::fn)
186-199 (COLOR_SUB::fn)
201-205 (COLOR_SUB::fn1_2)
性質: 每幀數萬至數十萬像素都會呼叫,SNES 色彩數學最底層
SIMD: SSE2 一次 8 像素、AVX2 一次 16 像素
_mm_add_epi16 / _mm_sub_epi16 / _mm_avg_epu16 / _mm_max_epi16
困難度: 中 (channel mask + carry 偵測要小心)
預期加速: 3-5x
[H-2] 渲染主熱點 Normal1x1Base: raw (NOMATH 路徑)
檔案: z:\s9\tileimpl-n1x1.cpp
行號: 12-25 (Draw 函式)
性質: 每個可見像素都走這路,Z-buffer 測試 + 寫入 ScreenColors
SIMD: SSE2 一次 8 像素 LUT gather + store
困難度: 中 (Z-buffer 不規則)
預期加速: 2-4x
[H-3] 渲染主熱點 DrawTile16: raw (8 像素 tile 內迴圈)
檔案: z:\s9\tileimpl.h
行號: 241-307
內迴圈 266-268: for (x=0; x<8; x++) { Pix=bp[x]; DRAW_PIXEL(x,Pix); }
性質: 每個 tile 每列都跑一次
SIMD: SSE2 _mm_shuffle_epi8 / _mm_i32gather_epi16 (AVX2) 做 LUT gather
困難度: 中
預期加速: 2-4x
[H-4] Display 像素格式轉換 (RGB565 -> RGB888/RGBA8888)
檔案: z:\s9\win32\win32_display.cpp
行號: 785-913 (Convert16To24)
915-983 (Convert16To32)
性質: 每幀整個畫面都跑一次,57K-230K 像素
SIMD: SSSE3 _mm_shuffle_epi8 一次轉 4 像素 (Convert16To24 非 blending 路徑)
SSE2 _mm_unpacklo_epi16 + _mm_sll_epi32 一次 4 像素 (Convert16To32)
AVX2 _mm256_cvtepu16_epi32 + _mm256_sll_epi32 一次 8 像素 (Convert16To32)
困難度: 低 (經典案例)
預期加速: 4-6x
其中的 CRT Royale 濾鏡效果實在太好了,
有空大家可以一試。
2026/06/25 更新
這是正式版發佈前的最後一版,請有時間有意願的人幫忙測試,如果有問題的話,請反應一下,而如果沒有問題的話,
語系檔就重新整理梳理一下,就是最後的正式版了。
這版我加入了 Crt Royale 的濾鏡,讓它變成內建的了,如果沒有使用 Reshade 或是不知道有這種東西的人,也可以享受「復古」的味道,
這個濾鏡的預設值,我叫 ai 上網尋找最經典的參數,把它設成「預設值」,如果你們想調這個也可以調的,參數並不是綁死的。
還有修復一些其它的錯誤,並且這版我用 Clang 來編譯,效能最大化編譯的。
另外之前說的「程式睡眠」與 reshade 相衝,我在 reshade 6.73 的版本並沒有發現問題,功能可以正常執行。
reshade 下載網址:
https://reshade.me/downloads/ReShade_Setup_6.7.3_Addon.exe
Crt Royale 效果
2026/06/24 更新
這次更新再修復網路對戰一些問題,應該不會再偶爾有錯誤出現了。
新增一個功能:程式睡眠。
這個功能就是啟用後,你關閉程式後,下次打開時,就接著上次的遊戲狀態,就跟你關閉前的狀態一致,不過,有網路連線對戰時,
不會記錄這個。
就跟windows 作業系統的「休眠」類似,想玩就玩,想關掉就關掉,下次接著玩。
另外,我再加上 reshade 的著色器插件效果,按 home 鍵可叫出設定選單出來,
下面就是著名的 Crt-royale 效果。
2026/06/21 更新
這次更新網路對戰的 netplay 部份,原來在測試到這裡的時候,發現連線有問題,所以修了一下,
先丟上來,讓想測試的人也試看看,我只有一台電腦,也不能測出什麼,硬碟空間也沒有了,虛擬機也裝不下,
所以只能借助各位大大有時間的可以來測一下了,先謝謝了。
在這裡增加這個選項,客戶端按下去就可以連線了(限定在區域網路下面。),如圖,紅框處。
同一電腦可以開兩個程式,一個伺服器端、一個客戶端來連線,當然最好的是,有兩台不同的電腦測試最好的了。
以下,是一台伺服器,開 3 個客戶端,同一台電腦,理論上,區域網路的話應該都能連得到,我總共測 4 台連伺服器在內。
這個檔案是從 github 下載來重新編譯的,已經翻譯成並內建「繁體、簡體、英文」三種了。
https://github.com/shanytc/snes9x/releases
這個分支專案也是很新的,好像是程式員與克萊德ai共同協作開發出來的。
不多說了,這版的中文化還是測試版,不過,基本上已經98%都翻譯好了,有些是受限的因素,所以保留它,比如遊戲畫面中的訊息,
那是 ascii 編碼的,所以不能放中文了。我還想測試其它東西,並且看哪邊還有錯誤,和可不可以再最佳化一下。
有興趣的人可以玩玩,有問題可以丟上來給我,謝謝。
這個我還加了兩個功能,一個是程式進入時「自動載入上次玩的遊戲」和「倒帶時靜音」的功能。
並且也修了一些錯誤。
畫面預讀取(Run-Ahead) 是 Snes9x 的延遲降低功能,目的是讓輸入反應更即時,特別適合需要精準操作的反應型遊戲(格鬥、動作、節奏類)。 原理(單句話)每幀渲染時,先往前預模擬 N 幀並丟棄結果,只用它產生的輸入狀態立即渲染當前幀,等同把輸入延遲從一幀壓到接近零。
為什麼會有延遲
模擬器正常流程是:
[取輸入A] → [模擬1幀] → [畫面輸出]
↑ │
└───── 玩家看到畫面 ──────┘
玩家看到畫面後才按鍵 → 輸入延遲約 1 幀(NTSC 約 16.7 ms,PAL 約 20 ms)。
預讀取的解法
[取輸入B] → [模擬N幀+渲染] → [畫面輸出]
↑ │
└───── 玩家看到畫面 ─────┘
執行時實際做: - 讀取玩家最新輸入
- 把遊戲狀態回捲到上一幀
- 用新輸入重模擬 N 幀
- 只渲染最後一幀到螢幕
對玩家而言:看到畫面 → 按鍵 → 下一幀就反映輸入,沒有 1 幀延遲。
程式碼中的對應- 選單:ID_EMULATION_RUNAHEAD_OFF/1/2/3/4(langutil.cpp:160-164)控制 N 值(0/1/2/3/4 幀)
- i18n 字串:STR_MENU_EMULATION_RUNAHEAD_*
- 翻譯版翻為「Run &Ahead」(「預讀取」/「預先模擬」)
效能代價- CPU 負擔 ×N+1 倍:每顯示 1 幀實際跑 N+1 次模擬
- 不影響遊戲邏輯:丟棄的預模擬幀不寫入存檔、不影響電影重播
- 對慢電腦吃力:CRT 螢幕時代 16.7 ms 不敏感,現代高刷新率螢幕才明顯
適用情境[td]適合 | 不適合 | 格鬥遊戲(出招反應) | 慢速策略遊戲 | 動作平台(精準跳躍) | 效能吃緊的電腦 | 節奏遊戲 | 想要完全還原主機時序的模擬純化派 | 高刷新率螢幕玩家 | 60 Hz 螢幕下差異較小 |
與 netplay 的關係
預讀取不能用於網路對戰——它模擬的幀沒經過網路同步,會破壞 lockstep。Snes9x 會在 netplay 啟用時自動停用。
補註:但是倒帶記憶體的使用量會變多,看使用幾幀預讀取,就乘以倒帶所吃的記憶體(就是多n幀的倍數的意思。) 就是開啟預讀取,使用倒帶功能的記憶體增加的使用量。
|