网站Boiling Steam采访了NS模拟器Ryujinx的作者GDKChan。在模拟器最高光的年代,对模拟器作者的访谈很多,访谈最有意思的地方在于你可以知道一些作者在写模拟器时的闲文逸事,以及作者对于一些人物事件的看法,有些说法相当毒舌。然而最近越来越少了。
通过这篇采访,我才知道原来Ryujin比Yuzu早进入实用阶段,也知道了这两个目前最先进的NS模拟器曾经有过合作蜜月期,但是遗憾的是现在基本已经不联系了。
以下为全文谷歌翻译,原帖地址,斜体为模都批注:
RYUJINX 创始人 GDKCHAN 专访
我(这是Boiling Steam的编辑)对 Nintendo Switch 仿真在过去几年中的发展感到震惊。对我来说,这就像 Valve 向公众推出他们的第一个 Proton 版本一样令人兴奋。Linux 游戏玩家不仅可以通过 Proton 玩他们最喜欢的 Windows 游戏,而且由于仿真,用户还可以以更高的帧速率和分辨率玩他们最喜欢的 Switch 游戏。在这两种情况下,体验几乎完美无缺,这要归功于 Valve/CodeWeaver 对 Wine 的贡献,以及(大部分)自愿的、严谨的工作程序员投入到他们的模拟项目中以确保流畅、无痛的体验。(这部分是在吹嘘V社的X64>linux中间层转换)
我特别喜欢Ryujinx模拟器,所以我想坐下来和gdkchan聊一聊,gdkchan是项目背后的核心和灵魂(但不要低估其他几位正在从事这项工作的开发人员)。gdkchan 不仅提供了 ekianjo 的问题和我自己的问题背后的基本答案。他扩展了其中的几个,当您阅读本文时,您会发现以下内容:
- 除了 Ryujinx 和 Yuzu 之外,还有其他 Switch 模拟器
- Ryujinx 是第一个模拟商业游戏的 Switch 模拟器
- 为什么 Ryujinx 开源
- 您是否可以在Steam 平台上模拟 Switch 游戏,以及是否可以使用游戏手柄浏览游戏转储
- Yuzu 和 Ryujinx 最初是如何合作的,但后来变得紧张起来
- gdkchan 不仅在 Switch 仿真方面拥有丰富的背景经验,而且在编写许多其他控制台仿真器方面也有丰富的经验
- 给那些希望进入仿真开发的人的建议
- 在 PC 上模拟 Switch 游戏与在本机硬件上玩的好处
- 为什么 Ryujinx 是用 C# 编写的
- Ryujinx 是否会支持 Apple 的新 M1 芯片(以及 Ryujinx 未来是否会运行在 ARM64 Linux 硬件上)
- 模拟某些游戏时不时出现的障碍(感谢,NVIDIA)
- 什么 GPU 最适合 Ryujinx 以及为什么
本次采访中还有其他一些好料,您必须通过阅读这篇文章才能找到答案。当我阅读他坦率的回答时,我对这次采访很着迷,我想你也会如此。即使你没有 Switch 或者对仿真感兴趣,我仍然认为你会学到很多你可能会觉得有趣的东西。
Boiling Steam (BS):你能告诉我们一些关于你是谁以及你为什么决定在 Switch 模拟器上工作的背景信息吗?您过去有模拟编码的经验吗?
gdkchan:小时候,我最喜欢的一件事就是玩游戏。那时,能够创造自己的游戏是我的梦想,这让我在几年后学习了编程。我开始用 Basic 编程,因为它是一种简单易学的语言,而且我家里有关于 Visual Basic 编程的书籍。起初,我尝试制作自己的游戏。大多数非常简单的东西,如井字游戏、刽子手、记忆游戏,甚至战舰。有一天我在网上找到了一个用Visual Basic写的NES模拟器,叫做BasicNES。这在当时很神奇,一个可以用我知道的语言运行我喜欢的游戏的程序!(这个使用VB编写的NES模拟器大家有兴趣也可以去看看。从模拟器编写入门角度,NES和GB是比较适合的)
当时,仿真对我来说并不是一个新概念,但在我 [发现] 这个项目之前,我只是一个用户,我真的 [有] 不知道它是如何工作的。一开始我并没有真正理解很多代码,但是 NES 的一个好处是有很多东西可以模仿。即使我不明白其中的大部分内容,我也能够一点一点地扩展模拟器,添加更多的映射器(它们是用于 ROM 库切换和其他东西的卡带内的芯片),像作弊支持这样的好东西, 等等。
最终,我有足够的信心开始自己的仿真项目。起初,我做了一个新的 NES 模拟器(因为我已经有了一些经验),然后是一个 Commodore 64 模拟器(重用了 NES 模拟器中的一些 CPU 代码),但是这个并没有走多远,尽管它能够运行一些游戏和基本 ROM。之后我做了一个SNES模拟器。这在当时是相当大的挑战,但在 3 周内我就能够在一定程度上渲染超级马里奥世界的标题画面。经过几个月的工作,它能够相对较好地运行几款 SNES 经典游戏,包括《超级马里奥世界》、《时空之轮》、《塞尔达传说:与过去的联系》、《超级银河战士》、《地球/母亲 3》、Mana的秘密等等,让我真的很开心。
当然,它甚至比不上当今最流行的 SNES 模拟器,它的声音模拟仍然很糟糕,但对我来说是一次很棒的体验,一旦我得到了所有的成就感那个工作。我认为这是只有当你自己做的时候才能理解的事情之一。
在 SNES 之后,我想尝试更雄心勃勃的项目。首先,我想用 C# 编写一个 3DS 模拟器。我之前提到过,以前的模拟器是用 Visual Basic 编写的。最终我迁移到 VB.NET,然后迁移到 C#。这只是自然迁移,因为两者都是 .NET 语言,我决定尝试 C#,因为它比 VB 流行得多。这是一个非常无缝的迁移,因为它们都使用相同的基类库;我基本上是用不同的语法做同样的事情。但是回到 3DS 模拟器,我确实写了大部分 CPU 模拟代码,但后来对项目失去了兴趣。几乎没有任何使用的 ARM 模拟器是一种浪费,所以我用它制作了一个 Raspberry Pi 板模拟器。它能够运行一些裸机程序,但仅此而已。
到 2016 年底,我开始了我在 Switch 之前的最后一个仿真项目,一个 PS Vita 模拟器。这个过程和 3DS 非常相似,但这次我决定用 C 来编写它。在 2 个月的时间里,我编写了大部分 CPU 仿真代码。事实是,在没有看到结果的情况下长时间工作可能真的很累,而且地平线上还有更多有趣的事情(我当时了解了 Nintendo Switch)。同样,编写 CPU 代码而不将其用于任何事情将是一种耻辱,所以我决定用它制作一个 GBA 模拟器,这要简单得多,而且不需要任何未实现的指令,是一个更旧的CPU。(有意思的转变)
我用这个模拟器大约一个月就得到了结果,最终让大部分 GBA 游戏都能运行。它甚至还进行了声音模拟,虽然它仍然有点偏离,但至少还可以。总的来说,我觉得 GBA 仿真比 SNES 更容易,这对某些人来说可能有点令人惊讶,因为 GBA 是较新的。SNES 有一个单独的音频处理器,它必须与主 CPU 同步运行,否则一些游戏就会死机。这部分当时对我来说非常困难。这个代码于 2017 年初公开,此后我对其进行了一些改进。但与其他模拟器一样,我并不是为了成为功能齐全的模拟器或与现有模拟器竞争而制作的东西,它只是为了学习和娱乐而制作的东西。
所以在GBA之后,我终于开始了Switch的工作。Switch 的一切都如此之快,到 2017 年底/2018 年初,我们已经有了可以在系统上转储游戏和运行自制软件的方法,这非常令人印象深刻,因为控制台本身是在 2017 年发布的。到年底2017 年,在了解到可以使用 [the] System.Reflection.Emit API从 C# 程序发出 .NET IL(中间语言)(.net的Intermediate Language技术有兴趣可以去搜索下)代码后,我有了一个疯狂的想法,即编写一个 ARM JIT 将 ARM 代码转换为 IL,并将其编译为.NET JIT 的机器码。
公平地说,这不是一个新想法。JPCSP,它是一个 Java PSP 模拟器,也做同样的事情(当然是在 Java 中)。我还了解到.NET Core JIT 被称为 RyuJIT,是日本海神龙 Ryujin 名称和 JIT(Just-in-Time compiler)的组合。而这背后的原因是一本关于编译器设计的著名书籍,有时也被称为“龙书”,封面上有一条龙(这背后也有自己的原因,但我认为就到此为止了)。所以,模拟器的名字基本上就是从中汲取灵感,结合了 Ryujin 和“NX”,这是开发过程中的 Switch 代号。事实证明,Ryujinx 并不容易发音,也许我当时应该考虑到这一点……
这几乎总结了[至于]为什么我决定从事 Switch 仿真和我过去的经验。这只是我觉得很有趣并且喜欢做的事情。从 GBA 到 Switch 是一个巨大的进步;较新的控制台模拟与 GBA 之类的东西大不相同,HLE 重新实现了操作系统服务和功能,而在那些较旧的系统上,您主要模拟硬件。尽管如此,它仍然有很多相似之处,所以我非常建议有人开始仿真,如果他们希望从头开始构建仿真器,可以从 NES 之类的东西开始。这对我来说是一次很棒的经历,老实说,当我开始它时我完全迷失了,但仍然设法在几个月内获得了一些功能,多年来我在这个项目上工作我提高了我的技能并遇到了惊人的伙伴,所以我很高兴。
使这个模拟器开源的主要原因可以追溯到我发现的第一个 NES 模拟器。这基本上是我进行模拟器开发的切入点,所以我希望 Ryujinx 将来可以对潜在的未来模拟器开发人员产生类似的影响,如果它还没有的话。对于愿意开始他们的第一个模拟器的人来说,最重要的事情之一就是相信自己。这听起来可能很傻,但它确实有效。不要放弃,继续努力,你最终会成功,而一旦你这样做的感觉是无价的。(可以说这段话很好的诠释了模拟器历史对传承的概念)
BS: Ryujinx 开发了多久?
gdkchan:如果算上 CPU 模拟器,我是 2017 年 10 月开始的。所以在撰写本文时,那将是四年。但我在 2017 年 12 月才开始使用模拟器本身,而模拟器直到 2018 年 2 月才公开发布。(算算也整整4年了)
BS:你是如何开发 Ryujinx 的?
gdkchan:在 Windows 上,我通常使用 Visual Studio Code,有时也使用 Visual Studio,具体取决于我在做什么。Visual Studio 有一些方便的工具,比如分析器,更适合调试,有一个内置的反汇编器等等。Visual Studio Code 的优点是更轻、启动速度更快且使用的内存更少,这对我来说很重要,因为我通常内存不足,而且模拟器使用了相当多的内存。在 Linux 上,我只使用 Visual Studio Code,因为那里没有 Visual Studio。
BS:你在团队内部如何处理这个项目?您是否有某种分工协调系统,每个贡献者都各自解决问题?是否有一些共同努力或更基本的设计讨论?你如何与其他贡献者沟通?
gdkchan:我们使用 GitHub 跟踪问题。当我看到似乎很容易解决的问题时,我通常会查看并尝试修复它。就我个人而言,我会考虑问题解决的难易程度,以及有多少游戏或用户将从中受益,来决定我下一步应该做什么。游戏对我的兴趣程度也是一个因素,如果我有游戏,也是一个因素。
对于“大”游戏发布,我们通常会在缺少很多东西时尝试拆分任务。例如,对于Monster Hunter Rise和Super Mario Galaxy(Super Mario 3D All-Stars包的一部分),我问LDj3SNuD(我们的 CPU 仿真贡献者之一)是否可以实现这些游戏所需的 CPU 指令。而riperiperi帮助我解决了GPU 仿真问题。
我们通常使用我们的开发渠道在 Discord 上进行交流。我们是一个小团队,因此协调工作非常容易。对于新的贡献者,我们通常使用 Discord 上的公共开发频道进行交流,或者直接在 GitHub 上进行交流,因为他们中的一些人没有 Discord 帐户。
BS:你自己真的在 Ryujinx 上玩 Switch 游戏吗?如果是,您最喜欢的游戏是什么?
gdkchan:通常不会。我一直在测试游戏,以确保我或其他人所做的更改不会破坏游戏,试图重现一些用户报告的问题,或者只是看看它的总体运行情况、性能和稳定性。我很少花时间去真正玩和享受游戏。不过我已经这样做了几次。在我重写 GPU [后端] 并且 3D 游戏开始真正可以玩后不久,我玩了Super Bomberman R的故事模式。比赛进行得非常好,即使在当时也是如此。我玩过Shantae Half-Genie Hero和Shantae and The Pirate’s Course同样;它们并不是要求很高的游戏,因此在开始工作后它们总是运行得很好。我喜欢 Shantae 游戏,很高兴现在在 Switch 上拥有所有 5 款游戏(而且它们都可以在 Ryujinx 上玩);这是我的最爱之一!(Shantae ,桑塔aka香缇系列是一个高难度的2D横版类银河恶魔城游戏,目前全系列有5作,在Steam和NS上都有)
另一个我在它出来后立即玩的“游戏”是Game Builder Garage。我知道这不完全是一款游戏,但我认为它也值得一提。我希望我小时候也能玩这样的游戏。我做了一个炸弹人克隆它,程序生成的关卡和带有某种“AI”的敌人(好吧,不是真的,他们只是随机选择方向)。它非常有限,但找到绕过限制的方法也是乐趣的一部分。我想这就是为那些内存、渲染能力和处理能力非常有限的旧游戏机编程的感觉。当时,我是用手柄玩的,但现在我们也直接支持鼠标了,所以你可以直接用你的电脑鼠标来玩(如果不知道,你可以在 Switch 上连接一个电脑鼠标来玩游戏Builder Garage也是。它是为数不多的支持它的游戏之一)。
BS:有些人可能没有意识到在 PC 上模拟 Switch 游戏的好处。你能解释一下这些好处是什么吗?
gdkchan:现在,好处是通过使用分辨率缩放以更高的分辨率播放,这使游戏看起来更好,特别是如果你有像 4K 这样的高分辨率屏幕。根据游戏的不同,也有可能以比 Switch 可以处理的更高的帧速率进行游戏。例如,我们有用户在PC上以120 FPS及以上的速度玩最近发布的Metroid Dread,这使得游戏感觉非常流畅。我们也有Amiibo 模拟现在它使用起来非常简单,并且允许您通过扫描物理 Amiibo 来解锁某些游戏的附加功能。使用我们的 Amiibo 模拟,你不需要拥有模型,你只需从菜单中选择它并单击按钮即可解锁额外的功能(如果你愿意)。
在未来,这将是重要的保存。现在,购买系统和游戏并不难,但未来,Switch 将停产,硬件不会永远持续下去。只要您有游戏、固件和密钥的转储,您就可以始终在 PC 上玩游戏,并且将来可能会在其他设备上玩游戏,这要归功于仿真。
BS:关于模拟器的一个热门话题是它是用 C# 编写的,这与许多其他模拟器不同。使用这样的语言有什么优点和缺点?
gdkchan:我认为大部分优势来自于个人喜好。我发现 C# 更容易理解和使用。.NET 通常比用 C/C++ 编写的应用程序更容易调试,并且由于内存安全和垃圾收集器等原因而不太容易出现错误,这可以防止由于越界访问引起的内存损坏或由于对象引起的内存泄漏等问题内存没有被释放。
那当然是有代价的,代价就是性能,这是缺点之一。但是,对于“热”函数(经常执行的函数),如果您愿意,可以消除边界检查。还可以通过分配“本机”内存并自行释放来减少 GC(垃圾收集)开销。.NET 使用 JIT,它在运行时编译代码。出于这个原因,它没有任何地方像 C/C++ 编译器那样有足够的时间来优化代码。这也对性能有影响。可以使代码速度更接近本机代码,但需要做更多工作,因为您需要手动对代码进行矢量化,而本机编译器可能能够自动对其进行矢量化。
我认为主要优点之一是C#已经拥有 JIT,因此可以只发出 .NET IL指令 并让 .NET JIT 为您生成机器代码。Java也有这个优势,物有所值。我们最终放弃了这种方法,因为它对我们来说不够灵活,但对于其他项目,我认为它可能运行良好(例如 Nintendo DS 模拟器)。我们遇到的问题之一是 .NET 的 JIT 需要相当长的时间来编译。对于一般的 .NET 项目来说,这已经很不错了,但是对于我们从 ARM 生成的代码,它的速度还不够快,而且我们也没有太多可以改进的地方。使用我们自己的 JIT,我们可以针对我们的用例优化它,即将 ARM 代码转换为 x86。它还允许我们做一些事情,比如在磁盘上缓存生成的 x86 代码,
BS: Ryujinx 曾经支持 Mac OS 一段时间,直到 M1 芯片被制造出来后不再支持。在这个新平台上支持模拟器的潜在障碍是什么?
gdkchan:Ryujinx并没有真正支持 Mac OS,现在仍然没有。当我们开始时,自然对 GPU 的要求很低,因为大部分 GPU 没有被模拟(当时我只有一个旧的集成 GPU 用于测试)。OpenGL 4.0 就是所需要的。当时,Mac 支持那个版本的 OpenGL,所以模拟器可以在那里工作。随着时间的推移,需求增加了,它不再与 Mac 兼容。那里的主要图形 API 是 Apple 自己的 API,称为 Metal。实现一个新的图形后端需要大量的工作,开发人员和我们在这方面工作的时间非常有限,所以我们优先考虑 OpenGL,现在 Vulkan 也在开发中。将来可能会实施 Metal 后端,但我们目前没有任何人从事这方面的工作,这不是优先事项。
至于 M1 支持,除了 Metal 后端,我们还需要 CPU JIT 上的 ARM64 后端。如果我们仍然使用发出 IL 并利用 .NET JIT 的旧方法,则没有必要,但这是我们为构建自己的额外灵活性而付出的代价。它还需要支持 ARM Linux,这是我们过去嘲笑的东西,所以我相信它很快就会完成。
除此之外,我不希望支持 M1 有任何其他重大问题,但是当您尝试支持新平台时,总会有一些惊喜。
BS:我们已经看到像Metroid Dread这样的游戏从第一天开始就可以运行,几乎没有涉及任何调整,并且可以流畅地 60 FPS 游戏。它如何让您和您的团队觉得您已经走到了这一步?
gdkchan:就我个人而言,我通常会考虑现在的下一步是什么。我认为这是一个副作用,因为大多数访问我们频道的人只是有一些问题需要解决,所以我在心里记下了“游戏 X 和 Y 需要修复,游戏 Z 在 AMD GPU 上有这个故障,有是在这个游戏的特定位置可能发生的崩溃,稍后再看,”等等。我很少花时间停下来看看我们到目前为止取得了多少成就,但看到所有这些确实让我很高兴游戏运作良好。
回到 2018 年,我想知道我们什么时候才能运行人们想玩的第一方 3D 游戏,比如《超级马里奥奥德赛》和《喷射战士 2》。我们也有用户询问模拟器何时能够运行上述 3D 游戏。直到 2019 年,我才终于让他们使用大型 GPU 重写(我称之为 ANGEL,或另一个 NVIDIA GPU 仿真库),并看到了Splatoon 2第一次渲染教程阶段 OK-ish 让我当时非常非常高兴。现在我们的 GPU 模拟已经成熟了很多,并且有更多的人来处理它,所以启动和运行一个新游戏通常非常简单,当它在发布时还没有运行,所以它没有这样的效果对我来说,但它仍然很好工作。
我问过其他一些开发人员,他们很高兴和自豪地看到像Metroid Dread这样的游戏在第一天工作。(所谓的0day支持新游戏,对于模拟器来说是一个非常高端的标志,这意味着模拟器的完成度已经基本接近原型机)
BS:根据您的经验,玩 Ryujinx 的最佳平台是什么?Windows?Mac?Linux?哪些 GPU?
gdkchan:我相信它是带有 NVIDIA GPU 的 Windows。但它也适用于所有供应商的 Linux。问题是 AMD Windows 驱动程序对 OpenGL 的支持很差。功能方面,还可以,最高支持OpenGL 4.6,但性能很差,而且这些驱动程序有很多错误。英特尔也在同一条船上。另一方面,NVIDIA 在 Windows 上有很好的 OpenGL 支持。Switch 还具有 NVIDIA GPU 的事实也是 NVIDIA GPU 通常更适合 Switch 仿真的部分原因,因为某些特定于供应商的功能仅在那里受支持。
在 Linux 上,情况有所不同。它为那些运行良好的 GPU 提供了开源驱动程序。这要归功于这些公司(英特尔和 AMD)为其 GPU 提供的文档,以及他们也有开发人员致力于 [the] Mesa 开源驱动程序,并有一个活跃的社区来维护它们。另一方面,NVIDIA 对开源不是很友好(这也使我们的工作变得更加困难,因为很难为其 GPU 找到好的、完整的文档)并且必须使用逆向工程收集大量信息。在 Linux 上使用专有驱动程序 blob 为 NVIDIA 提供了最好的结果,但据我所知,它的性能仍然不如 Windows。
如前所述,Mac 根本不受支持,因此我猜这会使它们成为运行它的最差平台。
(Win64平台仍旧是模拟器的最佳平台)
BS:目前,Ryujinx 使用 OpenGL 作为视频后端。有一个Vulkan PR 版本正在开发中。使用基于 Vulkan 的后端有什么好处?在 Windows 上运行 Vulkan 或在 Linux 上运行 Vulkan 之间有什么潜在区别?
gdkchan:大部分好处都是针对 AMD 用户的,因为如前所述,他们在 Windows 上对 OpenGL 的支持非常差。我不希望在 Linux 上有太多好处,因为那里的 OpenGL 支持已经非常好。Windows 上的 NVIDIA 也是如此,尽管两者都将受益于 Vulkan 上更快的着色器编译。Vulkan 使用一种名为 SPIR-V 的新着色器语言,它的编译速度比在 OpenGL 上使用的 GLSL 快得多,因为它是一种二进制格式,解析起来更容易、更快,因为您不需要解析文本,而且他们还使用新的编译器。
Windows 上的英特尔也在一定程度上受益,因为其 Vulkan 驱动程序上的错误较少。所有供应商都受益于仅在 Vulkan 上支持的功能,例如 3D 纹理压缩以及压缩和非压缩纹理之间的视图等。这些可以修复 OpenGL 上发生的一些图形问题,并略微提高性能。
BS:有没有计划在 Steam Deck 推出时制作一个对游戏手柄友好的 GUI?
gdkchan:现在不是,但是我们目前正在使用名为Avalonia的框架对 UI 进行大修。这应该会在未来更轻松地支持游戏手柄 UI 导航。让 Switch 官方主菜单正常工作的另一件事。自然,它被设计为通过控制器或触摸进行导航,所以当我们让它完全工作时,我相信它会在这些设备上很好地工作。然而,我没有这方面的预计到达时间,我不认为它会在 Steam Deck 发布时准备好,因为那已经很接近了,并且开发人员目前没有太多空闲时间来花在那个上。(采访者是一个专注于Steam和linux的新闻网站,这些问题属于夹带私货,因为Steam Deck 这台Steam掌机的原生操作系统是linux。但是steam和绝大多数模拟器都在Win10掌机上运行良好。)
BS:对于 Ryujinx 的 Steam Deck的性能,我们应该期待什么?
gdkchan:虽然 Windows 下 AMD 上的 OpenGL 存在一些严重的性能问题,但 Linux 下 AMD 上的 OpenGL 是一个更好的体验,因此我们预计在 Steam 平台上运行 Ryujinx 不会有任何重大的性能障碍。我们目前还处于将 Vulkan 支持合并到 Ryujinx 的主要版本的最后阶段,这最终应该会进一步提高 Linux 和 Windows 下 AMD GPU 的性能。
Ryujinx 目前功能齐全,可在 Linux 平台上使用,可直接从我们的网站下载,因此我们可以通过查看目前在 Linux 上使用 Mesa 驱动程序可用的其他 AMD APU 来推断性能的良好指标。
BS:你如何看待Yuzu这个项目?你和他们有过接触吗?
gdkchan:我认为这些年来我对这个项目的看法发生了一些变化,他们的团队也是如此。直到大约在代码开源并向公众宣布前一周,我才真正知道 Yuzu 的存在。我可能记错了,但我认为其中一位开发人员在实际发布之前在 Twitter 上取笑了它,这就是我了解它的方式。当时,当我得知另一个 Switch 模拟器正在开发中时,我有点好奇和兴奋,我不知道的太多了,让另一个团队来研究它可以揭示系统的一些未知之处。
当它最终发布时,我做的第一件事就是加入他们的 Discord 服务器以了解有关该项目的更多信息。我了解到也有其他人私下在开发自己的 Switch 模拟器,在 Yuzu 发布他们的之后,[其他人] 也决定发布他们的项目(像这样,只是举个例子)。当时,我也在考虑为该项目做出贡献。查看源代码,我已经看到了我已经实现,但Yuzu还没有实现的东西,所以这是我可以贡献的东西。所以我做到了,但当时我感到分裂,因为我不想放弃过去几个月已经完成的工作。
我公开发布 Ryujinx 的目标是至少有一个商业游戏展示一些东西。最初我使用Puyo Puyo Tetris进行测试,除了它看起来很简单而且我喜欢Puyo Puyo之外,没有特别的原因。即使在 Yuzu 发布之后,我还是决定继续研究它。要让游戏正常运行,主要缺少的是 GPU 模拟,我对此知之甚少。NVIDIA 的 GPU 文档很少,但我发现了一个名为Nouveau的开源 Linux 驱动程序,它有助于了解其工作原理。
当时,我每次创建“NV 贴图”时都会记录它,这基本上是用于 GPU 可访问资源(纹理、顶点数据、着色器等)的内存。附带说明一下,由于某种原因,该日志今天仍然存在……但无论如何,通过一些工作,我设法让Puyo Puyo Tetris渲染了徽标。它非常缓慢,可能看起来并不多,但是经过 2-3 个月的努力使它成为现实,甚至不确定何时最终会奏效,它确实感觉像是一个巨大的成就。
随着商业游戏终于可以运行,我决定发布代码。在这一点上,一些自制软件也可以运行,并且模拟器速度非常快,至少与竞争对手相比是这样。它也是第一个运行商业游戏的 Switch 模拟器,这也是一个不错的成就。无论如何,我一直和柚子一起工作,当时他们的团队很好,乐于助人。事情取得了进展,为 Ryujinx 创建了一个Discord 服务器,我们有更多的人为该项目做出了贡献,多亏了这一点,一点一点地,我们有了更多的游戏。跟随它足够长的人可能已经看到了《以撒的结合》和《洞穴物语+》第一次开始渲染的时候。
我认为当我们同时运行游戏时,事情开始变得模糊。其中一款游戏是Sonic Mania。Yuzu他们让它工作了。据我所知,Ryujinx 渲染游戏所需的唯一内容是 BGR565 纹理格式,我确实实现了该格式。我们宣布游戏大约在同一天开始运行。这在两个项目之间产生了一些讨论和“火花”。当时,Ryujinx 的优势在于可以更快地运行这款游戏,这要归功于使用 .NET JIT 方法,这使我们能够相对较快地启动和运行 CPU JIT,而Yuzu自己的 JIT 仍然依赖于 Unicorn 模拟器未实现指令,这很慢。
随着时间的推移,我们遇到了其他导致项目彼此进一步疏远的案例。这包括Yuzu 贡献者使用来自 Ryujinx 的代码而不包括 MIT 许可证要求的归属的情况。虽然,在我们公开要求后他们确实包含了它,但我们不应该需要这样做。事实上,他们有一个Patreon和早期访问版本,顾客付费以获取比他们的“主要”版本更早的功能的版本,这也使情况变得更糟。
现在,我们不再合作,也不联系彼此,这有点遗憾。也许双方都有责任。归根结底,考虑到他们的早期访问模式以及他们在 Patreon 上每月赚多少钱,他们更大的媒体曝光率和用户群,很难在不感到被剥削的情况下进行协作。
总结一下,我可以说的是,我对项目本身没有任何反对意见。他们的目标与我们的有些不同。我很高兴我最终坚持了自己的项目。(按照yuzu那边的说法,未经授权的代码引用是非核心成员做的,然后一天内得到了更正。总之gkdchan对yuzu的疏远主要是源自于yuzu的收费赞助。这是人性,可以理解。相比之下Ryujinx完全免费完全开源的态度更为纯粹无暇,但是未必高效)
BS:随着时间的推移,任天堂是否让模拟器变得更加困难?比如,新游戏试图使用尚未模拟的某些方面?
gdkchan:一般来说,没有。有固件更新会添加新服务,我们最终需要在模拟器上实现(因为这是一个 HLE 模拟器),但主要更新并不那么频繁,更新和使用游戏之间通常有几个月的间隔新的服务功能正在发布,所以如果我们愿意,我们有时间在模拟器上实现它们。
着色器编译器或 NVN 的更改也可能使新游戏需要尚未实现的功能。例如,有一段时间(大约 2019 年)游戏开始使用 BRX 着色器指令,这是以前的游戏从未使用过的。它是一条间接分支指令,用于跳转到代码中的任意位置,在 GLSL 上很难支持,因为我们不知道它可能跳转到的位置。这很可能是 NVIDIA 的着色器编译器以前无法完成的优化,但现在 [它] 可以了。
Shantae and the Seven Sirens没有在发布中工作,因为它使用了一种在NVN上引入的新型事件。我发现这要归功于我在进行 GPU 重写时对 NVN 所做的逆向工程工作。这也允许我挂钩 NVN 函数调用并记录所有调用和传递给它们的参数,这使得在高层次上查看游戏正在做什么变得非常容易。多亏了这一点,我可以轻松找到该函数以及它传递给 GPU 的命令以及游戏所期望的内容。没有它,天知道要花多长时间才能找到问题。
在某些时候,他们 [NVIDIA] 还增加了对单独采样器的支持,这允许将用于从纹理采样的采样器在着色器本身上指定。这是使用无绑定纹理实现的,这是一个更广泛的功能,允许在着色器上访问任何纹理,而无需预先绑定它。模拟无绑定纹理非常困难,因为我们无法预测将访问哪个纹理。纹理池中的任何纹理都可能被访问。为了支持它,我们需要加载池中的所有纹理,这意味着高 VRAM 使用率和一些性能影响。最重要的是,它还有其他复杂性,但我们设法使用不同的方法来支持它。我们对着色器进行某种形式的数据流分析,以找出无绑定句柄的来源,然后将访问转换为常规绑定纹理访问。这是所有虚幻引擎游戏在添加到 NVN 后开始使用的东西,因此这种无绑定支持使它们能够渲染得更好。
大多数时候,NVIDIA 是通过扩展 NVN 或改进其着色器编译器来使事情变得“更难”的公司,这需要改进 GPU 仿真。但这不是经常发生的事情。(也就是说任天堂带来的模拟困难还不如N卡驱动改变带来的麻烦)
BS:虽然本身并不是真正的模拟器,但您如何看待像Box64这样的项目,在 ARM 机器上带来 x86 游戏?
gdkchan:我觉得很有趣。我过去已经尝试过 x86 仿真,但它是一个完整的 PC 仿真器,像这样的东西应该有更好的性能,因为它本质上只是将程序从 x86 重新编译到 ARM,并且它可以使用本地库,类似于 Apple 所做的与 Mac M1 的 Rosetta 2。不过,这些设备上的 GPU 非常有限,所以我想这是运行 PC 游戏的问题吗?当我尝试将 Ryujinx 移植到 ARM Linux 时,我自己也遇到了这个问题。我用的是树莓派 4B 进行测试,它的 GPU 非常有限。我记得它只支持 OpenGL 2.1 和 GLES 3.1,现在还支持 Vulkan 1.0。(目前使用中间层转译技术的跨平台方案越来越多,模拟器只是其中的一个应用场景。ARM<>X64才是重头戏。)
BS:如果你今天重新开始这个项目,事后看来你会做一些非常不同的事情吗?
gdkchan:是的,正如我之前提到的,我一开始对 Switch 的工作原理一无所知。现在我更了解它,并且能够做出更好的决定。我可能应该通过逆向工程 NVN(Nintendo Switch 图形 API)来启动 GPU 仿真。我很晚才决定这样做,它帮助我了解游戏可以利用哪些功能,如何使用它们,并发现以前在 Nouveau 上没有记录的 GPU 寄存器的含义。
还有整个 ARM 代码到 .NET IL 方法。我们后来使用我们自己的 JIT 以获得更大的灵活性,但是如果我从一开始就使用我们自己的 JIT——相当多的时间 [是] 花在这个重写上——[额外的时间] 可以 [已经] 花在一些事情上否则。老实说,它甚至可以使用 IL 方法;真正缺少的是在设计它时考虑到实现我们自己的 JIT 的可能性,以便拥有 IL 和 x86 后端成为可能。现在是,但当时它只是直接发出 IL。
还有一个名字叫“Ryujinx”。你怎么念它?这不是很明显,名字也不那么短。如果我今天重新开始,我可能会选择一个更短更简单的名字。(世上没有后悔药,但是分享悔意带来经验)
BS:如果你已经“完成”了 Switch 模拟器,接下来你想做什么?
gdkchan:我不确定在我完成这个模拟器后我是否会在模拟器上工作。在这个项目上工作很有趣,也是一次很棒的学习体验,但是为像 Switch 这样的现代控制台编写一个具有良好性能和兼容性水平的模拟器需要很多年,我真的不想在一个再次模拟项目。不过,我对任天堂的下一个控制台感兴趣。根据它与 Switch 的接近程度,我会考虑为这样的 [a] 系统制作一个新的模拟器 [同时] 重用 Ryujinx 代码的一部分。
我还是想做个游戏。前段时间我有一个想法,我想尝试一下,我只需要想出一个好故事并开始工作。我可能会在这个项目之后做。还有一些我想完成的不完整的 ROM 黑客工具。几年前我在帮一个翻译组编辑Legaia传奇的文字,我还需要完成它……(估计Ryujinx还要做很久,所以这个问题实际意义不大,作者的想法随时会有变化)
BS:除了通过Patreon在财务上支持该项目,社区还能做些什么来帮助它成长?
gdkchan: C# 开发人员可以通过改进模拟器、修复错误或实现新的东西来提供帮助。对于之前没有任何仿真经验的人来说,一开始可能有点困难,但我认为在这样的项目上有很多不同的事情要做,要找到足够容易做的事情并不难。除此之外,宣传也有帮助!并帮助 Discord(或其他社交网络)上需要帮助设置或对特定游戏有问题的用户。测试(和重新测试)游戏和报告错误也有帮助。(写模拟器可能是要大神来完成,但是还有很多耗时耗力的工作可以大家一起完成,比如测试。)
BS:关于我们可以期待哪些新功能,您能否给我们一些预告?
gdkchan:我之前提到过,但让 Switch 主菜单工作是我们想要做的事情。也许我们很快就会有更多东西要展示……除此之外,还有一些我一直在做的有趣的事情,但现在提及它们还为时过早。当它更完整一点时,我会在某处提及它。除此之外,还有一些我们已经宣布的东西,比如Avalonia 和 Vulkan,已经接近完成了。(One more thing总是有趣的,但是这次好像没多少内容)
“我认为仅此而已。希望不要太长或太短,”gdkchan 在回答我的最后一个问题后告诉我。嘿,那是大量的信息,那是很好的信息!我们要感谢他在回答我们的问题时倾注心血。还要感谢他和其他几位参与 Ryujinx 的开发人员:
- Ac_K
- Thog
- riperiperi
- LDj3SNuD
- emmauss(负责新的 Avalonia UI)
- Moosehunter
- Lordmau5
- 其他几个较小的贡献者——如果你在本模拟器上工作过,你可以在评论中告诉我,我可以在这里添加你的名字
访谈结束。
我们将来能在1个模拟器加载另一个模拟器实现叠加模拟,期待这一天
PPSSPP上可以运行不少模拟器,不是知道是不是你想要的?我希望在VR环境下实现完善的模拟器虚拟,这样就和我们小时候的体验差不多了