Switch模擬器Ryujinx進度報告2022-8月
又一個月過去了,這意味著來自您最喜歡的任天堂Switch模擬器的另一份進度報告。
我們對 GPU、CPU、內(nèi)核和服務(wù)仿真進行了常規(guī)的滾動改進,做了大量的代碼清理,最后發(fā)布了新的 LDN 版本。
顯卡:
使用 OpenGL 驅(qū)動程序運行游戲并不陌生,本月也不例外?!稊?shù)碼寶貝物語:網(wǎng)絡(luò)偵探
》、《熱血少女Zero》和《雷頓神秘之旅 卡特莉艾爾與大富豪的陰謀
》等游戲會表現(xiàn)出小的紋理破壞,通常以線條或彩色頂點的形式出現(xiàn),而這些都不是。這最終是由于Ryujinx用于將紋理數(shù)據(jù)刷新到CPU的方法效率相當(dāng)?shù)拖虏⑶胰菀壮霈F(xiàn)自己的錯誤。雖然單獨修復(fù)刷新機制中的潛在問題很重要,但為修復(fù)這些OpenGL標(biāo)題而提出的解決方案是為這些紋理數(shù)據(jù)傳輸實現(xiàn)一條新的快速路徑,從而完全繞過刷新。
在Vulkan合并后,AMD和英特爾GPU的所有者很快意識到,當(dāng)選擇API時,Mii編輯器小程序有些崩潰。雖然它在OpenGL中工作正常,但嘗試在Vulkan中打開Mii編輯器會導(dǎo)致徹底崩潰或表現(xiàn)出圖形錯誤,例如某些視覺元素根本沒有顯示:
這個特殊問題被追蹤到一個無效的布爾常量(1字節(jié))的賦值,然后直接分配給一個整數(shù)(4個字節(jié))。這導(dǎo)致某些 GPU 供應(yīng)商出現(xiàn) SPIR-V 解析失敗,因此此處的解決方法是刪除這些無效分配。
關(guān)于Vulkan的話題:分娩并非沒有出牙疼痛和一些小的倒退。其中一個回歸表現(xiàn)為在《集合啦!動物森友會》和《萊莎的煉金工房》中在Vulkan和 OpenGL 圖形 API 上的閃爍。
這兩個問題都可以追溯到最終Vulkan rebase期間的疏忽,在新添加的采樣器池緩存之后,紋理綁定將使用錯誤的采樣器池。這里只需要一行修復(fù)即可將正確的采樣器池作為參數(shù)傳遞。
撇開“紋理”這個詞不談,本月對定義的格式及其相關(guān)的格式表進行了一些更一般的內(nèi)務(wù)處理更改。ETC2紋理格式被添加到Vulkan中,盡管奇怪的翻轉(zhuǎn),這次實際上是NVIDIA不支持它們的使用。AMD和英特爾的所有者應(yīng)該看到Vegas Party,輻射島和任何其他使用上述格式的人都可以玩。
整個格式表也進行了重構(gòu),以便為格式提供有意義的名稱,而不是使用所謂的“幻數(shù)”。編程中的幻數(shù)是原始使用的值,并且沒有關(guān)于其使用的有意義的上下文。
最佳做法是為這些幻數(shù)分配一個常量,以便將來貢獻者能夠理解其含義。這并不總是那么容易,特別是在逆向工程和仿真中,你可能直到很久以后才確切知道某物是什么。值得慶幸的是,我們對Switch的了解已經(jīng)成熟多年。英偉達最近也發(fā)布了大量文檔!即使對于許多閱讀這些報告的非編碼人員來說,可讀性的差異也是天差地別:
某些顏色格式(如 RGBX)沒有 alpha(透明度),因此,當(dāng)應(yīng)用某些需要 alpha 的操作時,理想情況下,這些操作不應(yīng)接觸沒有所需組件的顏色格式。不幸的是,這不可能輕易做到,但我們可以讓它們表現(xiàn)得好像alpha總是一個靜態(tài)的1(完全不透明)。這解決了 穆拉納秘寶 中的一個問題,即地面被渲染為黑色矩形而不是…好吧,不是一個黑色的矩形。
《異度之刃3》是一個有趣的版本。一方面,游戲在圖形上似乎在硬件方面表現(xiàn)非常出色。另一方面,穩(wěn)定性被擊中或錯過,不是一個,而是三個不同的崩潰,都以菜單為中心。
其中第一個要調(diào)查和解決的問題是 OpenGL 獨有的,它以 TDR(超時檢測和恢復(fù))的形式表示。
OpenGL 不允許指定頂點緩沖區(qū)的大小,這可能表示函數(shù)有時可能會從緩沖區(qū)邊界之外調(diào)用地址。為了解決此問題,需要創(chuàng)建第二個臨時緩沖區(qū)來容納這些越界訪問方案。具有諷刺意味的是,這個問題是眾所周知的。最明顯的次要修復(fù)實際上是超級馬里奧奧德賽中的瀑布。
4年來,用戶已經(jīng)注意到,在水煙效果中可以看到三角形的偽像,在《前進!奇諾比奧隊長》中也可以看到。這是由導(dǎo)致 異度之刃3中TDR的完全相同的問題引起的,并展示了為什么您今天應(yīng)該總是推遲一件事,而明天可能會解決兩件事!
在游戲過程中和 異度之刃 3 的菜單中,Vulkan 仍然可能會出現(xiàn) DeviceLoss 崩潰,盡管我們還不確定原因,并且 OpenGL 在這里修復(fù)的問題不會影響 NVIDIA Vulkan,正如人們所期望的那樣。還有一個與內(nèi)存相關(guān)的最終崩潰,與選定的圖形API無關(guān)。為什么他們都選擇發(fā)生在完全相同的菜單上,做完全相同的事情,并且似乎出于完全不同的原因,這暫時超出了我們的理解范圍;我們希望在不久的將來為您取得更多進展。
不過,我們還沒有完成 異度之刃3,因為本月已經(jīng)推出了第二個修復(fù)程序,這次是專門針對AMD用戶的。AMD不滿足于讓NVIDIA成為本月格式支持缺陷的唯一罪犯,AMD不支持Vulkan上的RGB16頂點格式,因此需要回退格式。如果不支持 RGB16,則使用 RGBA16 頂點格式解決了這些 GPU 在嘗試啟動游戲時面臨的即時崩潰問題。還添加了用于清除渲染目標(biāo)的 HLE 宏,因為 AMD 驅(qū)動程序強烈反對清除單個切片。
如果你希望我們逃離異度之刃的領(lǐng)地,再想一想。最近的一項變化帶來了 異度之刃:最終版分辨率縮放的回歸,看起來有點不對勁。某些比例值未跨紋理和圖像正確更新,導(dǎo)致上述問題。游戲現(xiàn)在再次正確縮放。
結(jié)束本月GPU部分的一些小變化包括:
如果支持該功能,則不會再觸發(fā)幾何著色器直通的回退。修復(fù)了英偉達上《漫威終極聯(lián)盟 3》中的回歸問題。
更改一些以前未定義的 SPIR-V 值以進行初始化,而不是保留為可能未定義的值,因為 NVIDIA 驅(qū)動程序似乎不喜歡這樣做。修復(fù)了 塞爾達傳說:織夢島 中的傾斜模糊效果,以及使用Vulkan時可能出現(xiàn)的一些閃爍。
新超級馬里奧兄弟 U 豪華版中的 OpenGL 獨占回歸導(dǎo)致零引用異常崩潰。通過在嘗試獲取紋理的圖層計數(shù)之前確保幀緩沖區(qū)確實存在,回歸已得到修復(fù)。
OpenGL 著色器重新編譯現(xiàn)在再次采用多線程處理。在 Vulkan 合并之后,OpenGL 在啟動時用單個線程重新編譯著色器,而不是預(yù)期的最大值 8 個!
中央處理器:
CPU重新編譯器繼續(xù)改進,本月見證了一堆新指令的添加,這些指令的名稱聽起來很復(fù)雜,這些名稱變得有點模糊。
更多 32 位Thumb指令:
LDM/STM
LDAEX/STLEX
LDR/STRLDRD/STRD
更多 32 位指令:
SHA256
MRS Rd
第二批是現(xiàn)在最有趣的,似乎無處不在,這是最新的馬里奧卡丁車8 Deluxe更新所要求的:2.1.0。作為直接的Wii U端口,馬里奧卡丁車8豪華版是為數(shù)不多的在32位指令集上運行的值得注意的Switch游戲之一,因此從一開始我們就對其進行了測試。有了這些新的指令,游戲?qū)⒒謴?fù)到一如既往的輝煌。
SHA256指令專門接受了硬件加速處理,并添加了檢查以確保指令支持vex編碼;沒有這個,就有可能進行無效分配。
內(nèi)核/服務(wù):
雖然Ryujinx目前阻止了與任天堂在線服務(wù)的連接,但這并不意味著我們不必與一系列網(wǎng)絡(luò)的問題作斗爭。如果某些應(yīng)用程序“認(rèn)為”它們已連接到 Internet,則在啟動時會有不同的反應(yīng):嘗試連接到服務(wù)器、調(diào)用不同的服務(wù)或只是通常很煩人。
考慮到這一點,讓我們看一下本月最終確定的幾個服務(wù)實現(xiàn):
“加載網(wǎng)絡(luò)服務(wù)許可證金同步”是 精靈寶可夢:阿爾宙斯 在啟用訪客互聯(lián)網(wǎng)接入時需要的。游戲仍然有點卡住加載,但一次一個路障,對吧?
“結(jié)束自由通信”可以防止某些標(biāo)題(如《噴射戰(zhàn)士 3:試玩版》)在第一個初始屏幕之后崩潰。
“解析器集選項請求”被存根,這允許 危險老鼠 運行游戲。
網(wǎng)絡(luò)套接字實現(xiàn)中的兩個疏忽不是一個,而是兩個疏忽得到了解決,最終結(jié)果是 我的世界 在來賓互聯(lián)網(wǎng)被禁用時可以啟動。如果啟用此設(shè)置,游戲仍將崩潰;如果《我的世界》是一款出于某種原因讓你對Switch感興趣的游戲,請記住這一點。
gdkchan還利用 August 廣泛優(yōu)化了內(nèi)核查找內(nèi)存塊的方式,從鏈表遷移到紅黑樹。如果你沒有參加過計算機科學(xué)課程,那么這些對你來說意義不大,但請放心,新方法的速度要快得多。對于那些已經(jīng)參加過CS課程的人來說:鏈表具有O(n)復(fù)雜性,而紅黑樹是O(log n),這意味著在最壞的情況下,新方法在尋找所需的內(nèi)存塊方面效率要高得多。
圖形用戶界面/雜項:
貢獻者CloneDeath這個月拖了一把拖把到我們的代碼庫,并決定它需要一個春季清潔在相當(dāng)…一些….不同…區(qū)域,其他貢獻者加入組合,刪除各種未使用的字符串,重命名函數(shù)并減去冗余代碼。這不是最迷人的工作,但對于一個如此大的項目,基礎(chǔ)知識同樣重要。
我們收到的 WIP Avalonia GUI 的翻譯和區(qū)域設(shè)置更新比我們所能撼動的要多,但我們非常感謝社區(qū)在這方面的廣泛支持!波蘭語和日語區(qū)域設(shè)置已添加日語(再次是的),中文,德語和土耳其語,所有這些都接收更新以包含最新字符串。翻譯列表本身現(xiàn)在排序得更直觀,每個翻譯都以自己的母語顯示。
我們有一個長期存在的謊言,是時候最終承認(rèn)了。對于大多數(shù)人來說,舊的“清除PPTC緩存”按鈕將帶來巨大的震撼……實際上并未清除 PPTC 緩存。我們知道,這是不可接受的。直到2022年8月18日(這一天將臭名昭著),才終于有人勇敢地解決了這種公然濫用信任的行為。該函數(shù)不是清除 PPTC,而是在下次運行時將重建排隊。此后,這種嚴(yán)重的錯誤打印已在UI中進行了更新,以反映真實行為。不久將發(fā)布一段道歉視頻,其中包括眼淚和從這次經(jīng)歷中成長的承諾。
對于一些更改:您的游戲目錄列表現(xiàn)在只有在與列表相關(guān)的設(shè)置發(fā)生更改時才會刷新。考慮添加或刪除目錄,或者將游戲更新到最新版本。以前,即使更改圖形后端或增加分辨率也會導(dǎo)致完全重新加載:對那些擁有大型庫或使用網(wǎng)絡(luò)存儲的人是災(zāi)難。
金手指是視頻游戲的基本組成部分,所以當(dāng)一些隨機作弊不起作用時,它可能會讓人覺得宇宙本身正試圖讓你走上正確的道路。幸運的是,我們可以忽略宇宙并解決一個小錯誤,該錯誤導(dǎo)致一些作弊不起作用。
我們從七月的Vulkan合并中進行了一些清理。數(shù)以百萬計的Flatpak用戶的聲音都立即喊叫起來,并迅速被修復(fù),以確保在此版本中提供一些必需的軟件包。沒有它,即使選擇Vulkan也可能導(dǎo)致相當(dāng)令人討厭的崩潰。
對于那些不知道的人:Avalonia實際上是一個完全渲染的框架,因此確實利用OpenGL或Vulkan來繪制它自己。隨著 Vulkan 的合并,我們面臨著一項艱巨的任務(wù),不僅要確保游戲呈現(xiàn)良好,還要確保它不會破壞迄今為止我們 GUI 過渡中投入的所有工作。幸運的是,所需的修復(fù)是次要的,并且一下子就解決了。
結(jié)束語:
如果你是那些瘋狂地按Ctrl-F來刷每個進度報告的人之一:LDN,Mac或Vulkan 2:Electric Boogaloo(只有我?),那么我們在LDN方面有好消息,如果您還沒有聽說過,我們在 8 月份發(fā)布了 LDN 版本 2.5,這使 LDN 內(nèi)部版本與主版本 1.1.224 保持同步。這意味著更多的游戲是可玩的,更重要的是,對于那些被困在AMD和英特爾GPU上的可憐的靈魂來說,每個游戲都更容易玩。因此,我們看到更多的人在LDN上喜歡 噴射戰(zhàn)士 2和馬里奧賽車8豪華版(都是著色器繁重的游戲)。有關(guān)自 2.4 以來更改內(nèi)容的下載和更全面的列表,請查看上一篇LDN2.5的文章。
好吧,總之,我們想向所有用他們的時間,知識,金錢或熱情支持該項目的人表示感謝。沒有他們,我們真的不會還在這里。作為一個開源項目,我們從社區(qū)參與和外部貢獻中茁壯成長;如果您在計算機圖形學(xué),低級系統(tǒng)或任何UI和網(wǎng)頁設(shè)計方面有一些知識,那么有一個地方適合您。模擬器可能看起來難以接近,但其有真正無窮無盡的潛力。
最后,我們期待下次的相見!