Switch模擬器YUZU進(jìn)度報(bào)告2022-2月
本月,我們很自豪地展示了大量?jī)?nèi)核更改,這些更改最終修復(fù)了長(zhǎng)期存在的錯(cuò)誤、大規(guī)模的性能改進(jìn)、UI 和輸入更改等等!
圖形修復(fù),以及如何提高性能
由于 Linux 上的 RADV 驅(qū)動(dòng)程序存在問(wèn)題,在 AMD 的 RDNA2 顯卡上運(yùn)行時(shí),使用 Vulkan API 會(huì)使 yuzu 崩潰。 最值得注意的是,這個(gè)問(wèn)題影響了 Steam 平臺(tái),正如嘗試在其設(shè)備上測(cè)試yuzu的用戶所報(bào)告的那樣。
確定崩潰問(wèn)題是因?yàn)?VK_EXT_vertex_input_dynamic_state,一個(gè) Vulkan 擴(kuò)展,用于最小化著色器編譯過(guò)程中所需的管道對(duì)象數(shù)量。 這些結(jié)構(gòu)非常龐大,有時(shí),游戲可能只想更改其中的一小部分內(nèi)容,例如頂點(diǎn)輸入狀態(tài)。 使用此擴(kuò)展,API 可以通過(guò)簡(jiǎn)單的函數(shù)調(diào)用動(dòng)態(tài)更改結(jié)構(gòu)中的這些成員,無(wú)需創(chuàng)建全新的對(duì)象,從而減少操作使用的資源量。
雖然這個(gè)錯(cuò)誤正在解決, epicboy 推送了一個(gè) PR 將擴(kuò)展列入黑名單 在運(yùn)行 RADV 驅(qū)動(dòng)程序的 RDNA2 設(shè)備上,因此 yuzu 不會(huì)徹底崩潰。
但是還有一個(gè)驅(qū)動(dòng)給我們帶來(lái)了問(wèn)題。
Linux 上 Mesa 的 ANV 驅(qū)動(dòng)程序不支持紋理格式 VK_FORMAT_B5G6R5_UNORM_PACK16,這導(dǎo)致yuzu在運(yùn)行使用它的游戲時(shí)崩潰,例如 酷霸王之怒. 為了繞過(guò)這個(gè)問(wèn)題, voidanix 實(shí)現(xiàn)了一個(gè)模擬的解決方案 BGR565紋理 混合 RGB565,以此解決。
類似地, Morph 實(shí)現(xiàn)了 缺失的頂點(diǎn)格式 , 如游戲使用口袋力量棒球R asLody 還實(shí)現(xiàn)了缺少的 幀緩沖區(qū)格式 , 這次用于 妖怪手表4.
妖怪手表4
該開發(fā)人員的另一個(gè)修復(fù)是 添加缺少的信號(hào)量操作 為了 MaxwellDMA, 被使用 塞爾達(dá)傳說(shuō):曠野之息 和 寶可夢(mèng)傳說(shuō):阿爾宙斯
內(nèi)核變化,以及如何馴服 Smash
繼續(xù)在內(nèi)核上進(jìn)行的工作, 改進(jìn) bunnei 內(nèi)核內(nèi)存管理器 使其與最新的系統(tǒng)更新更兼容。
伴隨這些變化而來(lái)的一個(gè)巧妙設(shè)置是yuzu能夠支持不同的內(nèi)存布局,例如在開發(fā)人員單元中使用的“6 GB 擴(kuò)展內(nèi)存布局”(MOD社區(qū)要求的一項(xiàng)功能)。
一些模組可以使用比 Switch 提供的更多的 RAM,主要是高分辨率紋理替換。 為了解決這個(gè)問(wèn)題,bunnei 添加了一個(gè)開關(guān)來(lái)啟用擴(kuò)展的 6GB 內(nèi)存布局 真正的開發(fā)人員工具包將可用。 那些額外的 2GB 將允許重型模塊正常工作。 您可以在中找到設(shè)置 模擬 > 設(shè)置… > 通用 > 擴(kuò)展的內(nèi)存布局 (6GB DRAM).
擴(kuò)展的內(nèi)存布局 (6GB DRAM)
不要指望它會(huì)對(duì)模擬性能產(chǎn)生影響,游戲不會(huì)關(guān)心模擬控制臺(tái)是否超過(guò) 4GB,它們只關(guān)心是否有足夠的空閑內(nèi)存用于操作。
bunnei 還通過(guò) 將鎖遷移到使用模擬客戶鎖來(lái) 以及 改進(jìn)物理內(nèi)存的映射和解映射 .
與往常一樣,這項(xiàng)工作背后的最大動(dòng)力是提高我們實(shí)現(xiàn)的準(zhǔn)確性,同時(shí)還修復(fù)了過(guò)去幾年可能隱藏在那里的任何錯(cuò)誤。
Dynarmic 是我們的 ARM JIT 重新編譯器,本月也進(jìn)行了許多新的優(yōu)化和錯(cuò)誤修復(fù)。
Blinkhawk 更正了 Dynarmic 中內(nèi)存存儲(chǔ)/加載操作序列化的屏蔽邏輯 x64代碼發(fā)射器,并隨后 更新了子模塊 將這些更改帶入 yuzu 的代碼庫(kù)。 這修復(fù)了影響的卡死 寶可夢(mèng)傳說(shuō):阿爾宙斯.
在調(diào)查穩(wěn)定性問(wèn)題時(shí) 任天堂明星大亂斗, bunnei 和 Merry 發(fā)現(xiàn)問(wèn)題是由于在 SpaceRemaining函數(shù),用于計(jì)算緩存塊中 JITed 代碼可用的剩余空間。
Dynarmic 將這些代碼塊分成兩個(gè)區(qū)域,命名為 near和 far. 該方案旨在通過(guò)將“熱”代碼保留在 near隨時(shí)可供執(zhí)行,而“冷”代碼被推入 far地區(qū)。 由于計(jì)算剩余空間的方式存在錯(cuò)誤, near區(qū)域會(huì)溢出到 far區(qū)域,用“熱”代碼覆蓋“冷”代碼。 然后,CPU 將嘗試運(yùn)行之前存在的“冷”代碼,并在嘗試時(shí)嚴(yán)重崩潰。
最終,在幾場(chǎng)比賽后崩潰 SSBU,因?yàn)槟鞘呛谋M空間并溢出緩存所花費(fèi)的時(shí)間。 通過(guò) 糾正比較 用于計(jì)算這個(gè)值,開發(fā)人員終于能夠緩解圍繞這個(gè)游戲的最長(zhǎng)期存在的問(wèn)題之一。
任天堂明星大亂斗
Merry 也一直忙于 實(shí)現(xiàn)對(duì)新 CPU 優(yōu)化的支持 ,這使得通過(guò)使用 ARM 獨(dú)占訪問(wèn)指令的仿真 cmpxchg(比較和交換)指令 x64建筑學(xué)。
ARM 指令集包含可以排除對(duì)內(nèi)存地址的訪問(wèn)的指令,因此只有一些指令——在這種情況下是一對(duì):一個(gè)用于讀取值,另一個(gè)用于寫入它們——可以在多核環(huán)境中安全運(yùn)行,而不會(huì)受到干擾來(lái)自其它線程的指令,這些線程可能也想訪問(wèn)內(nèi)存中的相同值。
它通過(guò)在讀取內(nèi)存中的值后將地址標(biāo)記為“用于獨(dú)占訪問(wèn)”來(lái)實(shí)現(xiàn)這一點(diǎn),因此“獨(dú)占”存儲(chǔ)指令只有在使用此標(biāo)志標(biāo)記時(shí)才會(huì)寫入該地址。 另一方面,“正?!贝鎯?chǔ)指令旨在始終在寫入后清除該標(biāo)志。 因此,獨(dú)占指令可以利用該信息知道內(nèi)存地址中的值何時(shí)被非獨(dú)占指令改變,并重新啟動(dòng)整個(gè)作業(yè),直到操作成功。
ARM 能夠通過(guò)稱為 Exclusive Monitor. 但是在 x64考慮到多線程環(huán)境中測(cè)試和調(diào)試的復(fù)雜性,架構(gòu)可能非常困難。 因此,它們之前的實(shí)現(xiàn)相當(dāng)保守且效率低下,以確保并發(fā)性。
但是,可以通過(guò)使用 cmpxchg,它將內(nèi)存地址中的值與引用進(jìn)行比較,如果匹配,則將新值寫入其中。 因此,可以將內(nèi)存地址中的值用作引用,然后當(dāng)且僅當(dāng)存儲(chǔ)的值與引用匹配時(shí),將另一個(gè)值寫入同一地址。 依靠該指令的語(yǔ)義,可以將獨(dú)占內(nèi)存讀取和寫入內(nèi)聯(lián)到 JITed 代碼中并加快它們的執(zhí)行速度。
廣泛使用這些專有說(shuō)明的游戲,例如 寶可夢(mèng)傳說(shuō):阿爾宙斯,應(yīng)該會(huì)看到性能略有提高。
Nvidia2080
AMD RX570
一般錯(cuò)誤修正和 UI 更改
German77 在 UI 上做了一些工作來(lái)增加趣味性。
他改進(jìn)了 SDL 電池電量檢測(cè) ,重新調(diào)整了控制設(shè)置中的一些 UI 元素, 并為我們提供了新的、更漂亮的電池符號(hào)!
舊的電量圖標(biāo)
新的電量圖標(biāo)
German77 還 添加了新的熱鍵 應(yīng)大眾要求。 加入戰(zhàn)斗的是???取消??浚ㄓ糜诳刂破鳎⒋翱谧赃m應(yīng)過(guò)濾器、GPU 精度(在正常和高之間切換)和靜音/取消靜音。
更加便捷的熱鍵設(shè)置
另一個(gè)高度要求的修復(fù)是 改進(jìn) Amiibo 支持 . 我們的舊代碼不是很準(zhǔn)確,導(dǎo)致一些游戲失敗。 雖然還有改進(jìn)的余地,但這個(gè)新實(shí)現(xiàn)要準(zhǔn)確得多,現(xiàn)在應(yīng)該可以在大多數(shù)游戲中穩(wěn)定使用 Amiibo 轉(zhuǎn)儲(chǔ)。
我們還想宣布,對(duì)實(shí)體 Amiibos 的 NFC 掃描的原生支持正在開發(fā)中! 隨著進(jìn)展,我們將分享更多信息。
Morph 修復(fù)了最近出現(xiàn)的一個(gè)奇怪問(wèn)題。 在某些情況下,重新打開柚子后,窗口會(huì)是一個(gè)最大化的無(wú)邊框狀態(tài)。 事實(shí)證明,由于某種原因,配置文件在關(guān)閉 yuzu 后沒有重置無(wú)框標(biāo)志。 強(qiáng)制移除標(biāo)志 在每次啟動(dòng)時(shí)解決問(wèn)題。
Maide 為模組制作者和任何對(duì)游戲內(nèi)部結(jié)構(gòu)感興趣的人添加了一個(gè)非常有用的功能。 此前,yuzu傾銷基地 exeFS,其中僅包括來(lái)自基礎(chǔ)游戲的數(shù)據(jù),缺少更新或 DLC 中的任何新增內(nèi)容。 相反,通過(guò) 轉(zhuǎn)儲(chǔ)補(bǔ)丁 exeFS,就像 EliEron 過(guò)去建議的那樣 ,用戶將有權(quán)訪問(wèn)更新文件!
toastUnlimited 發(fā)現(xiàn) 噴射戰(zhàn)士 2中的庫(kù)存時(shí)崩潰 LAN 大廳 。 存根 IsUsbFullKeyControllerEnabled功能 這就是我們所需要的。 肆無(wú)忌憚地打你的朋友!
噴射戰(zhàn)士2
對(duì)于復(fù)古游戲迷來(lái)說(shuō),toastUnlimited 和 German77 都修復(fù)了 Nintendo Switch Online 服務(wù)中包含的 SNES 和 NES 模擬器(是的,您也可以轉(zhuǎn)儲(chǔ)和離線播放這些模擬器)。 存根 mnpp:app解決崩潰,并 更新流程修訂 我們的音頻仿真允許官方仿真器在 yuzu 上正常工作。
輸入改進(jìn)
正如每個(gè)月都會(huì)發(fā)生的那樣,german77 在這個(gè)部分中占主導(dǎo)地位。
作為測(cè)試當(dāng)前震動(dòng)設(shè)置強(qiáng)度的一種方式,您現(xiàn)在可以 強(qiáng)制控制器振動(dòng) 在配置振動(dòng)窗口打開時(shí)按任意按鈕都可以體會(huì)到震動(dòng)強(qiáng)度。
此窗口中按鍵可以體會(huì)震動(dòng)強(qiáng)度了
游戲手柄有漂移,不僅是 Joy-Cons 所熟知的飄逸問(wèn)題,而且每個(gè)游戲手柄都有一定程度的漂移。 為了隱藏這一點(diǎn),控制臺(tái)會(huì)自動(dòng)居中其搖桿。
限制之一 SDL 是它只能讀取 Nintendo 官方控制器上的工廠校準(zhǔn),跳過(guò)任何可能可用的用戶校準(zhǔn)配置文件。 我們通過(guò)在啟動(dòng)時(shí)自動(dòng)居中來(lái)解決這個(gè)問(wèn)題,但是搖桿仍然可以去任何它們喜歡的地方,所以 German77 添加了一個(gè)選項(xiàng)來(lái)手動(dòng)居中每個(gè)軸 作為附加選項(xiàng)。 只需在我們的控制器設(shè)置中右鍵單擊搖桿的任何方向。
只需要右鍵單機(jī)
添加了支持以 允許映射 Enter 鍵 ,之前只是重新啟動(dòng)了映射過(guò)程。
toastUnlimited 添加了對(duì)體感輸入的支持 至 yuzu-cmd,我們的可執(zhí)行文件的終端版本。 終端用戶現(xiàn)在也可以享受一些舞力全開。
改進(jìn)模擬以不使用模擬
xerpi 實(shí)現(xiàn)了 32 位版本 的 OutputDebugString, CreateCodeMemory, 和 ControlCodeMemory的管理程序調(diào)入。 謝謝!
xerpi 的幫助有一個(gè)更大的目標(biāo),而不僅僅是幫助一些鮮為人知的 Switch 模擬器。 他們正在開發(fā) vita2hos ,一個(gè)可以運(yùn)行的翻譯層 PlayStation VitaNintendo Switch 原生應(yīng)用和游戲! 前面的路很長(zhǎng),因?yàn)榇蠖鄶?shù) Switch 調(diào)試工具都是 64 位的,而 Vita 是一個(gè) 32 位的控制臺(tái),所以為了讓項(xiàng)目繼續(xù)進(jìn)行多次重寫和更改。
yuzu 缺少一些功能來(lái)提供完整的 32 位執(zhí)行模式支持,因此打開了 PR 以幫助改進(jìn)該領(lǐng)域,因?yàn)?xerpi 正在使用 Switch 模擬器來(lái)協(xié)助和簡(jiǎn)化開發(fā)。 我們迫不及待地想看看這個(gè)項(xiàng)目如何發(fā)展!
Vulkan 是未來(lái)
隨著工作 Project Y.F.C以及其它計(jì)劃的更改,我們正在慢慢地致力于默認(rèn)啟用 Vulkan,并保持 OpenGL 的長(zhǎng)期支持。 本節(jié)不會(huì)列出 yuzu 中的更改,但用戶可以調(diào)整設(shè)置以提高他們?cè)?yuzu 和其它模擬器中的 Vulkan 性能。
Vulkan 性能的主要問(wèn)題之一是當(dāng)前 GPU 將采取積極的頻率管理來(lái)節(jié)省電力。 由于即使是現(xiàn)代低端 GPU,Nintendo Switch 游戲產(chǎn)生的實(shí)際 3D 負(fù)載也會(huì)非常低,因此時(shí)鐘速度往往會(huì)保持在其頻率的省電方面。
一個(gè)顯著提高性能的簡(jiǎn)單方法是強(qiáng)制 GPU 以更高的時(shí)鐘頻率來(lái)運(yùn)行模擬器。 GPU 可以達(dá)到的最高值在這里通常是無(wú)關(guān)緊要的,因?yàn)榇蠖鄶?shù) GPU 將比 Switch 的 Tegra X1 更快,但更高的時(shí)鐘速度將使幀速率保持在較高水平并將卡頓降至最低。
NVIDIA 用戶在 NVIDIA 控制面板, Prefer maximum performance. 您可以在 3D Settings > Manage 3D settings > Program Settings tab點(diǎn)擊 Add并從可用選項(xiàng)中選擇 yuzu,然后向下滾動(dòng)到 電源管理 并將其設(shè)置為 最高性能優(yōu)先 .
nvidia控制面板
在 AMD 方面,這需要一些手動(dòng)工作,并且可能僅與基于 RDNA 的 GPU 兼容。 只有相對(duì)較新的 Radeon 驅(qū)動(dòng)程序添加了調(diào)整所包含的最小和最大 GPU 頻率的選項(xiàng) Radeon WattMan.。
需要做的是,以與 NVIDIA 類似的方式,將 yuzu 作為配置文件添加到 Gaming選項(xiàng)卡,點(diǎn)擊 Tune Game Performance并將調(diào)諧控制設(shè)置為 Custom. 啟用 GPU 調(diào)整,您將能夠調(diào)整 Min. Frequency (%).
雖然這可以在 Radeon Software 上全局設(shè)置,但我們建議使用每個(gè)應(yīng)用程序的配置文件
除了 GPU,提高內(nèi)存時(shí)鐘速度總是有助于仿真,尤其是在高分辨率下 AMD
以一個(gè)RX 6500 XT 為例,我們可以看到 寶可夢(mèng)傳說(shuō):阿爾宙斯 將其幀速率提高到 73% 時(shí) ,輕松超過(guò) RX 570,只需將最低時(shí)鐘速度從 500MHz 提高到 2875MHz(如下圖所示,提高了 475%)。
太省電也并不是什么好事
這里的性能提升可能是巨大的,但在某個(gè)點(diǎn)之后,性能將不再會(huì)有太大的提升,所以這里可以自己一點(diǎn)點(diǎn)拉高來(lái)調(diào)節(jié)測(cè)試。
未來(lái)項(xiàng)目
Project Y.F.C.隨著發(fā)展,更多以前被破壞的游戲開始變得可玩,它繼續(xù)成熟。 Blinkhawk 告訴我們,他目前正在將重點(diǎn)轉(zhuǎn)移到性能上。 我們迫不及待地想告訴你更多!
火焰紋章戰(zhàn)士
German77 一直在玩 實(shí)現(xiàn)一個(gè) Mii 編輯器小程序 . 目前的支持非常簡(jiǎn)單,但任何有興趣的人都可以免費(fèi)構(gòu)建拉取請(qǐng)求并嘗試它。
Mii編輯器小程序
這就是本月所有的內(nèi)容! 感謝您抽出寶貴時(shí)間閱讀,我們希望下個(gè)月再見。 感謝點(diǎn)贊、關(guān)注、評(píng)論、轉(zhuǎn)發(fā) 。