Switch模拟器YUZU进度报告2022-1月
大家好, 这一次,我们为您提供了大量内核更改、输入修复和新增功能,还有更多 NVIDIA 驱动程序修复、用户界面更改等等!
面向 NVIDIA 用户的 PSA:第 3 部分
如您所知 ,普通的 NVIDIA 台式机和笔记本电脑 GPU 不支持解码 ASTC 纹理,因此 yuzu 使用 GPU 的计算能力来并行化处理。 但是,最近发布的 511.XX 驱动程序引入了一个影响我们基于计算着色器的加速 ASTC 纹理解码的问题。
超级马里奥奥德赛
超级马里奥奥德赛
经过一番调查,发现这个 bug 的原因是新驱动程序引入了过度优化(一种场景的优化会导致另一种场景的问题)。 我们做了微小的改变并解决了这个问题。
用户在玩 塞尔达无双:灾厄启示录 或者 路易吉鬼屋3 应该坚持使用 47X.XX 系列驱动程序,因为任何比它更新的版本都会有几个渲染问题。 别着急,我们正在调查原因!后期5XX.XX系列驱动会更好。
塞尔达无双:灾厄启示录
另一方面,版本 511.65 包括对最近发布的 Vulkan 1.3 的支持,并在使用此 API 时显着提高了性能。 有些游戏的性能提升高达 24%!
新传奇
最后,在二十多年后,精灵宝可梦系列摆脱了其陈旧的公式,并在最近发布的游戏中对游戏玩法进行了重大改变 宝可梦传说:阿尔宙斯.
除了令人失望的画面之外,这款游戏的发布还暴露了yuzu的几个问题,甚至帮助我们解决了影响更多游戏的长期存在的问题。
我们在代码中发现的 死锁 在内核之间迁移线程 ,这导致了一些值得注意的软锁出现在 宝可梦传说:阿尔宙斯.
问题可以概括如下: 一个线程(线程 A)将等待另一个(线程 B) 释放锁,反之,线程 B将等待线程 A释放另一个锁,导致死锁。
宝可梦传说:阿尔宙斯
从内核问题开始,epicboy 实现了各种 GPU 更改。
他发现 减少缓冲区分配的数量 在开始时,而不仅仅是在结束时,防止游戏在某些位置崩溃。
一些 Vulkan 驱动程序,尤其是 Intel Windows 驱动程序,无法处理 64 位原子操作(可以独立于任何其它进程运行的操作)。 epicboy 在 yuzu 中增加了对无符号 2x32 位原子操作的支持 ,因为这是此类驱动程序使用的后备选项。 通过此更改,游戏将可以在使用Vulkan 的英特尔 GPU 来进行启动。
AMD 长期存在问题 Transform Feedback在他们的官方 Windows 和 Linux 驱动程序中,导致无数游戏中的渲染问题。 虽然最近在 Linux AMDVLK 驱动程序中解决了这个问题,但仍然需要告知 AMD Windows 驱动程序是哪个 Execution Mode下次会用到。
明确声明使用 Xfb Execution Mode在开始使用之前,Transform Feedback 解决了 AMD Windows Vulkan 驱动程序上与之相关的所有问题,不仅有益于 宝可梦传说:阿尔宙斯,还有游戏之类的 异度之刃 2, 异度之刃:决定版 , 地狱之刃:塞娜的献祭, 大金刚:热带寒流, 宝可梦铁拳 DX,以及许多其它游戏。
宝可梦传说:阿尔宙斯
宝可梦传说:阿尔宙斯
异度之刃:决定版
异度之刃:决定版
大金刚:热带冻结
大金刚:热带冻结
宝可梦传说:阿尔宙斯 受到顶点爆炸的影响,呈现出看起来像随机拉伸的纹理。 坏消息是,这是一个问题 Buffer Cache,并且修复它需要相当长的时间。
好消息是, 在Blinkhawk 的帮助下,设法实施了一个临时解决方法来避免这个问题,同时一个永久性的解决方案开始形成。 在写入之前刷新缓冲区 以最小的性能成本将我们从多边形地狱中拯救出来。
宝可梦传说:阿尔宙斯
宝可梦传说:阿尔宙斯
从这一天开始,我们将开始计划另一个缓冲区缓存重写。
一开始,Arceus 的 VRAM 使用率明显高于正常情况,导致 2GB GPU 用户在过场动画中崩溃。 Blinkhawk的解决方案是 扩展buffer cache增加的具体方向 ,而不是以前的加倍大小的方法。 这让 2GB 用户可以正常玩游戏,而 4GB 用户可以扩展到 2 倍而不用担心崩溃。
现在提供一些一般性建议:
从以前的 Switch 宝可梦 游戏中保存将在教程结束后解锁特殊服装选项。
我们测试了(当前)最新的 22.2.1 AMD Windows 驱动程序的微小性能提升,如前所述,511.65 NVIDIA Windows 驱动程序提升了 24%。 是由于 Vulkan 1.3 提供的帮助。
关于 GPU 精度,而 Normal产生最高性能, High允许正确的粒子渲染,所以如果你想要额外的精度并有备用的性能,请使用 High.如果你想要最高的性能模式请选择Normal。
效果、粒子和某些攻击似乎在超过原生 1x 的分辨率下无法正确渲染。 虽然我们正在调查造成这种情况的原因,但它似乎也发生在 Switch 本身上,所以这可能只是这些着色器的本质(感觉让人想起 3DS 宝可梦游戏),所以如果你想要正确的渲染,请选择1X模式。
宝可梦传说:阿尔宙斯
yuzu 的默认设置是使用 GLASM 在 OpenGL 中运行游戏,通常称为程序集着色器。 这些设置会在角色上造成奇怪的阴影,解决方法是使用 GLSL 而不是 GLASM,要么按照我们的建议,完全切换到 Vulkan。
宝可梦传说:阿尔宙斯
宝可梦传说:阿尔宙斯
早于 400 系列运行 Windows 的 Radeon GPU 的用户将因驱动程序过时和不支持而出现崩溃。 甚至修改过的驱动程序似乎也无济于事,因此唯一的解决方案是使用仍受支持且速度更快的 Mesa 驱动程序的 Linux。
最后,过度使用 mod 或 更高的 异性过滤 会使某些 GPU导致显存溢出。 我们仍在调查造成这种情况的原因。
其它图形修复
Blinkhawk 对垃圾收集器进行了一些更改 ( GC),其中包含许多错误修复,改进算法以使其以更智能的方式清理内存,并使其对 iGPU 更有效。
minimal, expected, 和 critical阈值已重新平衡,因此它不会在具有更多显存的 GPU 上表现得那么激进,同时它仍然可以在低显存显卡的可接受范围内执行这项工作。 此外,yuzu 现在可以查询 GPU 显存的大小而不是估计它,允许 GC在清洁时做出更好的决定。 这些变化旨在最大程度地使低端和高端 GPU 受益,而不会对产生任何一个负面影响。
对 ASTC 纹理进行了特别考虑,因为它们对内存的负担非常重。 这 GC会过早清理它们,导致使用这些资源的游戏出现图形损坏。 出于这个原因,确定何时清理 ASTC 纹理的条件变得不那么严格,这应该可以缓解大多数情况下的问题。
尽管这些变化最初是 YFC项目,Blinkhawk 决定现在实施这些更改,以缓解与以前相关问题的 GC执行。 这个项目还有很多东西要做,所以请继续关注未来更新中的更多信息。
请记住,特殊情况的游戏如 异界锁链 仍然需要 3GB 或更多的 显存 才能正确模拟。
另一方面,一些游戏,例如 超级马里奥 64端口(自制模拟软件),在某些 GPU 模型(尤其是 iGPU)中会遇到卡死。
Blinkhawk 调查了这个问题,并注意到它位于我们的 Vulkan 调度程序中,这是一个抽象命令缓冲区的问题,因此它可以在 Vulkan 环境中执行类似 OpenGL 的操作。
由于调度程序管理它必须在将 GPU 命令发送到设备之前对其进行排队的顺序,因此用于确定这一点的防护逻辑的正确计时至关重要。
以前,调度程序只会对类型偏移量不为零的命令块进行排队。 问题出现是因为存在一个特定的有效类型的命令,其偏移量实际上为零。 不考虑这种情况会阻碍调度程序的隔离逻辑,阻止它正常执行其工作。
值得庆幸的是,该解决方案不需要任何困难的更改,并且 Blinkhawk 能够通过 提交一个简单的补丁 解决了这个特定的问题。
超级马里奥 64
内核更改
内存管理(内核的功能之一)的代码最初是根据当时可用的信息在 2020 年初编写的。 从那时起,Nintendo Switch 的操作系统进行了多次更新,以及通过逆向工程获得的新文件。
出于这个原因, bunnei 一直在检查用于管理内存的代码的每一部分,专注于提高内核的稳定性和准确性。
这些更改涉及刷新内存 属性定义 和 权限 ,所以它们匹配最新的行为 HorizonOS(switich系统的转换层)更接近了一点。 大多数用于映射和取消映射内存的代码 都已整理 ,并且各种功能被重命名以匹配官方命名。 用于分配和清除堆内存的代码 审查完成。
这个新的实现应该表现得更好,并且也使代码更容易阅读和导航。
在调查与 精灵宝可梦剑/盾 ,bunnei 发现它们与竞争条件有关。
第一个发生在为服务打开一个新会话时:也就是说,yuzu 会创建一个 host thread(非模拟线程),其中服务会话请求可以异步分派。 本次会议结束时, host thread因为在添加新会话的同时从跟踪列表中删除了结束会话,这导致了竞争条件。
当游戏想要将某些音频发送到扬声器播放、请求将某些图形加载到内存中时,游戏会请求服务。 精灵宝可梦剑/盾 尤其是,它非常频繁地打开和关闭 LDN 服务会话,这就是为什么它是受影响最严重的游戏之一。
通过 引入工作线程来管理服务列表 ,现在只有一个线程能够创建或销毁服务会话,从而防止崩溃的发生。
在此之后,bunnei 重新访问了用于退出线程的代码,并发现发生了另一个竞争条件,其中线程引用在它们仍然可以选择用于调度时被破坏,从而导致崩溃。
解决方案是 更准确地重新实现线程终止代码 , 使其与 HorizonOS 匹配。 yuzu 现在等待线程在关闭它之前从所有内核中取消调度,这样它只有在它不再运行时才会被销毁。
另一个长期存在的问题 精灵宝可梦剑/盾 与用于高级仿真的代码有关( HLE) 服务线程管理。
当游戏请求某些服务时,而不是模拟 Nintendo Switch 操作系统的内部逻辑(这将是低级模拟, LLE),yuzu 运行由开发人员编写的实现,该实现在用户计算机上执行相同的工作。
这些 HLE服务需要能够与模拟内核交互,以便获取锁和触发器以进行重新调度等。 yuzu 通过利用 dummy threads,它们被创建为模拟的 KThread实体。
一个 dummy thread为每个人创建 host thread运行在用户计算机中的服务接口,这样每当内核需要与 host thread, 它可以通过这些 dummy threads.
此前,这些 dummy threads当它们的主线程被销毁时,它们并没有被释放,因此它们会随着时间的推移而积累。 由于内核对进程可以创建的线程数量进行了限制,yuzu 最终无法在长时间的游戏会话中创建更多线程来打开服务接口。 此外,这些虚拟线程可能会无意中被安排在仿真内核上,从而导致崩溃,因为它们不是真正要运行的线程。
在调查了这些问题后,bunnei 实施了各种修复和检查 纠正这种错误行为,并防止资源泄漏和崩溃。
接下来,bunnei 修复了 KThread 计数器增量/减量 操作,因为旧的实现不正确,并且偶尔可能下溢。 这是前面提到的计数器,用于跟踪所有 KThreads 在一个进程中,确保不违反内核施加的限制。
epicboy 还看了一下内核,并添加了新的关闭方法以 正确同步线程 在它们关闭之前。 此更改修复了在 yuzu 中停止仿真时可能发生的挂起。
用户界面改进
在一系列微小的变化中,许多贡献者决定改进和纠正我们界面上显示的一些元素,以及用户与它们交互的方式。
German77 注意到某些项目,例如 停止 和 开始 按钮,一旦仿真过程停止,就不会被禁用交互,并及时修复了这个错误行为 .
他还继续实施了 控制器显示电池电量的 UDP。 虽然这段代码在 yuzu 的源代码中已经有一段时间了,但准备适当的前端图形以及随后在 UI 中的实现一直是没有解决的工作。
更新了 AMD FidelityFX 超分辨率 ( FSR) 依赖到最新版本, Moonlacer 更改了文本字符串以替换括号周围的括号 Vulkan Only带括号的消息,以与我们界面中的所有其它文本保持一致。
同样, gidoly 更正了描述商业游戏手柄名称的字符串中的一系列拼写错误,即 PlayStation 和 Xbox 控制器。
根据在我们的 discord 服务器 ,gidoly 还进行了必要的更改以使 Dark Colorful主题为默认主题 首次在 Windows 上运行 yuzu 时使用。
v1993 还进行了更改,现在使用彩色主题 允许 Qt 在 *NIX 系统中使用系统范围的颜色 ,而不是强制黑色。
当然,如果需要,用户仍然可以通过配置设置更改主题。
输入变化
用户反映游戏 口袋力量棒球R ,以及 实况力量棒球 的其它游戏,在游戏中崩溃。 这是由 SetNpadAnalogStickUseCenterClamp服务能够初始化 applet_resource子系统,即使它之前没有初始化。 模拟此行为可解决问题并使某些游戏模式可玩 . 但是,部分游戏模式仍然显示yuzu缺乏对某些顶点格式的支持,导致崩溃。
口袋力量棒球R
yuzu 现在将 只显示游戏支持的控制器类型 ,取决于每个游戏的兼容报告。
Fullkey是任天堂使用的代号,用于指代一种通用类型的控制器,如果您连接“不受支持”的游戏手柄,则该控制器将自身报告为 Pro Controller。 这可以参考 GameCube、NES、SNES、N64 和 Sega Genesis 控制器。 如果出现问题,控制台会回退到为这些类型的控制器报告 Pro 控制器。 German77 也 将此功能添加进去 .
添加了支持以 允许仅存在加速度计的设备充当体感设备 . 虽然这意味着更广泛的支持,但缺少陀螺仪意味着体感结果很差,因为某些轴运动不会被记录下来。
在 v1993 的帮助下,german77 修复了 UDP 控制器的映射 (使用 cemuhook 协议连接的任何设备)。 Motion 现在可以正确自动映射,手动映射不会重置输入列表中的设备。
在单独的 PR 中,应 v1993 的请求,german77 添加了对 UDP 连接上的 Home 和 触摸 按钮的支持 .
一些体感设备可以输入非常精确的值,如果阈值太高,体感值将被忽略。 降低陀螺数据的门槛 修复了这个问题。
玩的时候 马里奥网球 在摇摆模式下,体感可能会突然停止工作。 这是因为体感数据的更新率间隔设置得太高。 将体感更新速率降低到 10 毫秒可恢复功能 .
同样与体感模拟有关,设备的质量和灵敏度也会影响游戏玩法。 作为一种补偿方式,german77 引入 了一个配置陀螺阈值的选项 ,如果您有一个支持体感的控制器(在示例中为双 Joy-Cons),您可以找到它。 配置在 模拟 > 设置… > 控制.
配置陀螺阈值
进入 2 人模式 宝可梦 Let's Go! 皮卡丘·Let's Go! 伊布需要进行摇晃动作。 键盘上的模拟震动太弱而无法被游戏记录下来,因此 增加了它的“力度” 动摇事物以允许本地多人游戏。
发布时缺少的功能之一 Project Kraken,输入重写,是鼠标体感支持。 German77 重新引入了对它的支持 ,现在使用鼠标滚轮作为 Z 轴的输入。 此外,鼠标按钮在映射时会获得它们的正确名称。
不知何故错过备忘录的另一个功能是 键盘输入的棒修饰符 ,按住映射键以降低限制移动模拟摇杆。 例如,使用默认键盘映射时,如果您按住 shift,左侧模拟摇杆最多只能移动其范围的 50%,从而允许键盘用户行走。
我们最近引入了控制器 UI 导航。 虽然很舒服,但一些用户运行外部程序将控制器输入转换为键盘和鼠标输入。 对他们来说, 添加了一个禁用控制器导航的开关 在 模拟 > 设置… > 控制 > 高级 > 控制器导航.
控制器导航
默认情况下,yuzu 假设非 Nintendo Switch 控制器,例如 Xbox 控制器,将使用震动马达。并且使用指数幅度曲线来处理它们的隆隆声,这使得这种方法与模拟 精准震动 不兼容。 相反,PlayStation 5 上的 DS5控制器 使用更昂贵的线性执行器(并且需要线性幅度曲线),例如 switch pro控制器 和 Joy-Con控制器。 有了这个变化 , German77 扩展了支持,支持官方的 PlayStation 5 控制器 DS5,它能够达到 精准震动 所需的精度。
一般更改和错误修正
TAS 脚本有时会出现错误,导致 yuzu崩溃。 追加代码 向 TAS 脚本添加错误处理 ,防止这些崩溃。
Windows 有一个令人讨厌的隐藏限制,即程序可以使用的最大打开文件限制。 一些游戏模组可以包含很多 很多 文件,超过之前的 4096 限制。 因此, Morph 将限制翻倍至 8192 .
v1993 一直致力于使用 PVS-Studio ,效果非常好。 到目前为止,在 四个 单独 输入 相关区域 , 着色器重新编译器 ,甚至内核仿真 !
感谢 v1993! 没有什么比更干净的代码更好的了,特别是如果它解决了越界问题。
Morph 打断了 SetCpuOverclockEnabled服务 (您不需要在模拟时即时超频主机 CPU)。 这允许 超级摩托车零 启动,但由于缺少纹理格式支持,屏幕上尚未显示任何内容。
最后,german77实现了监督者调用 (SVC) 的 32 位变体SynchronizePreemptionState , 圣战之翼2 可玩。
圣战之翼2
同时, liushuyu 更新了动态外部子模块,提供了 优化并修复了编译错误 由另一个外部的更新引起的, fmtlibrary — 用于格式化 yuzu 日志和界面中的文本。
German77 还添加了新的 热键,允许用户操纵音量 使用游戏手柄直接使用应用程序的功能,对于那些在舒适的沙发上享受柚子的人来说肯定会派上用场。
默认, Home D-Pad Right将使应用程序静音,而 Home D-Pad Down会降低音量,并且 Home D-Pad Up会增加它。 用户可以通过配置菜单随意更改这些映射 模拟 > 设置 > 热键.
热键设置
在进行此更改时,german77 注意到用于从百分比值转换为“响度”(即输出功率)的公式在低于 70% 标记时过于激进,使得音量在此范围内非常柔和。 因此,他决定修改公式,使转换在整个百分比值范围内更加平滑。
声音平滑曲线
未来的变化
我们的开发项目进展顺利。 例如, German77 正在享受一些需求量很大的功能。 的绝密项目之一 Rodrigo 之前未完成 变绿 , Host Conditional Rendering. 期待在未来听到更多 Project Y.F.C.消息。
现在来看一些最近的内部测试的小泄漏: 漫威终极联盟3 黑色教团 从 19 FPS 跳到 51 FPS,你的敌人的墨水在 喷射战士2工作正常,这两项更改都改进了 Vulkan。
漫威终极联盟3 黑色教团
漫威终极联盟3 黑色教团
这就是1月的所有! 很高兴有你在这里,希望我们下个月再见!
感谢大家的点赞、关注、转发。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved