
不用模擬器也能玩PS5游戲拆解AnyPS5的非模擬器魔法relinker重鏈接PRX庫RDNA到SPIR-V【免費下載鏈接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows項目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5PS5 上的 x86-64 游戲能不能不經(jīng)過模擬器直接在 PC 上原生運行開源項目 AnyPS5 給出了一個大膽且與眾不同的答案不模擬、不翻譯執(zhí)行而是把 PS5 可執(zhí)行文件靜態(tài)移植成 Linux/Windows 原生程序。項目自稱 Tool for automatic PS5 executables porting to Linux and Windows在 cnBeta、3DM 等游戲媒體的報道中直接運行 PS5 游戲成為話題焦點而在技術(shù)社區(qū)里人們更關(guān)心它背后那條relinker 重鏈接 PRX 系統(tǒng)庫 RDNA 到 SPIR-V 著色器重編譯的三步鏈路。本文結(jié)合倉庫源碼與公開情報拆開這層非模擬器魔法講清楚它為什么不需要 CPU 模擬、如何用可運行樁 真實核心的策略把移植成本壓到最低以及它今天到底能跑到什么程度。一個移植器而不是模擬器先厘清概念。傳統(tǒng)思路是模擬器在 PC 上再造一個 PS5 軟件環(huán)境CPU 指令逐條解釋或二進制翻譯游戲跑在模擬器進程內(nèi)部。AnyPS5 完全不是這個路線——它的 README 說得直白Includes a relinker that converts executable to the target systems native format and implementations of system prx libraries suitable for dynamic linking.No emulation or separate runtime process.也就是說轉(zhuǎn)換后的游戲就是一個普通的原生進程CPU 指令直接執(zhí)行圖形走 Vulkan 原生管線系統(tǒng)調(diào)用和庫函數(shù)鏈接到項目自研的 PRX 實現(xiàn)。所有翻譯工作都在構(gòu)建期完成運行時沒有任何中間層開銷。這也是社區(qū)文章反復(fù)強調(diào)沒有進程開銷、沒有固件依賴的根源。三步核心鏈路AnyPS5 的完整流水線可以精確對應(yīng)到倉庫里三個核心目錄core/relinker重鏈接器、core/libs/prx系統(tǒng)庫實現(xiàn)、core/shader/recompiler著色器重編譯器。架構(gòu)文檔 docs/dev/ARCHITECTURE.md 給出了兩條清晰的流程圖。第一步relinker 重鏈接——把 PS5 ELF 變成原生 ELF/PE入口在 core/relinker/main.cpp它按固定順序執(zhí)行整個轉(zhuǎn)換auto result pipeline-Relink(sourceBytes); // ...應(yīng)用 patch... guestArtifacts Relinker::GuestModuleBuilder().Build(...); fileWriter.Write(absPath, executableBytes);RelinkerPipeline聲明見 RelinkerPipeline.hpp承擔(dān)了核心工作讀取 ELF、按 NID 解析導(dǎo)入、掃描系統(tǒng)調(diào)用SyscallScanner、過濾未使用的 NID、構(gòu)建 SysV 動態(tài)節(jié)最后由LinuxElfPatcher或WindowsPePatcher分別輸出 Linux ELF 或 Windows PE。這里的關(guān)鍵在于 PS5 的系統(tǒng)庫符號不是普通名字而是一串 11 字符的NID。NID 的算法實現(xiàn)在 NidCompute.cpp對符號名 16 字節(jié)固定后綴做 SHA-1取摘要中 8 個字節(jié)反轉(zhuǎn)后用自定義的 base64 字母表編碼成 11 個字符。重鏈接器解析出游戲引用了哪些 NID、哪個庫、哪個調(diào)用位置然后為它們生成新的動態(tài)節(jié)同時GuestModuleBuilder 還會把游戲自帶的sce_module/*捆綁模塊一并轉(zhuǎn)換輸出到app0/下。最終產(chǎn)物的運行布局是app.elf (Linux) 或 app.exe (Windows) libs/ ← 自研系統(tǒng)庫 *.prx app0/ ← 游戲資源 轉(zhuǎn)換后的模塊值得注意的細節(jié)還有兩個一是--to-intel選項見 docs/user/USAGE.mdPS5 的 AMD CPU 上有少數(shù) AMD 專屬指令如VRSQRTPS、VRCPPS在 Intel 主機上無法執(zhí)行relinker 會用 codegen 在構(gòu)建期把它們降級或替換成跳板trampolinemain.cpp里逐條打印 Intel substitution 日志二是unused-filter0/1/2三級未用符號過濾策略從全量保留到基于 CFG/GOT 分析的嚴格可達性分析粒度越細輸出越小但對輸入 ELF 的合規(guī)性要求越高——這正是社區(qū)那篇三級未用符號過濾終極對比文章討論的技術(shù)細節(jié)。第二步自研 PRX 系統(tǒng)庫——用 C 重寫 PS5 的 libSce*PS5 游戲依賴一整套系統(tǒng)庫輸入、音頻、圖形驅(qū)動、HTTP、字體、存檔、對話框……AnyPS5 的策略不是在運行時劫持而是為每個庫編寫一份原生 C 實現(xiàn)編譯成共享庫.prx構(gòu)建后由nid_patchercore/libs/nid把每個導(dǎo)出符號重命名為其 NID這樣游戲按 NID 動態(tài)鏈接時就能命中這些實現(xiàn)core/libs/prx/* → 編譯為共享庫 → nid_patcher 重命名導(dǎo)出 → libs/*.prx以 libScePad/Export.cpp 為例它實現(xiàn)了scePadGetControllerInformation、scePadGetHandle、scePadDeviceClassParseData等 API不僅返回結(jié)構(gòu)體連細節(jié)都很講究觸摸板分辨率 1920×943、搖桿死區(qū) 2、連接類型LOCAL、錯誤碼嚴格對齊 PS5 原生語義如PAD_ERROR_DEVICE_NOT_CONNECTED 0x80920007。輸入層還通過 SDL 支持手柄自動識別與鍵鼠映射配置見 docs/user/INPUT_MAPPING.md。庫的覆蓋面從環(huán)境列表可見一斑libSceAgcDriver、libSceAgc、libSceAudioOut、libScePad、libSceFont、libSceVideoOut、libSceHttp、libSceAvPlayer、libSceSaveData、libSceNpTrophy2……幾十個庫各有 Export.cpp。社區(qū)那篇libSceHttp HTTP 客戶端移植實錄就是這類工作的一個縮影Uri.cpp 實現(xiàn)了符合 RFC 3986 的sceHttpUriParse/sceHttpUriBuild/sceHttpUriEscape包括 scheme 識別、removeDotSegments路徑歸并、默認端口推斷以及用掩碼標(biāo)志位URI_BUILD_WITH_SCHEME、URI_BUILD_WITH_HOSTNAME…控制拼裝——嚴格遵循 PS5 錯誤碼規(guī)范與兩次調(diào)用緩沖區(qū)協(xié)議。轉(zhuǎn)換出的游戲到底缺哪些符號relinker --registry會生成registry.json清單配合 tools/import_audit.py 可在啟動前審計每個導(dǎo)入被歸為implemented已實現(xiàn)、stub樁調(diào)用即拋錯、absent缺失加載失敗或module游戲自帶模塊四類見 docs/user/USAGE.md。這構(gòu)成了整個項目的兼容性儀表盤。第三步RDNA 著色器重編譯——RDNA3 匯編到 SPIR-VPS5 的 GPU 是 RDNA 架構(gòu)游戲里內(nèi)嵌的是 RDNA ISA 著色器實為 PM4 命令緩沖區(qū)中的著色器二進制。PC 上的 Vulkan 只認 SPIR-V所以 AnyPS5 必須自己寫一個著色器重編譯器。流水線在 Recompiler.cpp 中按五級串聯(lián)源碼里的 include 順序就是執(zhí)行順序RdnaDecoder解碼 RDNA 指令RdnaInstructionDecoder::DecodeControlFlow用GraphBuilder建 CFG再用Structurizer結(jié)構(gòu)化TranslationRDNA 指令逐條翻譯到項目自研的中間表示IROptimizationSSA 構(gòu)建、常量折疊、死代碼消除、描述符綁定分配等一連串優(yōu)化 passSpirvBackend由SpirvEmitter最終發(fā)射 SPIR-V構(gòu)建時開啟ANYPS5_ENABLE_SPIRV_TOOLS還會用 SPIRV-Tools 做校驗與優(yōu)化。圖形鏈路的前端由 libSceAgcDriver 承擔(dān)游戲提交的 DCB/ACB 命令緩沖區(qū)先被解析成 PM4 包狀態(tài)、draw、dispatch解析邏輯見 Pm4.cpp命中的著色器經(jīng)重編譯后進入 Vulkan pipeline編譯產(chǎn)物由ShaderDiskCache緩存到磁盤后續(xù)運行直接復(fù)用。這條鏈路里最有技術(shù)含量的是執(zhí)行語義映射。RDNA 的 wave 是 32/64 線程一組的執(zhí)行單位而主機 Vulkan 的 subgroup 寬窄因硬件而異見倉庫測試 Wave32WideSubgroup.cpp。重編譯器在RecompileRequest里攜帶目標(biāo) subgroup 大小HostSubgroupSize()還會讀取APS5_SINGLE_LANE環(huán)境變量做單車道調(diào)試。此外還有s_saveexec/s_swappc等標(biāo)量指令語義、VK_KHR_fragment_shader_barycentric缺失時的回退路徑TechnicalDebt.md 中誠實記錄了這些已知邊界。社區(qū)那篇wave32 移植實錄32 寬波語義如何映射到 Vulkan 子組講的正是這塊倉庫里 BdaShader.cpp、Structurizer.cpp 等測試專門驗證映射正確性。為什么 CPU 不需要模擬構(gòu)建期完成一切轉(zhuǎn)換模擬器最大的性能殺手是 CPU 翻譯。AnyPS5 能繞開它源于一個結(jié)構(gòu)性的巧合PS5 和 PC 都是 x86-64。游戲里的 CPU 代碼本身就是 x86-64 機器碼無需翻譯、無需 JIT只要做兩件事重定位把 PS5 的內(nèi)存布局地址、重定位、TLS、動態(tài)節(jié)改寫成目標(biāo)系統(tǒng)的 SysV 布局讓加載器能正確裝載——這正是 relinker 干的事重定向系統(tǒng)調(diào)用與導(dǎo)入游戲調(diào)用的內(nèi)核 syscall 和 libSce* 函數(shù)被重寫為指向自研 PRX 實現(xiàn)。這兩步全部發(fā)生在構(gòu)建期的一次relinker調(diào)用里。運行期呢游戲就是一個普通原生進程CPU 指令直接執(zhí)行只有對系統(tǒng)庫的調(diào)用會進入自研 PRX。這意味著沒有解釋器、沒有二進制翻譯、沒有模擬進程運行期開銷趨近于零——這是社區(qū)文章運行期零翻譯開銷、純原生進程布局說法的代碼級依據(jù)。唯一例外的 CPU 層面工作是對 AMD 專屬指令的降級--to-intel但同樣是在構(gòu)建期一次性完成而且只針對 Intel 主機??蛇\行樁 真實核心策略降低移植成本的關(guān)鍵從零實現(xiàn)幾十個 PS5 系統(tǒng)庫的每一個函數(shù)工作量是天文數(shù)字。AnyPS5 的解法可以概括為一句工程哲學(xué)每個函數(shù)要么做它該做的事要么明確地失敗。機制很硬核未實現(xiàn)的函數(shù)統(tǒng)一調(diào)用NotImplemented_nid_no_patch拋std::runtime_error并終止進程。見 libSceAgcDriver/Unimplemented.cppint APS5_VABI sceAgcDriverGetShaderDebuggingStatus() { NotImplemented_nid_no_patch(__func__); return 0; }README 明確寫道Unsupported or unexpected states strictly throwstd::runtime_error。what()is printed to stderr and the process terminates. 這種寧可崩不可錯的哲學(xué)讓兼容性邊界完全可定位——任何未覆蓋的函數(shù)都會立刻暴露而不是靜默產(chǎn)生錯誤行為。而在函數(shù)已實現(xiàn)的路徑上則是盡量完整的真實核心。以 libScePad/Export.cpp 為例錯誤碼、設(shè)備信息、觸控板分辨率都按真實語義返回Uri.cpp 把 URI 解析做成符合 RFC 3986 的完整實現(xiàn)libSceAgcDriver 更是把 PM4 解析、繪制、present、紋理格式、DCC 元數(shù)據(jù)等一整套圖形棧都搬進了 CMakeLists.txt 的上百個源文件里。技術(shù)債文檔 docs/dev/TechnicalDebt.md 則毫不遮掩地記錄了靜默樁清單部分對話框只跑狀態(tài)機不顯示 UI、libSceHttp2 請求不出網(wǎng)、libSceAudio3d 不出聲、libSceHmd2 直接失敗讓游戲跳過 VR 初始化……這些可運行樁不是糊弄而是精心設(shè)計的降級路徑讓游戲能走完啟動序列、進到主循環(huán)把稀缺的工程資源集中在真正決定能不能玩的庫上。這正是可運行樁 真實核心策略的完整面貌——樁負責(zé)不阻塞運行核心負責(zé)給出正確結(jié)果?,F(xiàn)狀與邊界跑起來有多遠任何宣傳都要回到數(shù)據(jù)。兼容性列表 docs/user/COMPATIBILITY.md 目前只有一款完成驗證的游戲Dreaming SarahPPSA02929Windows 平臺可玩在 GTX 1050 Ti / i5-7500 上穩(wěn)定 60 FPS核顯 Intel HD Graphics 620 上 36 FPS。這個數(shù)字本身就說明了項目定位3D 大作還遠但 2D 平臺游戲已經(jīng)可以在中低端硬件上原生流暢運行且 README 明確指出著色器重編譯產(chǎn)物已通過 SPIRV-Tools 校驗。社區(qū)的討論也相當(dāng)理性3DM 報道指出項目目前尚無法完整運行游戲關(guān)于 GPL v2 許可與商業(yè)游戲的法律邊界項目在 README 的 Disclaimer 里做了明確聲明——僅面向互操作、研究、保存與兼容性目的不包含也不分發(fā)任何受版權(quán)保護的軟件或固件。技術(shù)上項目通過 docs/dev/PROGRESS.md 的進度地圖、庫覆蓋率和著色器指令覆蓋 badge 動態(tài)呈現(xiàn)還有多少路要走。回到標(biāo)題的問題不用模擬器能玩 PS5 游戲嗎AnyPS5 的答案是——不是玩 PS5 游戲而是把 PS5 游戲變成 PC 游戲。relinker 在構(gòu)建期完成格式轉(zhuǎn)換PRX 庫在運行期提供原生系統(tǒng)服務(wù)RDNA 重編譯器把 GPU 代碼翻譯成 Vulkan 生態(tài)的 SPIR-V三者缺一不可。這條路犧牲了打開即玩的通用性換來了原生進程的性能與簡潔。當(dāng)游戲庫的覆蓋率和 RDNA 指令集支持度繼續(xù)爬升時這條非模擬器路線會走多遠值得整個開源生態(tài)持續(xù)關(guān)注?!久赓M下載鏈接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows項目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考