switch模拟器吧 关注:11,518贴子:7,515
  • 7回复贴,共1

Yuzu进展报告2022年4月【edge浏览器机翻】

只看楼主收藏回复

你好,Yuz-ers,四月份真是太棒了!我们将讨论 CPU 和内核性能改进、多个 GPU 仿真更改、UI 调整等!
再次拯救桃子公主
byte[] 继续他的工作,以更好地支持官方的GameCube / Wii和Nintendo 64模拟器(分别代号和代号),byte[]引入了几个新的PR,以进一步提高其中包含的标题的兼容性。HagiHovercraftSuper Mario 3D All-Stars
byte[] 首先在 中实现了对 GLSL 的支持,因为不是每个人都能运行 Vulkan。这是通过在 OpenGL 中添加对间接寻址的支持来实现的。Super Mario Sunshine
此更改目前不包括对 GLASM 的支持,因为我们的开发人员不太喜欢处理 NVIDIA 程序集着色器代码。想象一下,被要求解决汽车发动机的问题,而这项工作的唯一给定工具是一块石头和一根棍子。
然而,这只是成功的一半。适当的 OpenGL 支持并需要解决我们在老化的 API 中遇到的一个旧限制:破碎的 Z 尺度反转。Super Mario SunshineSuper Mario Galaxy
大多数Switch游戏使用OpenGL,流行的免费图形API,或NVN,专有的NVIDIA API专属于控制台。可以说,NVN在运营方式上比Vulkan更接近OpenGL。
Switch上的Tegra X1 GPU足够灵活,允许游戏开发人员自行决定更改坐标系。虽然大多数游戏的行为将更接近OpenGL的预期,但Z轴朝向远离相机,而模拟游戏(使用Vulkan渲染并且Switch上只有少数游戏)将坐标反转,Z轴朝向相机,这是Vulkan游戏期望的原生渲染方式。HagiHovercraft

字节[]的 Z 轴图
如果你想玩柚子的Vulkan后端,这不是问题,因为行为与游戏的预期相匹配。但是,如果您尝试使用OpenGL进行游戏,柚子将无法正确解释由于Z比例反转而翻转了面,因此仅渲染了对象的背面。Super Mario GalaxySuper Mario Sunshine
解决方案非常简单,当Z轴反转时翻转前脸。

并置 JS
欢迎来到影子王国度假村(超级马里奥阳光)
接下来,您可能已经注意到底部有一个黑条。这是因为Wii和GC游戏本身使用的宽高比与我们习惯的通常的16:9不同。相反,游戏以 5:3 的宽高比渲染。 通知系统将屏幕显式裁剪为其原始分辨率 1920x1012,但不会,因此柚子以前没有尝试裁剪游戏,导致渲染底部出现明显的黑条。Super Mario SunshineSuper Mario GalaxySuper Mario Sunshine

裁剪过程图
虽然可以说,黑条中的游戏比例看起来更正确,但这不是任天堂想要玩游戏的方式。为了准确起见,byte[]解释了游戏的隐式裁剪请求,该请求拉伸图像以匹配Switch的本机1920x1080分辨率,无论是对于Vulkan还是OpenGL。Super Mario Sunshine


并置 JS
不要调整你的设置(超级马里奥阳光)
在上一份报告中,我们提到了S8D24< >ABGR8纹理转换如何允许星位正确运行。好吧,现在轮到OpenGL加入乐趣了。Super Mario Galaxy

S8D24 至 ABGR8 纹理转换图
我们上个月提到过如何在柚子上运行的特殊要求。大多数游戏都会编译其代码(AOT),也就是说,在交付给您之前。操作系统的工作是执行预编译的二进制代码,然后你就开始玩游戏。Super Mario 64ahead-of-time
Super Mario 64另一方面,运行(JIT),以便更轻松地开发模拟器,并允许在不同的游戏中重用相同的二进制文件。模拟器加载超级马里奥64的本机任天堂64 ROM,然后其JIT编译器获取ROM并将原始MIPS(任天堂64 CPU的架构)指令转换为AArch64(Switch的CPU架构)指令。只有这样,操作系统才会执行游戏代码。just-in-timeHovercraftHovercraftHovercraft

提前与实时编译图
这类似于柚子在 Dynarmic 的帮助下将 AArch64 指令转换为 AMD64 指令的方式。
JIT服务,这是在零售游戏上使用JIT编译所必需的,是柚子没有实现的功能,仅仅是因为没有其他游戏需要它。此外,以直接方式实现它存在一些障碍,因为它需要调用游戏提供的自定义代码,这是以前任何服务实现都不需要的。因此,除了一些初步的存根之外,byte[]实现了HLE JIT服务,以允许模拟器运行和引导。HovercraftSuper Mario 64
在单独的 PR 中,byte[] 添加了 JIT 服务接口如何运行的文档。如果需要,这应该有助于其他开源项目。
当然,这还不足以让游戏变得可玩,因为还有渲染问题需要解决。Super Mario 64
这从来都不是那么简单...但让我们试着简单地解释一下。Nintendo Switch游戏将自己的个人GPU驱动程序与每个游戏捆绑在一起。这样做是为了提高兼容性,如果驱动程序版本出现问题,则无需更新世界上的每个控制台。
由于未知原因,模拟器或捆绑的 GPU 驱动程序报告的顶点缓冲区太大,尤其是与游戏实际使用的内容相比。无论是包含的模拟器中的问题还是只是驱动程序错误,我们都无法确定,但我们确实需要解决此问题。Hovercraft

错误的顶点缓冲区大小图
因此,byte[] 不是使用疯狂的报告缓冲区大小,而是说不!并改用后备内存大小。

这是一个他!(超级马里奥64)
Vulkan的性能目前还不是一流,但你终于可以使用这两个API享受所有3款游戏。Super Mario 3D All-Stars
最后,Morph实施了一个修复程序,以保持Web小程序在前台打开,因为游戏需要它,否则它们会在游戏过程中崩溃几分钟。Super Mario 3D All-Stars
常规图形修复
继上个月的NVFlinger重写之后,bunnei继续跟踪问题和错误报告。他修复了报告的问题,并进一步清理了代码以提高代码质量。请在此处参阅 NVFlinger 重写的代码更改。
Xenoblade Chronicles 2并且会遇到有趣的问题,这些问题是由作为 的一部分引入的新内容引起的。我们在一月份就谈到了这些变化。Hyrule Warriors: Age of CalamityGPU Garbage CollectorProject Y.F.C.
正如您在下面的顶栏上看到的,在OpenGL(顶栏)中使用过多的VRAM。底部栏显示实施修复后的结果。Xenoblade Chronicles 2

不是测试整个VRAM的最佳方式(Xenoblade Chronicles 2)
Age of Calamity将以随机间隔显示有趣的图形:

并置 JS
這就是為什麼你不會把焦糖彈炸得太用力(Hyrule Warriors: Age of Calamity)
Blinkhawk修复了回归,两款游戏都恢复了业务。
通常,在仿真中,当您修复一个问题时,会弹出另一个问题。实现的裁剪修复字节[]具有破坏Vulkan中自制应用程序的渲染的可爱意外副作用。值得庆幸的是,Morph在解决这种回归的代码中添加了魔术线。Super Mario 3D All-Stars
天际线框架:第 3 部分
在使Skyline模组框架正常工作方面取得了重要进展。如果您错过了我们之前关于该主题的进度报告,这里有两个链接。
tech-ticks一直忙于最后的润色。最新更改包括:
更好的支持,从而更容易地分发mod和自我更新功能。LayeredExeFs
支持套接字选项,该选项允许 Skyline TCP 记录器运行。SO_KEEPALIVE
实现 DNS 地址解析,这是使用 HTTPS 请求的插件所必需的。
我们必须提到,虽然Skyline内核支持基本完成,但yuzu代码库中的错误阻止了模组框架的正常运行。例如,由于潜在的仿真问题,ARCropolis在完成之前将无法工作,并且前面提到的一些更改需要我们的部分进行一些微调才能正常运行。Project Gaia
还有更多的工作要做,但我们离我们更近了。我们可以看到终点线!
用户界面改进
Merry,的核心开发者,对附加组件游戏属性窗口做了一些更改,改善了列宽。Dynarmic


低分辨率用户会喜欢这个
热键配置窗口也得到了一些喜爱,更改了最小列宽。

它对 GNOME 用户来说也很棒
这两个更改对于臃肿或大小未优化的桌面环境(如 GNOME Shell)都非常有益。
Tachi107 修复了我们日志中一些令人尴尬的拼写错误,并更新了“关于柚子”窗口以正确提及我们的新许可证。之所以存在,是因为我们希望为更新的修订敞开大门。GPLv3.0++

柚子“关于”框的屏幕截图
Taichi并没有止步于此,而是对Flatpak构建进行了一些清理并进行了改进,包括使用正确的应用程序ID,修复一些拼写错误,并添加一个启动参数以使Yuzu默认在Linux上使用专用GPU而不是集成GPU。
Docteh在改进Yuzu的UI方面也有很大的帮助。
通过一些手动思考,他们设法绕过了一些Qt限制,以便在我们的黑暗主题中显示更具可读性的超链接。

人们似乎已经忘记了超链接的用途,只需单击它们即可!
多亏了GillianMC在我们的Discord服务器中的报告,Docteh发现Qt API中的一些怪癖导致列出的游戏的兼容性状态无法翻译。原因在于QObject,您可以在拉取请求的描述中找到具体的详细信息。现在,状态以相应的语言正确报告。

西班牙语示例
同样,方向键方向也没有正确翻译。同样的嫌疑人,再次.有人,请发出逮捕令,要求拘留卡门·桑地亚戈。

法语示例
内核和 CPU 仿真更改
让我们从三月份发生的两个变化开始。
我们的常驻 bunnei 兔子继续重写 yuzu 的内核内存管理,使其准确到最新的系统更新。这一次,他处理并改进了内核代码内存的映射和取消映射方式。
在 Switch 的上下文中,代码内存支持允许游戏和应用动态加载和卸载其代码的较小部分。由于这些更改,在加载/卸载NRO时不再导致内存访问问题,从而使游戏在长时间游戏会话中保持稳定。Super Smash Bros. Ultimate
bunnei 还将来宾(Switch) 内核对象的平板堆从主机堆内存迁移到模拟来宾内存。通过这一变化,柚子的内存布局现在与控制台更加匹配。
板块表示连续的内存片段。堆是用于动态和随机分配的任何内存的通用术语。
板堆是用于存储来宾内核对象的空间。通过将这些从主机 (PC) 堆内存 (RAM) 移动到模拟来宾(交换机)内存,我们可以确保内核对象永远不会超出系统限制并导致主机 (PC) 上的内存泄漏。
线程本地存储 (TLS) 是给定多线程进程中每个线程为线程特定数据分配存储的机制,也进行了重写,使其准确符合最新的 HorizonOS 行为。
通过这些更改,我们现在已经完全修复了影响一些游戏的内核内存对象泄漏,但由于以前的实现允许无限制的分配,因此在很大程度上没有被注意到。
回到四月份的变化列表,bunnei还重新实现了柚子如何处理HLE服务接口的线程分配。
服务是在后台运行的系统进程,用于等待传入请求。Switch的HorizonOS具有执行各种任务的各种服务,例如音频,蓝牙等。
以前,我们过去为每个 HLE 服务接口分配一个主机线程,因为 -
某些服务例程可能需要等待很长时间才能完成,例如网络或文件系统访问,以及
我们不支持从主机线程重新调度来宾线程。
被阻止的线程必须等到阻止它的操作(如 I/O 或只是休眠一段时间)完成。
这种方法的问题在于,由于调度服务线程的是主机(Windows或Linux),因此柚子可能会产生奇怪的行为,特别是在具有硬件限制的系统上,因为每个服务生成一个线程以及我们模拟的服务实现数量庞大。
通过重写,柚子现在有一个“默认服务线程”,用于99%的非阻塞服务方法。对于时间敏感的服务以及需要阻塞的服务,我们仍然允许创建线程(例如音频,BSD,文件系统,nvdrv)
这将服务线程数从两位数减少到个位数,从而提高了稳定性和一致性 - 特别是在内核较少的系统上。在大多数游戏中,具有 4 线程 CPU(2 个内核 + HT/SMT 或 4 个内核)的用户应该会看到性能和稳定性的提高。
另一场争取正确关机行为的战斗已经打赢。柚子目前不模拟HorizonOS内核的多进程功能,因为它不需要模拟任何游戏。但是,游戏使用的多进程 API 仍需要以预期的方式进行管理。所有 HorizonOS 服务都有一个端口(用于客户端和服务器),用作游戏进程和服务进程之间的通信通道。为它们各自的通信接口打开一个会话,并且它们由各自的内核对象管理。当游戏关闭客户端端口时,服务将关闭服务器端口,并且一切都将关闭。
我们之前实现的问题在于 yuzu 没有正确跟踪每个服务的所有 和 对象。正因为如此,这些服务没有正确关闭,这反过来又导致了进一步的问题。KServerPortKServerSession
这最初工作正常,但是当我们将来宾内核对象迁移到模拟来宾内存时,正如我们前面提到的,它被回归了。bunnei发现了这个问题,并迅速重新实现了我们如何跟踪这些内核对象。
通过有一个可以注册/注销开放端口和会话的地方,我们现在可以更好地跟踪这些内核对象。通过确保它们在我们拆除所有服务和内核时关闭,我们得到了更好的仿真关闭行为。
输入更改和常规错误修复
如果用户在使用鼠标平移时为其鼠标设置了非常高的 DPI 值,则光标可能能够逃离呈现窗口。IamSanjid实施了所需的修复,包括更好的居中时间来解决这个问题。谢谢!
german77为我们准备了几个修复程序。
让我们从一个有趣的开始。柚子的屏幕截图捕获功能允许以缩放器当前设置的分辨率轻松保存时刻。用于屏幕截图捕获的热键可能会被垃圾邮件,如果发送了多个屏幕截图请求,则会导致Yuzu崩溃。如果将渲染分辨率设置为较高值,则可能会恶化。为了解决这个问题,柚子现在在处理捕获时忽略新请求,并在日志中打印警告。
在仿真方面总是有改进的余地,因为没有什么是真正完整的。这一次,german77 专注于在输入仿真中发现的不准确之处。
IsSixAxisSensorFusionEnabled是通过对所有Sixaxis功能进行逆向工程来实现的,并通过与Switch上完成的单元测试自制结果进行比较来验证。这应该有可能提高运动精度。
负责处理输入命令的 HID 服务,除其他外,用于通过复制其分配的共享内存并报告更改来操作。这会导致输入过程中的不匹配或延迟,并可能导致游戏读取完全不正确的数据。
显然这并不理想,因此german77摆脱了内存重复,并使用神奇的*指针直接访问共享内存。这可以修复影响无数游戏的错误,最大的例子是游戏很难检测到控制器。Pokémon: Let’s Go
现在,热键按下将使用队列触发。这样做的好处是不必等待 UI 响应,从而减少了延迟。
模拟摇杆得到了一些喜爱,它们的映射中有几个重要的变化:
默认的最大范围现在设置为 95%,以确保游戏可以使用整个范围。例如,此更改可避免在游戏中当摇杆处于特定角度时角色行走,例如 .最小范围从50%降低到25%,提供了更高的精度,特别是对于试图用匹配的轮子玩赛车游戏的人来说。自动中心校正现在更强大,避免漂移,而不必依赖更强的死区值。如果手动映射按钮,现在可以手动删除单个轴值。Pokémon Legends: Arceus
以前,只有玩家 1 可以通过按下按钮自动重新连接控制器。其他玩家只能在使用键盘时这样做。german77的拉取请求旨在解决这个问题,允许其余7个玩家中的任何一个重新连接他们的控制器 。层次结构中较高者不再具有特权。
在撰写本文时,此更改正在测试中,因为它可能会导致回归。请务必使用状态悬停卡在几天后回来查看!
未来项目
Project Y.F.C.距离发布其计划中的第一部分不远了。
Project Gaia继续缓慢但肯定地前进,现在导致一些以前损坏的游戏终于第一次启动。

Minecraft和Mortal Kombat 11现在正在启动!
这就是所有的人!我们仍在追赶一些内核和CPU优化更改,因此下次可以期待更广泛的部分。谢谢你的公司,下个月见!


IP属地:湖北1楼2022-05-15 20:44回复
    6批啊


    IP属地:重庆来自Android客户端2楼2022-05-16 08:23
    收起回复
      想请问一下大佬们,这个模拟器配置要求高吗,amd3500核显可以玩吗,谢谢


      IP属地:广东来自Android客户端3楼2022-05-16 12:18
      收起回复