Switch模拟器YUZU进度报告2022-8月
大家好,欢迎回来! 八月是一个充满进步的月份。 大量的图形更改、内核和文件系统改进,以及更多的工作投入到网络联机中。
图形变化
本月对 7 月的重磅发布进行了一些值得注意的修复, 异度之刃 3. 尽管 异度之刃 3在柚子的发布日确实可以运行,但我们花了一些时间来解决稳定性问题。
上个月提到的第一个是对 yuzu 的着色器重新编译器的修复。 yuzu 不使用 GLSL 编译器来生成 SPIR-V,即 Vulkan 着色器语言。 相反,它直接生成 SPIR-V,速度更快,但更容易出错。 在这种情况下,着色器重新编译器未能在 SPIR-V 着色器中声明一些变量,并将对它们的引用保留为空,导致着色器在编译时崩溃驱动程序。 Maide 和 byte[] 很快发现并修复了问题, 允许游戏在发布日在 Vulkan 中运行。
异度之刃3
使用的管道集 异度之刃 3是巨大的,在延长游戏时间后,许多管道缓存时钟超过 15000 个条目。 对于所有图形后端,yuzu 会在游戏开始之前预编译着色器,并且不允许在编译完成之前启动它。 使用 GLSL 上的 OpenGL,编译需要整整一分钟才能完成与生成的管道缓存一样大的管道缓存 异度之刃 3. 更糟糕的是,您以前无法在编译过程中取消它。 如果你尝试过,柚子会冻结并继续等待编译完成,然后才允许你关闭游戏。 解决这个轻微的 UX 烦恼 通过在每个着色器编译后让着色器编译器检查取消来 允许随时立即停止编译。
异度之刃3
异度之刃 3的大量管道也给模拟带来了问题。 因为 yuzu 试图为您提供尽可能无卡顿的体验,所以它会在您开始运行游戏之前尝试将所有已知的管道加载到内存中。 如果一个游戏只有几千个管道,这可能是一个合理的提议。 但是,同时将 异度之刃 的 15000 多个不同的管道全部保留在内存中会导致 GPU 驱动程序中的内存使用量猛增。 Cemu 的老用户可能记得在使用 NVIDIA GPU 时遇到过类似的问题。
为此,byte[] 查找 yuzu 中可能导致 GPU 驱动程序占用的内存超出其需要的任何问题。 byte[] 注意到,除了编译的着色器之外,OpenGL 还跟踪着色器源代码的各个对象。 适当地 允许释放这些着色器源代码对象 回收大量浪费的内存 时预期显著降低 VRAM 和 RAM 使用率 。
异度之刃3
yuzu 的 OpenGL 后端的一项优势 异度之刃 3有一段时间是稳定的。 它并没有真正崩溃。 然而,Vulkan 是另一回事。 即使在前面提到的初始 Vulkan 着色器修复之后,游戏仍然会在过场动画中随机崩溃。 byte[] 能够重现该问题,并发现 yuzu 在 GPU 处理中收到了一些无效的引用。 无论这是否是游戏的正当行为,还是只是一个仿真错误,他都认为 yuzu 可以通过 传递 VK_NULL_HANDLE对于图像视图, 而不是尝试为空图像创建图像视图,这保证会崩溃。
异度之刃3
Windows 上的 AMD 用户对 Vulkan 的支持一无所知 异度之刃 3就一点。 我们的一位测试人员, 您的作者 ,获得了包含 Vulkan 验证错误的日志,并确定崩溃是由于尝试使用 Windows 驱动程序不支持的某些顶点格式造成的。 然而,他们得到了支持 RADV,Linux Mesa 驱动程序。 byte[] 还发现了一种相反的情况,其中一种格式受 Windows 驱动程序支持,但 RADV 不支持,并实施了一种通用解决方法,可以 为这两种情况替换兼容格式, 一次修复多个崩溃。
异度之刃3
与 异度之刃 无关的一些 GPU 更改也在本月实现。
时隔多年,自从我们的 Vulkan 后端 ,yuzu 终于 在 Vulkan 中添加了对 垂直同步 的支持 由新贡献者 djrobx 提供 。 如添加它的拉取请求所述,如果模拟和显示非常接近精确同步,则当新生成的帧没有果断地落在下一个显示时,可能会出现跳帧。 此更改允许 yuzu 将帧与显示器刷新率完全同步,防止任何抖动。 非常感谢!
垂直同步Vulkan
Merry 的作者 dynarmic 对平铺图像和平铺图像之间的转换过程进行了优化 对于 GPU。 这不会对游戏的性能产生太大影响,因为它们通常会避免在平铺图像和平铺图像之间进行转换,但它显著提高了自制应用程序的性能,这些应用程序将每一帧都转换为显示到控制台。
关于不寻常技术的主题, vonchenplus 实现了对称为 矩形纹理的传统 OpenGL 格式的支持。
遗留功能似乎在一些游戏工作室中很受欢迎
作为此更改的副作用, 管道缓存清除 必须由 Morph 。
你可能在想,但不是所有的纹理都是矩形的吗? 确实如此,但使矩形纹理与众不同的是它们在着色器中的索引,其坐标从 0 到它们的宽度/高度——纹理坐标,而不是 0 到 1——归一化坐标。 这种模式不是很有用,所以看到它仍然被游戏使用是一个惊喜。 此更改修复了许多渲染问题 无重力赛车 和 旅行者(两个游戏使用相同的引擎)。
动作冒险游戏《游客》
如果是 无重力赛车, 禁用 DYNAMIC CAMERA EXPOSURE在其游戏内图形设置中修复了一个过亮的渲染错误。 测试表明 OpenGL 对于这个标题似乎更稳定。
无重力赛车
所需的一些东西的支持 RetroArch 自制软件 是的,更多的“模拟器中的模拟器”。
第一步是 clkrst服务,用于控制控制台上的时钟速度, 被存根 允许 RetroArch 启动。 模拟时钟速度对柚子来说意义不大,所以不亏。 二是特殊行为 switch-mesa,它使用 不同的帧缓冲裁剪 并在没有适当仿真的情况下出现在屏幕的中间。
在准备 Project London发布的更改, Tobi 发现了一些问题 Rocket League这阻止了它正常工作。 byte[] 发现它可以在单核中启动,但游戏在 Vulkan 中的渲染很糟糕。 为此,byte[] 添加 了对 R16G16B16X16格式 被游戏使用,修复渲染问题。 不过,要让这款游戏在 yuzu 上可以玩,还需要做更多的工作。
火箭联盟
实现了一个解决方法 之前的性能修复 至 超级马里奥银河 和 超级马里奥阳光. 虽然性能修复应该是无回归的,但由于它是缓冲区缓存中的一个错误,许多游戏需要 不太 准确的行为。 马力欧+疯兔:王国之战, 喷射战士 2, 和 任天堂明星大乱斗 在这个拉取请求之后,所有人都引入了一些额外的闪烁,所以 byte[] 做了这个 功能, pessimistic flushing, 可选的, 并默认禁用,因为大多数游戏不受影响。
如果发现奇怪闪烁,请勾选测试
最后在本月 GPU 更改列表中, german77 以及 章程 , Skyline 模拟器 添加 了对视口 swizzling 扩展的模拟 被一些游戏使用。 这些由带有扩展的 NVIDIA GPU 支持,但 AMD 或 Intel GPU 不支持,因此一些游戏似乎呈现颠倒或翻转。 游戏之类的 怒之铁拳4 , 蔚蓝, 公理边缘,还有许多其它的现在可以在 AMD 和 Intel 上运行!
蔚蓝
公理边缘
CPU、内核和文件系统仿真
用户,我们有一些好消息 仍在 运行不受支持的 Windows 版本的 用户 的调查 所做 vladkosi ,Merry 能够 在 fastmem 中实施所需的更改 再次支持早于 Windows 10 版本 1803 的 Windows 版本。
虽然这对 Windows 7 帮派来说是个好消息,但它并没有改变我们在操作系统版本支持方面的立场: 官方 。 在未来对 Vulkan 和内存管理进行更改后,时间会告诉我们与旧 Windows 版本的兼容性会发生什么变化,但就目前而言,它们的支持时间更长。
但好消息还不止于此。 以下是一些旨在帮助mod社区的更改!
过去,内联注释添加到 pchtxt不允许使用 mod,因为我们以一种使它们不兼容的方式解析文本。 Morph 现在 分隔十六进制值字符串, 允许修改者添加评论。 例如:
Before: here to here
v v
12345678 12345678 // comment
^ ^
After: here to here
我们当前的文件系统模拟可以被认为是意大利面条代码,因为在可用信息较少时做出的旧猜测,以及不再为项目做出贡献的开发人员所做的拼凑。 没有办法粉饰它,这就是Morph一年多来努力工作的主要原因 Project Gaia,完全重写了当前的虚拟文件系统实现。
同时,可以做一些进一步的拼凑以减少开发人员和修改者目前所忍受的头痛。 例如, Build IDs由一堆零填充,并且修改者更习惯于简短形式,而不包括开头不相关的零。 为了解决这个问题,byte[] 使用 fmt 解析 Build ID 字符串 在需要时动态添加所需的零。
继续专注于改善 RetroArch 在 yuzu 中的体验,vonchenplus 发现在解析目录时递归计算文件的大小会对性能产生负面影响,在这种情况下,当使用模拟器启动游戏时(在模拟器)。 简单地忽略这些信息 是改善用户体验的好方法。 请注意,此更改无助于在 yuzu 上运行本机 Switch 游戏,它只会为 RetroArch 提供更快的加载时间。
用户界面更改
长期以来,人们一直在要求柚子更大的音量,而麦德提供了。 现在,如果用户去 Emulation > Configure… > Audio, 他们可以 将音量设置为 200%, 真的把它调到11!
声音设置界面
需要记住的是,有些游戏的音量会根据他们正在使用的输出进行调整。 例如,在手持设备上玩游戏的声音可能比对接时更大,所以不要给你可怜的耳朵施加压力。
yuzu 的部分代码仍然基于 Citra ,甚至一些不再相关的部分,或者多年来已经过时。 清理代码对于任何项目来说都是无聊但必不可少的部分,对于开源项目更是如此,yuzu也不例外。 早期非常有用的一项功能是加载 ELF 二进制文件。 早在早期,开发人员不再处理 XCI 和 NSP 转储,而是转储并提取游戏的整个文件结构,并直接加载 ELF 二进制文件,类似于在 Windows 上用户打开 .exe 文件的方式加载程序。
几年下来,这个功能不仅 失去了用处 ,而且也停止了工作。 由于目前它不是优先事项,并且可能导致用户混淆,因此 byte[] 将其从文件下拉列表中删除。
亚洲语言 Windows 用户注意到游戏列表中的大小列和速度百分比设置显示 非常奇怪 字符。
文件大小错误
当然这是不可接受的,因此 Docteh 实施了 必要的更改 在 Windows 中解决此问题。
修正之后
添加到仅限亚洲语言的 UI 错误列表中,如果用户以中文启动 yuzu,然后切换到英文,则底部的过滤器栏和顶部的游戏列表列将保持未翻译状态,拒绝转变。 强制 Qt 重新翻译 这些对象解决了这个问题,让 Docteh 很高兴。
Docteh 实现 了更多的 UI 修复 此外,清理“关于”对话框并使 Direct Connect UI 中的默认端口号忽略翻译。
更改了关于中显示的版本说明
用户抱怨控制器配置文件下拉列表的字符限制太短,抑制了他们的创造力。 German77 加强并 增加了字符限制。
输入改进
带有控制器的 UI 导航是 yuzu 中相对较新的新增功能,因此还有改进的余地。 例如,用户报告说,如果启用了“游戏启动时提示用户”功能,控制器输入将能够导航选项并启动游戏,但无法实际更改配置文件或取消启动过程。 新人 jonesyUK 解决了这两个问题 有点 Qt 的魔力。 谢谢!
一些用户更喜欢依赖 DS4Windows 而不是 yuzu 对游戏控制器的原生支持。 虽然这是有充分理由的,但这是让单个应用程序处理 XInput 仿真的一种简单方法,但它也可能导致 German77 发现一些有趣的问题。 例如,当前版本的 DS4Windows 无法处理两个后续振动命令,从而产生不舒服的持续震动(傻震)。 为了解决这个 brrrrrracing 问题,german77 添加了一个小延迟 所以应用程序不会跳过停止震动的信号。
在一个更丰富多彩的主题上,并打算修复一个错误 马里奥派对:超级巨星, German77 花了很多时间来处理 如何正确模拟控制器的颜色, 还有修复电池电量图标的小问题!
更漂亮的控制器
导航 Emulation > Configure… > Controls > Advanced里!
并且要结束这一部分,我们必须承认我们身边的一个oopsie。 随着红外摄像机支持的初始实施,输出被保存到存储中。 每个视频帧都作为一个单独的图像文件...... 这导致大量文件被写入磁盘,使使用文件管理器进行导航变得很痛苦,并且占用了大量存储空间。 哎呀。 German77 迅速采取行动, 将输出移至缓冲区。
如果任何用户遇到这种情况并且无法删除文件,请打开命令提示符或终端,选择到图片文件夹,然后运行 del IMG_00*.jpg一击将它们全部消灭。
硬件部分
英特尔 ARC 加入
我们收到的信息表明,A380 英特尔 GPU 的早期采用者在使用 Vulkan 运行游戏时遇到问题。 由于此硬件尚未在全球范围内提供,因此我们的开发人员和测试人员不容易获得它,因此请 在我们的 GitHub 中发布问题, 包括 日志文件 ,或在我们的 论坛 或我们的 Discord 服务器 。 如果需要,我们会要求提供更多信息,以找出原因。 以解决早期采用者的困境。
AMD,利用 OpenGL
使用 AMD GPU 的用户报告说, 异度之刃 3总是导致崩溃。 解决方法是使用 OpenGL 和 2X 分辨率运行游戏,越过该区域,保存并切换到 Vulkan。
为什么是奇怪的特定 2X 分辨率? 出于同样的原因,我们上个月的绩效图表没有结果 异度之刃 2在这个新的 OpenGL 驱动程序上,它会导致与驱动程序相关的崩溃。 2X 可以解决此崩溃问题,并且 AMD 已正确警告此问题。 到目前为止还没有他们的消息,但是由于我们可以访问他们的 Vanguard Beta 测试程序,我们会在公共驱动程序中的修复程序发布后立即告诉您。 游戏现在在 OpenGL 下并没有那么慢,但是在 Vulkan 下着色器的卡顿总是会明显更好。
我们建议更多模拟器开发者 申请 Vanguard ,因为内置驱动程序错误报告工具的间接方法不适合控制台模拟器的特定需求。
NVIDIA 让我们自己去解决
我们确认,当前 516.XX 系列驱动程序影响 Maxwell 和 Pascal GPU 的崩溃至少有很大一部分是由计算着色器中的一些驱动程序更改引起的,这与我们基于计算着色器的 ASTC 纹理解码器产生了共鸣。 作为一种解决方案,并且为了避免将来出现此问题,因为这不是第一次 NVIDIA 驱动程序更新破坏它,我们正在考虑 切换到多线程 CPU 解码器 由 Morph 开发。
光荣公司的游戏出现阴影闪烁的原因仍在调查中。
未来项目
合并延迟 Project Y.F.C.不仅会影响 主线 用户,还会阻碍开发进度。 在地狱冻结的另一个例子中(没有人期望 AMD 修复 OpenGL),所有人中的 NVIDIA 开源了一些文档 (当然,部分是我们正在谈论的 NVIDIA,他们是如此封闭的源代码,他们甚至没有得到新鲜空气)。 这包括 Maxwell 3D 寄存器的专有名称、全新的寄存器,甚至是以前未知的值。 Maide 一直在 检查、替换和清理大量代码 感谢这个新的官方信息,但这个变化的合并将不得不等待。 预计不会有任何游戏修复,但清理和代码的易于理解是非常值得的。
一个有趣的实验,它将在一些带宽匮乏的游戏中使所有用户受益,例如 塞尔达传说:荒野之息, 异度之刃 3, 和 真女神转生5 等,正在增加 Vulkan 的流缓冲区大小。 测试显示性能提升 10-50%,具体取决于系统,即使没有 ReBAR 支持(将缓冲区大小限制为 256MB)。 访问所有可用的 VRAM 开启了获得更高收益的可能性!
测试性能差异
在您与作者过多唠叨之后,byte[] 实现了一个 草稿,以便使用滑块轻松测试该功能, 但最终目标是动态管理它,所以不要期望在正式版本中将此功能视为 UI 选项。
为最后的润色工作 Project London,托比一点也不被动:
添加代理套接字数据包的能力, 其中包括具有本地网络支持的自定义房间,包括 LAN 游戏,而不仅仅是 LDN。
存根并添加一些必需的数据类型。
改进了进行中的房间功能。
网络:修复和改进房间功能
哦! 我们怎么能差点忘记呢? Project London,LDN支持, 终于 出来了! 我们将在下一个进度报告中回顾该版本。
这就是所有的! 非常感谢大家一直以来的陪伴,希望下次再见!
特别感谢神秘作家B对本文的帮助!