Switch模拟器Ryujinx进度报告2022-10月
就像之前的九个月一样;十月已经悄悄地过去了。
尼尔,女神异闻录,猎天使魔女,以及令人垂涎的“为什么会有续集?”奖的新竞争者:马里奥+兔子!虽然最后一个就模仿该死的东西而言有点恐怖的故事,但我们对本月大多数新游戏的运行感到兴奋,开发团队几乎没有或很少修复。更少的修复卡顿时间意味着更多的时间在实验室中开发新功能和改进,以获得模拟乐趣。
显卡:
为了让我们轻松进入GPU部分,让我们从大多数喜剧节目中的经典开始:单行。《异度之刃》粉丝的狂热目光凸显了《异度之刃编年史2》中OpenGL和Vulkan在过场动画播放方面的差异。我们被告知,雷克斯通常不会要求理发师进行背面和侧面褪色,但这很适合他,不是吗?
无论哪种方式,这都是不准确的,事实证明,当我们创建自定义边框颜色时,没有代码行可以实际将其传递给驱动程序。因此,我们只能说:我的。
随着(当时)即将发布新的 马里奥 + 疯兔游戏,推动了第一款 马里奥 + 疯兔游戏在Nvidia上的Vulkan中实际启动。在极少数情况下,AMD 没有受到此特定错误的影响,因为已经被迫使用不同的代码路径进行 blit。它只是表明,在某些情况下,它有助于始终如一的错误,以至于开发人员为您编写了一条特殊的路径!对于 Nvidia,由于某些驱动程序参数被反转并因此尝试访问越界的数据而导致 DeviceLoss 错误。翻转这些参数可以让游戏最终在Nvidia Vulkan上启动。
最近从着色器解码器重构的回归导致大型图形错误开始出现在孤独之海和暗影归来中。由于始终使用错误的指令寄存器作为检查标志,无绑定消除无法触发。修复正在读取的寄存器可以解决两个标题中的回归问题。
在上个月关于将四边形(Vulkan 本身不支持)转换为三角形的一些更改之后,路易吉洋馆 3 在将其小地图保持在一块中遇到了麻烦。
该地图应有六个顶点,最后两个被忽略,从而形成一个四边形。不幸的是,这被四舍五入,而不是被忽略,最终形成了两个四边形而不是一个。通过修复此计算、小地图和在此过程中发现的其他一些杂项问题,可以快速解决此问题。
马里奥赛车 8 豪华版 在使用Vulkan时表现得很顽皮,并且在使用混合常量时创建了未绑定数量的图形管道。游戏似乎在每个轨道的不同阶段混合了颜色,这导致生成的管道数量膨胀。通过使用减少的动态状态数量来限制此行为可以降低管道创建的成本,还可以将 内存 使用量减少少量但明显的量。
让我们再次讨论曲面细分。如果您感到似曾相识,请不要担心;我们上个月也报道了它!在 猎天使魔女 3发布后不久,几乎立即注意到,令人震惊的恐怖,AMD GPU正在崩溃标题。修复涉及简单查看OpenGL及其着色器语言GLSL如何处理事情。细分控制着色器始终以与“gl_InvocationID”相同的方式在 GLSL 中索引,这在 Vulkan SPIR-V 控件着色器上没有完成。更令人恼火的是,这种疏忽并没有导致验证错误,似乎只有AMD Windows驱动程序这样。不是英伟达,不是英特尔,甚至不是使用其专有或开源RADV驱动程序的Linux上的AMD。无论如何,输出现在使用相同的“gl_InvocationID”方法进行索引,我们没有看到驱动程序的更多投诉。
休息一下,这是一轮快速射击。
现在主动避免为着色器分配非托管字符串,并且实现更简洁。
缓冲区纹理存储现在将在 Vulkan 中重复使用其句柄时更新。可能修复虚幻引擎4游戏中的一个错误,即模型偶尔会定期交换回旧的动画帧。
现在可以正确处理大小为 0 的缓冲区范围。修复了《火焰纹章无双:风花雪月》中超出范围的崩溃。
TextureStorage 现在仅在 Vulkan 上的视图达到 0 时才被释放。尝试解决《超级马里奥奥德赛》中与 Vulkan 一起使用分辨率缩放时的内存泄漏问题。还可以减少其他游戏或经常为纹理设置别名的 GPU 中的内存使用量。
解决了 Vulkan CacheByRange 函数的各种问题。修复了导致电子棒球强力职业 Yakyuu 2022 中一些几何形状损坏或丢失的回归,以及可能还有其他一些在 Vulkan 下存在四边形问题的游戏。
纹理及其采样器现在都会被检查,以查看它们是否已释放,然后再在纹理绑定管理器上更新。这解决了使用 Vulkan 时崩溃团队赛车中的崩溃问题。
改进了 BRX 着色器指令的代码生成,这有助于编译器生成更高效、更简洁的输出。可以帮助一些驱动程序更有效地编译着色器,尽管 NVIDIA 和 AMD 没有看到差异。
间接缓冲屏障在 Vulkan 中修复,解决了 Monster Hunter Rise 中较新的 Nvidia 驱动程序上的一些 DeviceLoss 崩溃问题(不是 Sunbreak!
将VK_EXT_debug_report用法替换为VK_EXT_debug_utils以符合更现代的调试和错误标准。可能有助于更好地报告Vulkan错误!
完善 GPU 部分,让我们用每个人都能理解的语言说话。性能!
尼尔:机械纪元 在发布时得到了一个小的改进,通过传递SpanOrArray for Texture SetData来避免大量副本会阻碍帧速率,但在其他方面仍然存在一些相当大的性能缺陷需要克服。
房间里的大象实际上是马里奥+兔子王国之战呈现的;该系列的第一部,适用于那些不遵循特许经营权的人。通过使用位图而不是 MultiRegionHandle 来跟踪缓冲区修改后的标志,绑定 10MB 及以上区域的巨大缓冲区的游戏看到了巨大的改进,因为在纸面上查找速度提高了 64 倍。实际上比预期的更多的游戏表现出这种行为,因此它最终影响了一大堆新旧游戏,包括马里奥+兔子:希望之星和猎天使魔女 3!
这张表很快列出了一些我们立即看到大幅优化的游戏。然而,正如《僵尸军团4》所展示的那样,可能有很多小众游戏受到影响,但尚未被发现。
中央处理器:
10 月份的 CPU 部分肯定比上个月的连胜更简洁,但这里的一些变化同样有趣。
英特尔的Icelake(或更高版本)和AMD的新Zen 4 CPU的所有者将对这些架构的任何较新的指令集如何公平地支持Ryujinx可以利用它们感兴趣。其中最大和最著名的当然是AVX-512,但还有一些其他有趣的指令可供前沿架构利用,包括“伽罗瓦新场指令”;简称GFNI。虽然最初用于加密,但它们可以大大加速通用的位洗牌操作,这在模拟中非常有用。因此,对这些指令的初始支持已经实现到重新编译器中,并且在纸面上产生了大大改进的汇编。
本月我们只有几个 VCVTT 和 VCVTB 形式的 32 位实现。有了这些,Radiant Silvergun终于可以在游戏中前进了,出乎所有人的意料,它的渲染和玩法都很棒!太好了,如果你喜欢复古游戏,那就开始吧。
在指令集和它所影响的游戏中都转向更现代的东西,为......深呼吸...A32:Vcvta_RM、Vrinta_RM和Vrinta_V,A64:Fcvtas_Gp/S/V、Fcvtau_Gp/S/V 和 Frinta_S/V。撇开行话不谈,Super Smash Bros. Ultimate和Mario Strikers:Battle League都广泛使用了这些优化中包含的64位指令,Mario Party Superstars也可能受到影响。虽然我们的测试没有任何明显的变化,但新的快速路径可以消除低端CPU或特别困难的仿真点的瓶颈。
在继续之前清理一些较小的更改;在某些边缘条件下,Rejit 队列将不再清除,并且 IDisposable(用于告诉 .NET 可以释放某些内容的接口)已添加到 Unicorn CPU 测试模块中。
内核/服务:
本月,与精确模拟Horizon OS及其看似无穷无尽的服务和怪异的战斗仍在继续,并增加了一些值得注意的内容。
这项名副其实的“致命”服务在近五年后终于重见天日;考虑到在内部,它是第一服务,这是惊人的时间。虽然对于模拟器来说并不那么重要(我们已经可以通过记录器/调试器收集所需的所有崩溃信息),但它对于未来的实现至关重要,例如完整的错误小程序和来宾错误处理。
BCAT 和 FS 读取方法中的内存损坏导致《刀剑神域:Alicization Lycoris》崩溃已修复,游戏现在已超越标题屏幕并进入游戏。没有其他带有此标题的错误是显而易见的(除了令人作呕的低分辨率),但像往常一样,我们相信你们都会告诉我们!
其他一些更一般的更改包括:
NfcManager的状态现在可以正确处理,并解决了Hyrule Warriors:Definitive Edition《塞尔达无双:终极版》在扫描amiibo时遇到的崩溃。
SurfaceFlinger 现在可以在进程退出后排队。这可以防止停止仿真时可能发生的异常崩溃。
“GetSessionCacheMode”在SSL服务中实现。
绑定套接字现在在调用 RecvFrom() 之前被检查。这修复了在启用访客互联网时在立交桥中持续发生的崩溃。
“StopImageProcessorAsync”被存根,这可以防止任何游戏崩溃,例如Game Builder Garage,可能尝试使用JoyCon红外摄像头。
“SetRecordVolumeMuted”被存根,避免了过场动画中 猎天使魔女 3的崩溃。
文件系统服务是核心支柱,它允许游戏启动、保存其数据并正常地与 Switch 进行交互。“OpenDataStorageWithProgramIndex”是我们迄今为止一直缺少的一项服务,它的部分实现允许过山车大亨3和MLB The Show 22都启动到游戏中。此更改目前不支持访问当前程序索引之外的任何数据,但无论如何都没有基础结构;当我们最终找到使用该功能的游戏或自制软件时,就可以充分探索该服务。
我们不容忍玩RCT3,更不用说交换机端口了。出去,在PC上购买过山车大亨2,然后获得OpenRCT2补丁。以后谢谢我。
此标题仍然存在问题。 它在OpenGL上运行得非常慢,并且会在本地大小为1024或更小的任何GPU上崩溃(任何超过1000系列的Nvidia GPU)。如果您有 1000 或 900 系列 GPU,那么使用 Vulkan 将自己淘汰出局。
转向随机错误,这是任何软件开发人员的最爱,我们将从小处着手,然后以大的方式工作。旧的内核实现内存分配方法,用于随机尝试查找空区域并进行分配;如果失败,它将使用线性分配。问题是用于存储随机地址的变量在分配循环中被读取为临时存储,因此当随机分配失败时,值不是零。这可能意味着循环实际上可能能够有效地返回正在使用的地址,从而导致崩溃。实际上,随机分配很少失败,因此这不是一个大问题。先发制人地将这个扼杀在萌芽状态可以减少造成的崩溃;更常见于32位标题,例如“DoDonPachi Resurrection”,因为它们的地址空间较小。
让我们从小鱼苗转移到完全煮熟的金枪鱼配配沙拉和免费的开放式酒吧,好吗?本月终于见证了一些可能为Ryujinx记录以来存在的时间最长的随机图形错误,启动崩溃和游戏崩溃的死亡。
事实证明,NvMap ID 分配服务不是通过使用不断递增的 ID 计数器来编写任何级别的正态性的。如果你想知道“这不是超级愚蠢吗,因为它最终可能会溢出?”,你并不孤单;是什么让任天堂故意制造这个潜在的故障点,这是任何人的猜测。实际上情况会变得更糟,因为此分配服务每次都会递增 4 的值;计数器用完有效 ID 的时间实际上减少了 4 倍。但是,在实践中,这需要有人让他们的游戏运行数月/数年,以不断将此 ID 递增到溢出点。如果有人有几年的时间要杀,还有一个备用开关,那么我们可以建议一个实验吗?
无论哪种方式,作为模拟器,我们必须匹配硬件行为,即使我们认为这是愚蠢的......幸运的是有好处!让我们谈谈我之前提到的一些错误:
集合啦!动物森友会 不再在没有保存文件的情况下在启动时随机崩溃!
解决了《集合啦!动物森友会》中的各种随机图形故障。现在确实是开始一个新岛屿的最佳时机。
塞尔达传说:旷野之息将不再随机崩溃。关于这个,没有什么可说的,除了它有多烦人。你真的骑着马跑了一个多小时来测试这个完全消失了!
在精灵宝可梦剑/盾中进入/退出神奇宝贝中心时的随机崩溃也暂时修复。这个仍然很难测试,但是在门口来回走动了大约15分钟后,我们无法复制它,而且我们没有收到进一步的报告。所以只能到此为止。
杂项/图形用户界面:
按照惯例,我们将完成龙神星外轨道发生的一些变化。并非一切都与 GPU 和 CPU 等艰苦的低级书有关!
我们上个月表示,Avalonia 测试版本终于修复了自动更新程序,但这是将一些弹出窗口和窗口转换为覆盖对话框而不是专用窗口的更广泛努力的一部分。
对控制器小程序对话框进行了相同的处理,以减少在显示透明度时Windows和各种Linux发行版上的问题。
关于控制器对话框的主题:多年来,用户报告说,即使他们有一个看似有效的控制配置,它也会出现。这是当GUI信号告诉Horizon用户已“断开连接”控制器传递有关输入状态的错误数据时引起的,因此,模拟的Switch仍然认为有其他玩家连接。通过我们的HLE输入系统传递正确的过滤数据应该可以防止这种情况发生,并为我们所有人节省大量寻找幻像控制器的压力。
一些较小的闪电战变化:
阿瓦隆尼亚更新了意大利语和波兰语的翻译。
在 Avalonia 中使用键盘滚动时区的错误删除了所有选项,但第一个选项已解决。
“关于”窗口现在在阿瓦洛尼亚显示其可本地化的标题。
更新后,命令行参数将不再中断。
由于无效的标志组合,一些映射泄漏已在 Linux 上修复。
现在避免使用解析方法以减少数组分配。
Ryujinx最早的贡献者之一mageven以条件输入的形式帮助解决了本月我们的作弊系统遇到的一个更烦人的问题。翻译成英文,这意味着需要您按下按钮组合的作弊。通过纠正一个简单的逻辑错误,这些类型的作弊现在应该可以工作了!
随着快捷键的变化,还添加了对音量热键的支持。与它们之前的分辨率缩放热键一样,默认情况下,它们不绑定到任何按键。“那我该怎么用呢?”你可能想知道。我们的Avalonia UI可以通过菜单配置热键,但是您知道我们所有的热键始终都是可配置的吗?当然减去 GUI 部分。
如果您不介意弄脏自己的手并希望映射这些“未绑定”热键中的任何一个,而无需经历下载其他版本的麻烦,那么您可以简单地:
文件 -> 打开龙神文件夹。
在您选择的文本编辑器中打开 Config.json 文件。
找到“热键”部分并添加/编辑您的心内容!
结语:
这就是我们十月的全部内容,但我们偷偷怀疑十一月将是你应该关注的......
如果你们中的任何一个优秀的人有兴趣帮助开发 Switch 仿真的前沿,那么我们总是在我们的 Discord 或我们的 GitHub 页面上对新的贡献者开放!C#是一门语言,我们被告知这有点像C,Java和Microsoft都有婚前关系。如果这些听起来很熟悉、有趣或在您的 GitHub 页面上看起来很酷的东西,那么我们很乐意拥有您!
我们下次见!