Switch模拟器YUZU进度报告2022-2月

Switch模拟器YUZU进度报告2022-2月

Switch模拟器YUZU进度报告2022-2月

本月,我们很自豪地展示了大量内核更改,这些更改最终修复了长期存在的错误、大规模的性能改进、UI 和输入更改等等!

图形修复,以及如何提高性能

由于 Linux 上的 RADV 驱动程序存在问题,在 AMD 的 RDNA2 显卡上运行时,使用 Vulkan API 会使 yuzu 崩溃。 最值得注意的是,这个问题影响了 Steam 平台,正如尝试在其设备上测试yuzu的用户所报告的那样。

确定崩溃问题是因为 VK_EXT_vertex_input_dynamic_state,一个 Vulkan 扩展,用于最小化着色器编译过程中所需的管道对象数量。 这些结构非常庞大,有时,游戏可能只想更改其中的一小部分内容,例如顶点输入状态。 使用此扩展,API 可以通过简单的函数调用动态更改结构中的这些成员,无需创建全新的对象,从而减少操作使用的资源量。

虽然这个错误正在解决, epicboy 推送了一个 PR 将扩展列入黑名单 在运行 RADV 驱动程序的 RDNA2 设备上,因此 yuzu 不会彻底崩溃。

但是还有一个驱动给我们带来了问题。

Linux 上 Mesa 的 ANV 驱动程序不支持纹理格式 VK_FORMAT_B5G6R5_UNORM_PACK16,这导致yuzu在运行使用它的游戏时崩溃,例如 酷霸王之怒. 为了绕过这个问题, voidanix 实现了一个模拟的解决方案 BGR565纹理 混合 RGB565,以此解决。

类似地, Morph 实现了 缺失的顶点格式 , 如游戏使用口袋力量棒球R asLody 还实现了缺少的 帧缓冲区格式 , 这次用于 妖怪手表4.

妖怪手表4

该开发人员的另一个修复是 添加缺少的信号量操作 为了 MaxwellDMA, 被使用 塞尔达传说:旷野之息 和 宝可梦传说:阿尔宙斯

内核变化,以及如何驯服 Smash

继续在内核上进行的工作, 改进 bunnei 内核内存管理器 使其与最新的系统更新更兼容。

伴随这些变化而来的一个巧妙设置是yuzu能够支持不同的内存布局,例如在开发人员单元中使用的“6 GB 扩展内存布局”(MOD社区要求的一项功能)。

一些模组可以使用比 Switch 提供的更多的 RAM,主要是高分辨率纹理替换。 为了解决这个问题,bunnei 添加了一个开关来启用扩展的 6GB 内存布局 真正的开发人员工具包将可用。 那些额外的 2GB 将允许重型模块正常工作。 您可以在中找到设置 模拟 > 设置… > 通用 > 扩展的内存布局 (6GB DRAM).

扩展的内存布局 (6GB DRAM)

不要指望它会对模拟性能产生影响,游戏不会关心模拟控制台是否超过 4GB,它们只关心是否有足够的空闲内存用于操作。

bunnei 还通过 将锁迁移到使用模拟客户锁来 以及 改进物理内存的映射和解映射 .

与往常一样,这项工作背后的最大动力是提高我们实现的准确性,同时还修复了过去几年可能隐藏在那里的任何错误。

Dynarmic 是我们的 ARM JIT 重新编译器,本月也进行了许多新的优化和错误修复。

Blinkhawk 更正了 Dynarmic 中内存存储/加载操作序列化的屏蔽逻辑 x64代码发射器,并随后 更新了子模块 将这些更改带入 yuzu 的代码库。 这修复了影响的卡死 宝可梦传说:阿尔宙斯.

在调查稳定性问题时 任天堂明星大乱斗, bunnei 和 Merry 发现问题是由于在 SpaceRemaining函数,用于计算缓存块中 JITed 代码可用的剩余空间。

Dynarmic 将这些代码块分成两个区域,命名为 near和 far. 该方案旨在通过将“热”代码保留在 near随时可供执行,而“冷”代码被推入 far地区。 由于计算剩余空间的方式存在错误, near区域会溢出到 far区域,用“热”代码覆盖“冷”代码。 然后,CPU 将尝试运行之前存在的“冷”代码,并在尝试时严重崩溃。

最终,在几场比赛后崩溃 SSBU,因为那是耗尽空间并溢出缓存所花费的时间。 通过 纠正比较 用于计算这个值,开发人员终于能够缓解围绕这个游戏的最长期存在的问题之一。

任天堂明星大乱斗

Merry 也一直忙于 实现对新 CPU 优化的支持 ,这使得通过使用 ARM 独占访问指令的仿真 cmpxchg(比较和交换)指令 x64建筑学。

ARM 指令集包含可以排除对内存地址的访问的指令,因此只有一些指令——在这种情况下是一对:一个用于读取值,另一个用于写入它们——可以在多核环境中安全运行,而不会受到干扰来自其它线程的指令,这些线程可能也想访问内存中的相同值。

它通过在读取内存中的值后将地址标记为“用于独占访问”来实现这一点,因此“独占”存储指令只有在使用此标志标记时才会写入该地址。 另一方面,“正常”存储指令旨在始终在写入后清除该标志。 因此,独占指令可以利用该信息知道内存地址中的值何时被非独占指令改变,并重新启动整个作业,直到操作成功。

ARM 能够通过称为 Exclusive Monitor. 但是在 x64考虑到多线程环境中测试和调试的复杂性,架构可能非常困难。 因此,它们之前的实现相当保守且效率低下,以确保并发性。

但是,可以通过使用 cmpxchg,它将内存地址中的值与引用进行比较,如果匹配,则将新值写入其中。 因此,可以将内存地址中的值用作引用,然后当且仅当存储的值与引用匹配时,将另一个值写入同一地址。 依靠该指令的语义,可以将独占内存读取和写入内联到 JITed 代码中并加快它们的执行速度。

广泛使用这些专有说明的游戏,例如 宝可梦传说:阿尔宙斯,应该会看到性能略有提高。

Nvidia2080

AMD RX570

一般错误修正和 UI 更改

German77 在 UI 上做了一些工作来增加趣味性。

他改进了 SDL 电池电量检测 ,重新调整了控制设置中的一些 UI 元素, 并为我们提供了新的、更漂亮的电池符号!

旧的电量图标

新的电量图标

German77 还 添加了新的热键 应大众要求。 加入战斗的是停靠/取消停靠(用于控制器)、窗口自适应过滤器、GPU 精度(在正常和高之间切换)和静音/取消静音。

更加便捷的热键设置

另一个高度要求的修复是 改进 Amiibo 支持 . 我们的旧代码不是很准确,导致一些游戏失败。 虽然还有改进的余地,但这个新实现要准确得多,现在应该可以在大多数游戏中稳定使用 Amiibo 转储。

我们还想宣布,对实体 Amiibos 的 NFC 扫描的原生支持正在开发中! 随着进展,我们将分享更多信息。

Morph 修复了最近出现的一个奇怪问题。 在某些情况下,重新打开柚子后,窗口会是一个最大化的无边框状态。 事实证明,由于某种原因,配置文件在关闭 yuzu 后没有重置无框标志。 强制移除标志 在每次启动时解决问题。

Maide 为模组制作者和任何对游戏内部结构感兴趣的人添加了一个非常有用的功能。 此前,yuzu倾销基地 exeFS,其中仅包括来自基础游戏的数据,缺少更新或 DLC 中的任何新增内容。 相反,通过 转储补丁 exeFS,就像 EliEron 过去建议的那样 ,用户将有权访问更新文件!

toastUnlimited 发现 喷射战士 2中的库存时崩溃 LAN 大厅 。 存根 IsUsbFullKeyControllerEnabled功能 这就是我们所需要的。 肆无忌惮地打你的朋友!

喷射战士2

对于复古游戏迷来说,toastUnlimited 和 German77 都修复了 Nintendo Switch Online 服务中包含的 SNES 和 NES 模拟器(是的,您也可以转储和离线播放这些模拟器)。 存根 mnpp:app解决崩溃,并 更新流程修订 我们的音频仿真允许官方仿真器在 yuzu 上正常工作。

输入改进

正如每个月都会发生的那样,german77 在这个部分中占主导地位。

作为测试当前震动设置强度的一种方式,您现在可以 强制控制器振动 在配置振动窗口打开时按任意按钮都可以体会到震动强度。

此窗口中按键可以体会震动强度了

游戏手柄有漂移,不仅是 Joy-Cons 所熟知的飘逸问题,而且每个游戏手柄都有一定程度的漂移。 为了隐藏这一点,控制台会自动居中其摇杆。

限制之一 SDL 是它只能读取 Nintendo 官方控制器上的工厂校准,跳过任何可能可用的用户校准配置文件。 我们通过在启动时自动居中来解决这个问题,但是摇杆仍然可以去任何它们喜欢的地方,所以 German77 添加了一个选项来手动居中每个轴 作为附加选项。 只需在我们的控制器设置中右键单击摇杆的任何方向。

只需要右键单机

添加了支持以 允许映射 Enter 键 ,之前只是重新启动了映射过程。

toastUnlimited 添加了对体感输入的支持 至 yuzu-cmd,我们的可执行文件的终端版本。 终端用户现在也可以享受一些舞力全开。

改进模拟以不使用模拟

xerpi 实现了 32 位版本 的 OutputDebugString, CreateCodeMemory, 和 ControlCodeMemory的管理程序调入。 谢谢!

xerpi 的帮助有一个更大的目标,而不仅仅是帮助一些鲜为人知的 Switch 模拟器。 他们正在开发 vita2hos ,一个可以运行的翻译层 PlayStation VitaNintendo Switch 原生应用和游戏! 前面的路很长,因为大多数 Switch 调试工具都是 64 位的,而 Vita 是一个 32 位的控制台,所以为了让项目继续进行多次重写和更改。

yuzu 缺少一些功能来提供完整的 32 位执行模式支持,因此打开了 PR 以帮助改进该领域,因为 xerpi 正在使用 Switch 模拟器来协助和简化开发。 我们迫不及待地想看看这个项目如何发展!

Vulkan 是未来

随着工作 Project Y.F.C以及其它计划的更改,我们正在慢慢地致力于默认启用 Vulkan,并保持 OpenGL 的长期支持。 本节不会列出 yuzu 中的更改,但用户可以调整设置以提高他们在 yuzu 和其它模拟器中的 Vulkan 性能。

Vulkan 性能的主要问题之一是当前 GPU 将采取积极的频率管理来节省电力。 由于即使是现代低端 GPU,Nintendo Switch 游戏产生的实际 3D 负载也会非常低,因此时钟速度往往会保持在其频率的省电方面。

一个显著提高性能的简单方法是强制 GPU 以更高的时钟频率来运行模拟器。 GPU 可以达到的最高值在这里通常是无关紧要的,因为大多数 GPU 将比 Switch 的 Tegra X1 更快,但更高的时钟速度将使帧速率保持在较高水平并将卡顿降至最低。

NVIDIA 用户在 NVIDIA 控制面板, Prefer maximum performance. 您可以在 3D Settings > Manage 3D settings > Program Settings tab点击 Add并从可用选项中选择 yuzu,然后向下滚动到 电源管理 并将其设置为 最高性能优先 .

nvidia控制面板

在 AMD 方面,这需要一些手动工作,并且可能仅与基于 RDNA 的 GPU 兼容。 只有相对较新的 Radeon 驱动程序添加了调整所包含的最小和最大 GPU 频率的选项 Radeon WattMan.。

需要做的是,以与 NVIDIA 类似的方式,将 yuzu 作为配置文件添加到 Gaming选项卡,点击 Tune Game Performance并将调谐控制设置为 Custom. 启用 GPU 调整,您将能够调整 Min. Frequency (%).

虽然这可以在 Radeon Software 上全局设置,但我们建议使用每个应用程序的配置文件

除了 GPU,提高内存时钟速度总是有助于仿真,尤其是在高分辨率下 AMD

以一个RX 6500 XT 为例,我们可以看到 宝可梦传说:阿尔宙斯 将其帧速率提高到 73% 时 ,轻松超过 RX 570,只需将最低时钟速度从 500MHz 提高到 2875MHz(如下图所示,提高了 475%)。

太省电也并不是什么好事

这里的性能提升可能是巨大的,但在某个点之后,性能将不再会有太大的提升,所以这里可以自己一点点拉高来调节测试。

未来项目

Project Y.F.C.随着发展,更多以前被破坏的游戏开始变得可玩,它继续成熟。 Blinkhawk 告诉我们,他目前正在将重点转移到性能上。 我们迫不及待地想告诉你更多!

火焰纹章战士

German77 一直在玩 实现一个 Mii 编辑器小程序 . 目前的支持非常简单,但任何有兴趣的人都可以免费构建拉取请求并尝试它。

Mii编辑器小程序

这就是本月所有的内容! 感谢您抽出宝贵时间阅读,我们希望下个月再见。 感谢点赞、关注、评论、转发 。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月20日
下一篇 2022年6月20日

相关推荐

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息