|
|
本帖最後由 good7 於 2026-7-30 15:15 編輯
PCSX2 2.63 繁/簡/英文版
2026/07/30 更新
修復王國之心 2 破圖
Fix9:
https://u.pcloud.link/publink/show?code=XZ4PXo5Zovqwp24JICHA2Hhb1U98sbcIfAUV
2026/07/27 更新
之前有下載的人請重新下載一次,修復載入 Armored Core - Last Raven (J) 遊戲,使用 vulkan 著色器會崩潰。
再修復一下「更換光碟」的問題。
Fix7:
https://u.pcloud.link/publink/sh ... oLaWE4AMgBXKHCBcNnk
================================================================================
崩潰記錄修復 — 載入 Armored Core - Last Raven (J) 遊戲,使用 Vulkan 崩潰
================================================================================
狀態:✅ 已完成修復
日期:2026-07-27
================================================================================
一、問題描述
================================================================================
遊戲:Armored Core - Last Raven (Japan).iso
現象:載入後不久崩潰
條件:只有 Vulkan 渲染器才會崩潰,DX11/DX12/OGL/Software 全部正常
觸發參數:
Target: TBP0=0x1180, PSM=PSMCT32, scale=1.0, type=RenderTarget
矩形:r=(64, 112, 576, 336),即 512x224 pixels
write_mask=0xFFFFFFFF,TBW=0x0A
呼叫鏈:
GSTextureCache::Read(TBP0=0x1180, r=(64,112,576,336))
→ dltex->Flush() + Map() → 取得 download buffer 指標
→ WritePixel32(bits, pitch=2048, off, r, write_mask)
→ 崩潰於 SIMD load
================================================================================
二、根因
================================================================================
檔案:pcsx2\GS\GSLocalMemory.h
函式:WritePixel32(u8* src, u32 pitch, const GSOffset& off,
const GSVector4i& r, u32 write_mask)
本地自行添加了 block-aligned SIMD 最佳化路徑,但座標轉換有 shift mismatch:
PSMCT32 的 GS block 參數:m_blockShiftX = 3, m_blockShiftY = 3(8x8 block)
BNHelper 初始化用 >> 3:
blkY = r.top >> 3 = 112 >> 3 = 14
自製路徑用 << 2 轉回 pixel 座標(錯誤):
block_y = blkY << 2 = 14 << 2 = 56(應為 112)
>> 3 與 << 2 不匹配,block_y 只有正確值的一半。
src_row 公式:
src_row = src_px + (block_y + yi - r.top) * pitch_elems + block_x
→ (56 + 0 - 112) = -56(負值)
后果:
src_row 指向 download buffer 起點之前約 115KB
最終讀到未映射記憶體頁面 → access violation → 崩潰
上游 PCSX2 的 WritePixel32(write_mask) 從未有此路徑。
本地添加的是未經驗證的自製最佳化。
================================================================================
三、為何只有 Vulkan 崩潰
================================================================================
DX11/DX12/OGL:download buffer 記憶體配置較大或有相鄰映射
→ 負偏移讀到有映射的記憶體(讀到垃圾但不崩潰)
Vulkan:VMA 配置緊湊(GPU_TO_CPU + HOST_CACHED)
→ 負偏移讀到未映射頁面 → access violation
================================================================================
四、修復內容
================================================================================
將 WritePixel32(write_mask) 還原為上游 PCSX2 正版。
修復前(66 行自製路徑):
- block-aligned SIMD 路徑(有 shift bug)
- write_mask SIMD 路徑
修復後(4 行,上游正版):
void WritePixel32(u8* RESTRICT src, u32 pitch, const GSOffset& off,
const GSVector4i& r, u32 write_mask)
{
off.loopPixels(r, vm32(), (u32*)src, pitch,
[&](u32* dst, u32* src) { *dst = (*dst & ~write_mask) | (*src & write_mask); });
}
loopPixels 內部使用 paMulti 正確計算每個 pixel 的 GS 記憶體位址。
檔案行數變化:GSLocalMemory.h 1209 → 1147(-62 行)
================================================================================
五、穩定度驗證
================================================================================
使用虛擬數據測試 10 種參數組合,驗證所有 vm address 都在
合法範圍 [0, 1048575](4MB / 4 bytes)內:
測試案例 vm 位址範圍 結果
────────────────────────────── ────────────────────── ────
崩潰案例 r=(64,112,576,336) 350,720 ~ 509,439 PASS
全螢幕 640x448 286,720 ~ 573,439 PASS
TBP=0 全螢幕 0 ~ 286,719 PASS
高 TBP=0x2300 573,440 ~ 860,159 PASS
小矩形 16x16 286,912 ~ 287,551 PASS
單一 block 8x8 286,720 ~ 286,783 PASS
非對齊矩形 350,144 ~ 510,527 PASS
TBW=1 最小頁 0 ~ 4,095 PASS
大矩形 1024x1024 0 ~ 1,015,807 PASS
高 TBP=0x2000 524,288 ~ 811,007 PASS
最大位址 1,015,807 < 上限 1,048,575 ✓
結果:10 PASS, 0 FAIL
實機驗證:Armored Core - Last Raven (Japan) + Vulkan,遊戲正常運行,無崩潰。
================================================================================
六、相關檔案
================================================================================
pcsx2\GS\GSLocalMemory.h — WritePixel32 定義(修復點)
pcsx2\GS\Renderers\HW\GSTextureCache.cpp — Read() 呼叫端
================================================================================
2026/06/17 更新
這是收尾階段,最後的正式版
下載: (6/18 fix4)
https://u.pcloud.link/publink/sh ... qhwr874aK5cmXmbVEfk
最後畫面長這樣
2026/06/16 更新
修復鐵拳 5 計分榜色塊錯誤,
修復格鬥天王合集過場動畫顯示異常問題。
請這兩天有下載新版的請重新下載。
2026/06/14 更新
這次更新,再增加一些小功能。
視窗置頂功能,這個功能不用說了吧,就是字面的意思,pcsx2 遊戲在視窗模式不被蓋住。
自動定時存檔,這個功能是以熱鍵形式來使用,有三段時間可以自由切換。
預設值是 20秒 → 40秒 → 60秒 → 關閉功能。 (預設按鍵:存檔 pgUP,讀檔 pgDN)
這三個值是可以更改的,間隔需要隔 3 秒,這個功能可以設定遊戲結束時要不要存入磁碟,這樣彈性會更大。
這個功能其它就像類似「倒帶」的功能一樣,只是沒有在畫面顯示倒帶回去而已,在玩過關的動作遊戲時很好用的。
就不用金手指了。
這次編譯我使用 clang 編譯,性能應該更好一點。
編譯模式我也改成 Release 了。
並且最佳化了一些檔案。
並且一些按鍵我設了預設值,如下。
即時存檔預設單鍵 1 - 0 ,隨手一按就能存檔了。
對了,新增遊戲資料夾,我也給它改成新增後,會自動連網抓遊戲的封面了,如下:
而下載封面的功能,我預先輸入到下載網址列了,以後單獨加入的遊戲,可來這裡按「開始」,就會更新了。
這個檔案是從 Github 網站下載原始碼編譯而來,已經移除了檢查更新的功能了,所以程式版本就定在這裡了。
還有移除「成就」的所有東西,和「Discord」所有的功能都移除了,所以你在這個版本上看不到這些東西。
這個版本就是單純的「單機版」。
忘了說,這個專案的電視濾鏡我全部都有修改,像掃描線濾鏡叫 AI 修改成人眼看起來最漂亮的參數,其它的濾鏡也一樣,
有比較像其濾鏡的參數,都設成預設值,所以跟原版的不太一樣。
還有有增加一些功能,
「啟動時載入上次的遊戲」,就是上次結束時玩的遊戲,下次執行就直接執行上次玩的遊戲。
本來我想做一個「休眠」的功能,就是一鍵結束程式,但結束時,遊戲自動存檔,然後結束,下次開始時自動直接載入上次的遊戲進度,
後來想想,不要搞得那麼複雜,所以就沒做上去。
工具列的「關機」改成雙功能,「繼續/關機」,在沒有載入遊戲時,是顯示「繼續」,這個就是繼續上次關閉的遊戲,載入遊戲時,
這個圖示就顯示成「關機」,就是關閉遊戲。
「錄影」功能,我直接改成不顯示存檔輸入框,直接錄影,這樣比較好用。
增加一個,依遊戲地區自動選擇 BIOS 的功能,以後不用自己切換,系統會自動選擇 bios。
還有畫面的「暗角」功能,這個功能會將畫面邊緣淡化,會看起來沒有圖片的邊界感,我覺得這樣較好看,所以加了進來。
還有增加音效的「固定音量」的功能,也就是說,我們玩這個遊戲時,可以設定一個自己喜歡的音量值,以後就直接用這個音量來玩遊戲,就算
調整到其它音量以後,有快速鍵可以直接切到設定的音量。
這算是 Beta 版,如果發現問題的話,請發上來我看看,謝謝。
|
評分
-
查看全部評分
|