我们都在努力的活着 发表于 2023-11-18 22:00:22

Switch模拟器YUZU进度报告2023-10月




Switch模拟器YUZU进度报告2023-10月你好yuz-ers!在过去的一个月里,我们得到了大量的GPU修复,对新小程序的支持,在Android版本中投入了大量工作,一些关于未来的有趣消息,等等。让我们开始吧!Wowie Zowie!一款新的马里奥游戏!这是一个很好的选择。 Super Mario Bros. Wonder 超级马里奥:惊奇 加入了横向卷轴马里奥游戏的争夺战,并以其新的精彩关卡完善了该类型的游戏玩法。
由于内核中不正确的已用内存报告,游戏在发布时无法启动。值得庆幸的是,byte[] 很快就找到了罪魁祸首。这是个单独的更改!


然而,这还不足以让游戏处于可玩状态。根据您在游戏中所处的位置, Super Mario Bros. Wonder 会在内部切换双缓冲和三缓冲 VSync 演示模式。这会导致它可用于演示的图像数量频繁更改。由于对 NVNFlinger 工作原理的误解,Yuzu 还没有为此做好准备。在 Android 上,SurfaceFlinger(OG Flinger)可以释放超出程序分配的最大计数的缓冲区,但 nvnflinger(Switch 的分支)永远不应该释放任何缓冲区,除非程序请求。Maide 做了一些演示代码更改来支持这种行为,玩家现在可以抓住那些有趣的神奇花朵了!

我敢打赌,你没想到会在这里看到本月唯一的输入变化——但我们在这里。 Super Mario Bros. Wonder 喜欢振动,在任天堂控制器(Joy-Cons、Pro 控制器)上使用 HD Rumble 时,旧实现已经饱和。这是因为等待控制器回复需要时间,超出了游戏的耐心,导致明显且令人烦恼的振动卡顿。没错,ASTC,你不是唯一一个导致卡顿的人。通过异步进行振动调用,振动虽然没有完全解决,但现在更加愉快。GPU 更改未定义的行为:说“这里是龙”的正式方式。在代码中避免使用龙(我的意思是,未定义的行为)是一种很好的做法,尤其是在处理像 Vulkan 这样的复杂图形 API 时。还记得我们在 8 月份对 depth stencils 的解释吗?您可能希望重读它,因为它为我们接下来要讨论的内容提供了有用的上下文。当游戏使用深度缓冲区时,它通常会绘制到繁忙的 3D 场景中,同时利用称为深度测试的硬件加速过程。在深度测试期间,GPU 硬件会确定一个像素是可见还是被另一个像素隐藏(遮挡)。这是由它们的深度值决定的。深度缓冲区跟踪每个存储像素与相机的距离。如果渲染的像素比场景中已经绘制的像素更远,则该像素将被丢弃;如果它更接近,则保留它并更新颜色缓冲区。通常,深度缓冲区也会更新并写入其中,在这种情况下,用于存储新的、更近的对象的深度。游戏可以单独使用深度测试,并关闭对特定元素的深度缓冲区的实际写入,许多游戏在渲染部分透明对象时都会这样做。但是,像 Vulkan 这样的图形 API 不允许相反的情况——硬件设计需要启用深度测试才能更新深度缓冲区。Yuzu 的深度/模板缓冲区的屏蔽清晰路径有一个着色器,用于更新深度缓冲区,从而启用深度写入,但忘记启用深度测试。大多数时候,这是巧合,因为游戏正在启用深度测试,而柚子没有清除这种状态。然而,并非所有游戏都启用了它们,如果没有深度测试,像 Super Mario 64 这样的游戏,是 Super Mario 3D All-Stars 的一部分,无法正确渲染某个角色的脸。



多亏了 Maide 所做的工作,马里奥·马里奥先生现在可以正确渲染。Maide并没有就此止步,她继续猎龙,以寻求另一个拉取请求。使用标准 Vulkan 内存分配器(简称 VMA)的一个优点是它可以帮助清理代码。如果某处出现问题,VMA 将提出断言。在本例中,我们无意中将我们打算在 VRAM 中专门使用的设备本地缓冲区标记为 CPU 映射。VMA 在这里非常清楚:设备本地缓冲区不应按映射进行分配,因为它们完全不用于 CPU 访问。让它快乐,抚慰了另一条龙。多亏了用户的报告,Blinkhawk 设法弄清楚了为什么新的查询缓存在许多游戏中会泄漏内存,包括 The Legend of Zelda: Tears of the Kingdom 塞尔达传说 王国之泪 。经过一些轻微的调整后,RAM消耗就被放在了它的位置上。Squall-Leonhart 发起了一场运动,以解决 yuzu 格式支持中的漏洞,他一直在努力实现一些更晦涩的格式转换,例如 D32_SFLOAT 。对于 Vulkan 上的这种特定深度格式,现在可以在游戏需要此行为时将其转换为 ABGR8_UNORM 。结合在内部格式表中添加对 Z32 , FLOAT , UINT , UINT , UINT , LINEAR 变体的支持,这项工作解决了 Disney Speedstorm 迪士尼无限飞车 和 Titan Glory 泰坦荣耀 等游戏中的渲染问题。

某些游戏还会以 D32 深度格式制作图像的别名。由于此处也存在类似的格式转换限制,因此现在可以将 ARGB8_SRGB 和 BGRA8_UNORM / BGRA8_SRGB 转换为 D32_SFLOAT 以提供适当的兼容性。


继续这一连胜,Maide 实现了 X8_D24 深度格式,允许 A Sound Plan 开始渲染。但是,要使这款游戏能够正常玩,还需要更多的工作。鲁棒性是 Vulkan 提供的一项功能,它允许开发人员以明确定义的方式处理无效的内存访问。这有助于防止应用程序崩溃或召唤龙,当代码的某些部分尝试越界访问内存时,调用未定义的行为。出于某种原因,Maxwell 和 Pascal NVIDIA GPU 在统一缓冲区上破坏了鲁棒性支持,或者 yuzu 的代码库在某处做出了错误的假设(很可能是后者)。因此,这两代 NVIDIA GPU(GTX 750/GTX 900/GTX 1000 系列)在 Crash Team Racing Nitro-Fueled 上出现过大的图形问题,这是由于游戏在着色器中越界访问内存。 在受影响的 GPU 架构上手动将越界缓冲区读取限制为 0 可以解决这些问题。我们现在也在调查导致这个问题的原因。梅德又要扮演侦探了,亲爱的华生。

Maide 还修复了分辨率缩放器的一个隐藏问题。图像被标记为重新缩放,即使分辨率缩放器未使用(以 1 倍运行)。这会导致轻微的额外开销,并且很少出现一些断言失败。虽然没有已知的游戏错误是由此引起的,但最好有一次先发制人的修复,而不仅仅是被动的修复。与此同时,Maide 还删除了所有图像附件的图像别名位,以允许驱动程序使用更多的内存优化。此拉取请求还包括一些其他小修复。通过实现顶点数组的第一个和后续的绘制命令, Super Meat Boy 超级肉食男孩最终可以正确渲染!不再有黑屏!
现在,一个是 Linux 帮派。 v1993 在 Linux 上测试并重新启用了 CUDA 视频解码,为 NVIDIA 用户提供了更好的视频解码性能(当然,运行专有驱动程序)。我们之前默认禁用了 CUDA,因为它可能会在同时运行专用 NVIDIA GPU 和专用 AMD GPU 的系统上失败(iGPU 很好),这是一种相当罕见的配置,只有少数人(例如您的作者)真正使用过。对于在您的系统上运行混合硬件供应商的少数用户,如果您现在受到视频解码问题的影响,请手动选择“CPU 视频解码”。这是以前的默认行为。作为 Super Mario 3D All-Stars 的一部分,我们收到了用户在 Super Mario Galaxy 中抓取 Grand Star 时发生崩溃的报告。byte[] 发现问题出在 Vulkan 调度程序如何错误地刷新数据上。解决方案是什么? 使用锁。如果这不起作用,请使用更多锁。 祝您狩猎星星愉快!为了进一步改进对 OpenGL 的支持,Epicboy 回归了。首先,他发现用于跟踪计算着色器中使用的数据的 shfl_in_bounds 变量可能会导致线程处于非活动状态时出现未定义的行为并返回无效结果。 解决方案是将 shfl_in_bounds 检查移到 readInvocationARB 函数之后,这要求所有线程都处于活动状态,以避免 dragons undefined 行为。这修复了单元测试中的一些图形损坏问题,这也应该导致在实际游戏中进行修复。接下来,来自 epicboy 的简单礼物:强制启用 Threaded optimization ,这是一项特定于 NVIDIA 的 OpenGL 优化,允许使用新的单独 CPU 线程进行图形渲染。对于那些使用 NVIDIA 硬件运行 OpenGL 的人来说,这是一个坚实的性能提升。对于那些问,是的,Vulkan 也允许使用单独的线程进行渲染——但我们是在 API 级别而不是驱动程序设置上这样做的,因此所有 GPU 都可以受益。Maide 发现计算着色器在缓冲区缓存中触发失效时出现问题。Yuzu 有很多代码来跟踪游戏使用的缓冲区大小。考虑使用两个缓冲区的游戏:第一个缓冲区的地址范围为 1 到 2,另一个缓冲区的范围为 3 到 5。它们不重叠,因此没有问题。然后,在游戏运行一段时间后,使用需要 1 到 5 范围的缓冲区。前两个缓冲区将被视为与它重叠,并将被删除。然后,来自两个重叠的旧缓冲区数据将移动到新的第三个缓冲区。虽然这已经适用于与图形相关的缓冲区,但它没有正确考虑计算缓冲区。添加缺失的循环来修复这种行为,从最小的图形问题到完全破坏的游戏逻辑,各种问题都有可能得到解决。你知道他们怎么说的:有了计算,天空就是极限。问问 AI 开发人员就知道了。Maide 实施的另一项优化会影响缓冲区在成功删除后如何处理。以前的方法会不必要地创建多个副本,从而浪费资源。通过删除一个同步步骤,仅使用所需副本的确切数量。现在让我们讨论一个长期存在的问题:一些 2D 游戏在 AMD、Intel 和 Android GPU 上显示翻转。游戏可以使用不同的 API 在 Switch 上运行。任天堂允许使用 Vulkan、OpenGL 及其专有 API NVN。这给 Vulkan 上的仿真带来了问题,因为只有 NVIDIA GPU 支持视窗 swizzle 扩展(允许转换视窗)。为了让其他 GPU 供应商在大多数情况下能够正确渲染,我们制作了一个回退实现来处理垂直翻转的情况,供 OpenGL 游戏使用。其实现中的一个小错误使其无法正确跟踪视窗翻转状态的失效,从而导致多个游戏中出现图形乱码。byte[] 通过一行更改解决了这个问题,使 Stardew Valley 星露谷物语 和 Streets of Rage 4 怒之铁拳4 等游戏最终在非 NVIDIA 硬件上正确渲染。不再需要镜子!
在调查这个问题时,一个类似但不同的问题浮出水面。许多 OpenGL 游戏(即使用 OpenGL 进行渲染的游戏,而不是 OpenGL 上的柚子渲染)都要求 1920x1080 帧缓冲,无论游戏是在手持模式还是停靠模式下运行。然后,游戏只需在 1920x1080 缓冲区内移动和调整其渲染区域的大小,就像在更大的盒子内移动一个小盒子一样。在最后一步中,图像被翻转并发送到该 1080p 渲染目标的底部。Yuzu 错误地只渲染了渲染目标的顶部,因为它在最后的通道中是如何计算翻转的。调整此行为可使 Tiny Thor 小雷神 在手持模式下正确呈现。
为了关闭图形部分,通过跟踪这一系列事件,之前的拉取请求有助于发现 Vulkan 演示文稿中的一个错误,该错误导致 Arcaea 在手持模式下被错误裁剪。后来有 95 行裁剪行为代码更改,byte[] 解决了这个问题。
Android changes 安卓更改本月,Android 版本不仅进行了重大的 UI 更改以提高体验质量,而且 Adreno 用户的设备兼容性也得到了极大的改善。这是完整列表!t895 开发了一个新的 GPU 驱动程序管理器,允许列出多个驱动程序,这对于在专有的 Qualcomm 或 Mesa Turnip 版本之间快速切换或每个版本的多个版本很有用。由于 Turnip 驱动程序的 beta 状态和 Qualcomm 驱动程序的代码不成熟,最新版本并不总是最好的。
Byte[] 解决了与表面再现相关的崩溃问题,只需旋转设备即可触发该崩溃。byte[] 解决了影响某些 Android 设备的问题,这些设备附带的是过时的 Vulkan 1.1 加载程序,而不是当前最新的 1.3,导致设备报告的功能比正在使用的驱动程序实际支持的功能更旧。这导致特定的 Adreno 600 和 700 设备在使用任何 Mesa Turnip 驱动程序版本时在启动时崩溃。强制使用驱动程序支持的正确 Vulkan 1.3 功能可解决此问题。我们将在文章末尾对此进行扩展。t895 为具有更大屏幕和/或更高 DPI 的设备实现了主设置菜单网格。这应该会让我们的平板电脑和可折叠用户满意。享受!
byte[] 修复了 Yuzu 在屏幕旋转时无法重新创建表面的另一种情况。T895 将游戏列表加载过程移至单独的线程,以减少打开柚子时的卡顿。该过程仍然需要类似的时间,但感知到的平滑度非常受欢迎。T895 解决了从左侧绘制游戏内菜单时导致触摸按钮覆盖卡住的问题。在等待控制器设置菜单时,t895 修复了一个错误,该错误导致所有控制器输入在某些设备上移动到玩家 2,从而阻止用户玩大多数游戏。具有集成控制器的设备现在应该有更好的体验。最后,在桌面版本的最新更改之后,t895 添加了一个菜单来访问当前支持的小程序、Album 和 Mii 编辑器,以及用于管理 amiibo 数据的 Cabinet 小程序。Wii认为你会玩得很开心!

我们希望将来能扩大这个选择范围

设置菜单也进行了重新组织:
UI 和 Applet 更改在经历了艰难的开始之后,多亏了 roenyroeny 、 boludoz 和 FearlessTobi 的早期工作,我们现在也为 Windows 提供了适当的快捷方式创建支持!要访问此功能,只需右键单击柚子游戏列表中的游戏,选择“创建快捷方式”,然后选择是否要在桌面或开始菜单的应用程序部分使用它。这允许您通过快速启动菜单搜索开始游戏,如果您愿意,甚至可以从菜单/任务栏中的图钉开始游戏。
为了帮助改善这一点,german77 进行了必要的更改,以保存每个图标的多个分辨率,使较小尺寸的桌面图标比以前更具可读性。
DanielSvoboda 对文件系统处理进行了一些更改,以改进快捷方式的目录路径检测,使它们更加可用和稳定。谢谢!改善用户体验 (UX) 的工作总是受欢迎的,您的作者认为 UX 与适当的功能一样重要,永远不应该被忽视。为了提高使用多个控制器的人们的体验质量,flodavid 更改了用户在控件设置中与连接控制器数量的交互方式的行为。用户现在可以更直观地单击底部的绿灯来选择他们想要激活的玩家/控制器数量。谢谢!另一个受欢迎的 UX 新增功能是 Macj0rdan ,当指针放在 UI 中的音量按钮上时,他使用鼠标滚轮实现了对游戏音量的快速控制,无需单击它并拖动小滑块。谢谢!german77 继续在小程序支持方面的工作,实现了 SaveScreenShotEx0 服务方法及其变体,允许用户从游戏内部进行捕获,而不是使用屏幕截图热键全局捕获。这适用于 Super Smash Bros. Ultimate 等游戏,但请注意,屏幕截图编辑尚不可用,那会是以后的工作!
German77 还实现了 SaveCurrentScreenshot 方法,允许用户在安装了最新更新的 Pokémon Scarlet/Violet 中截取游戏内屏幕截图。祝您自拍愉快!
german77 引入的更改之一破坏了 Super Smash Bros. Ultimate 中的 Find Mii 阶段。由于它不是一个受欢迎的舞台,即使在 Smash 社区中,我们也没有注意到这个问题,也没有人在我们的 Discord 服务器、论坛或 GitHub 错误报告页面中报告——我们只是在 Reddit 上的投诉中才发现。这是对您,用户的提醒,请尝试通过适当的渠道报告问题!这样做可以确保我们看到您遇到的问题,并可以努力解决这些问题。柚子是一个大型项目,有许多“黑匣子”区域。会有错误,成千上万的错误,我们的团队可能永远不会遇到。您的声音非常重要,我们讨厌看到任何错误报告从我们渠道之外的裂缝中溜走。有了这些,通过创建带有名称的随机 Miis,german77 解决了这个问题。German77 还将作弊的字符限制扩大到 64 个字符以上。现在你可以随心所欲地作弊了。您知道,我们的开发人员花费大量时间打开和关闭 yuzu,而 byte[] 可以准确地测量出 10% 的关机崩溃是由游戏列表引起的。他发现问题出在Qt如何处理来自被破坏或断开连接的对象的消息上(比如在游戏列表加载时停止模拟器)。通过更改向这些事件报告游戏列表的行为,已经解决了关机崩溃的另一个来源。内核、CPU 和文件系统更改byte[] 最近在修复和实现内核更改方面有很多“乐趣”。首先,他完全实现了传输内存,修复了不正确的页面组跟踪,更新了 KPageTableBase 的实现,现在已经几乎完成了整个 KProcess 的实现!作为 NCE 支持的初步工作,byte[] 为在 Linux 或 Android 上运行的 arm64 设备实现了本机时钟支持。目前不支持 ARM Windows 设备,因为还没有人费心去包含 Vulkan 驱动程序。内核已更新,以反映固件版本 17.0.0 中所做的更改,确保支持未来的游戏。v1993 解决了一些向我们的构建日志发送垃圾邮件的警告,即在适当的情况下使用 std::forward 和限定 std::move 调用。这应该可以解决那些尝试 Darwin 构建目标的人的构建问题。根据用户请求,byte[] 通过删除一些不必要的对象副本,进一步提高了 RomFS mod 的构建性能。这也修复了文件句柄泄漏,现在允许模组制作者在停止仿真后编辑模组文件,帮助他们更快地处理那些多汁美味的游戏模组。Audio changes 声音更改多亏了用户报告,我们的音频鉴赏家 Maide 发现 Ancient Rush 2 会在第一个开发者屏幕结束时崩溃。 每次执行后清除 DSP 缓冲区可解决此问题。
说到音频,byte[] 通过修复音频渲染器中的死锁,在关闭部门取得了另一个巨大的胜利。Hardware section 硬件部分对于老红队卫兵来说,我们有一些悲伤的消息,对绿队的警告,对于肾上腺素机器人来说,这是一个非常好的消息。英伟达,这次我们的错545 和 546 系列驱动程序已经解决了我们上个月报告的高 VRAM 使用率崩溃问题,但用户报告了使用这些驱动程序在游戏中出现的新崩溃问题。恢复到 53X 系列驱动程序可以解决问题,但这一次,这不是 NVIDIA 的错!Mesa 在 24.0.0 版本中也出现了许多新的崩溃,并且前两个驱动程序在相同条件下崩溃并非巧合。我们发现问题在于我们如何重新编译着色器——某些变量的类型不匹配。该修复程序需要一些时间才能实施,因此对于 NVIDIA 和 Mesa 用户在 Bayonetta 3 等游戏中遇到崩溃,我们建议暂时不要更新驱动程序。AMD,向 Polaris 和 Vega 致以最后的欢呼时机已到。GCN 架构的最后 2 个残余即将停产。AMD开始为这些产品发布拆分驱动程序,与RDNA和更新的硬件相比,这些产品运行过时的Vulkan驱动程序分支。 官方 Linux AMD 驱动程序 AMDVLK 终止对这些产品的支持的消息意味着将没有新的 Vulkan 驱动程序可用。这并不意味着他们的所有者的节目已经结束。目前,没有新的更改会破坏与卡的兼容性,并且像 RADV 这样的 Linux Mesa 驱动程序将继续提供支持,很可能会将其扩展到 Windows 驱动程序报告的支持范围之外(就像 Mesa 通常的情况一样)。但对于那些被困在 Windows 上的人来说,这是最后一程。GCN4.0、GCN5.0,你们不是最高效的卡牌,但你们在最糟糕的时刻给了我们很好的价值,多年的惊人游戏玩法,以及伟大的FineWine时刻。我们向您致敬,并感谢您无可挑剔的服务,很少有 GPU 架构在离开舞台时获得如此热烈的掌声。萝卜,一种非常快速改进的在制品yuzu 的所有版本都使用单一的代码库,upstream/master/main,无论您更喜欢怎么称呼它,Mainline、Early Access 和 Android 都从那里开始。当添加对代码库的改进时,它们最终会覆盖所有版本,包括 Android。我们最近改进了对 occlusion queries (项目 Y.F.C. 的一部分)的支持,以提高所有设备的性能和准确性。但是,使用 Adreno 725 和 730 GPU 的 Turnip 驱动程序上的遮挡查询支持无法正常工作,这花了我们很长时间才找到。用户经历了崩溃,迫使他们继续使用过时的 GitHub 版本,我们需要暂停新的 Play 商店版本,直到问题得到调查并得到妥善解决。Mesa 在其当前的 Adreno 700 分支中以创纪录的时间发现、报告并解决了该问题,然后像 K11MCH1 这样的驱动程序打包商使用这些分支来构建高通用户可以在模拟器上加载的包。出于这个原因,我们强烈建议 Adreno 730 和 Adreno 725 用户更新到最新的 Release X 驱动程序,它不仅可以修复由遮挡查询导致的崩溃,还可以修复对 Adreno 725 和 Adreno 730 的某些变体(是的,有几个)的支持。不仅仅是桌面 GPU 供应商喜欢重命名。通过使用此驱动程序,我们能够启动具有最新上游更改的较新的 Android 版本,并且所有 Qualcomm 用户都可以安全地使用最新的 GitHub 版本(如果他们愿意)。顺便说一句,GitHub 构建现在已正确签名。欢欣鼓舞,因为您现在可以从一个更新到下一个,而无需先卸载再安装新版本。如果您想在 Play 商店更新之前测试实验性和可能不安全(但可能更快)的更改,现在要容易得多。Future projects未来项目让我们从大多数人想听的内容开始:适用于 Android 设备的 Project Nice。NCE(本机代码执行)进展非常顺利,但仍有一些错误需要解决。游戏不仅变得可玩,而且在具有散热限制的设备上也变得更快。此外,加载和关闭游戏所花费的时间现在已大大减少!NCE 也帮助我们了解了 x86_64 中 CPU 仿真中的问题,因此预计在这两个方面都会有所收获。
打开网易新闻 查看更多视频

Switch模拟器YUZU进度报告2023-10月

使用红魔 7S Pro(《超级马里奥奥德赛》)录制没有像往常一样对发布日期做出承诺,但正如政客们喜欢说的那样:“我们正在努力。Blinkhawk 建议你的作者告诉你,他正在做一个新项目,试图使 GPU 与进程无关,允许在 GPU 内进行多进程仿真。这次没有花哨的名字,我们只是在内部称其为“多进程”。多进程是实现 UMA 支持的必要步骤,这将为 iGPU 和 SoC 用户带来巨大的收益,并减少 RAM 消耗。这就是所有的人!感谢您阅读到最后。我们下次再见!
页: [1]
查看完整版本: Switch模拟器YUZU进度报告2023-10月