图图鲁~余兹人。你觉得上一份报告太短了吗?好吧,八月正在全力以赴!本月提供了重要的图形修复,开发人员解决GPU限制,几个早就应该修复的文件系统修复,Skyline框架支持,一些Android和Apple的喜爱,等等!
永远的柚子炸鸡
还有罗宾。
这是 、 和实现的最后一部分。但在我们开始之前,我们必须解释一些事情。Project Y.F.C.Query Cache RewriteHost Conditional Rendering
为什么我们需要查询缓存?
许多 GPU 公开计数器,这些计数器用于从 GPU 执行的各种命令中收集数据,例如绘制了多少像素或生成了多少三角形。 游戏使用查询在需要使用这些计数器并将其加载到内存中。
Yuzu 的查询缓存负责跟踪 Switch 游戏的 GPU 计数器的值以及来自游戏的服务查询请求。
它的用途是什么?
一些游戏可以利用这些获取的数据来进一步优化其渲染。例如,使用称为遮挡剔除的常用技术优化其渲染的三角形数量。SUPER MARIO ODYSSEY
遮挡剔除是一项功能,当摄像机当前看不到对象时,该功能会禁用对象的渲染,因为它们在屏幕外或被其他对象遮挡(遮挡)。
在 中,游戏首先渲染简单的边界框,这些边界框覆盖将在屏幕上渲染的所有对象。 然后,它查询渲染到每个框的像素数,并且仅渲染其相应框具有任何像素的真实对象。SUPER MARIO ODYSSEY
同样,游戏使用像素计数来检查给定角色触摸的墨水。 游戏同时测试盟友墨水和敌人墨水,如果两个测试都失败,则角色不会站在任何墨水中。Splatoon
中孔(Splatoon 2)
发展与挑战
柚子已经有一个多年前开发的查询缓存。 但是,这种实现并不完美,并且存在许多问题。仅举几例:
它无法保存除像素计数之外的任何查询
它无法以正确的顺序写入内存
它不会使后来被其他查询类型覆盖的查询无效
我们的常驻 GPU 开发人员 Blinkhawk 着手重新设计查询缓存,以解决这些问题并使代码现代化。 但是,正如他后来发现的那样,这并不容易。
回想一下,查询缓存的工作原理是在主机 GPU 上运行查询。 事实证明,弄清楚如何使其在主机GPU上工作实际上是整个重写中最困难的部分,因为Switch GPU的功能与Vulkan等主机图形API公开的内容之间存在显着差异。
在开发过程中,Blinkhawk在Host GPU查询方面遇到了两大挑战。 首先,出于性能原因,我们无法在处理命令后立即向主机 GPU 提交命令。我们需要对它们进行批处理以获得任何合理的速度水平。这就引出了一个问题:我们什么时候需要执行查询并同步内存?
一旦您开始游戏,游戏就会开始进行查询以获取 GPU 计数器。 通常,结果是在计数完成后立即由 Switch 的 GPU 获得的——当渲染完成时。 但是像这样的游戏,它使用遮挡剔除,会进行很多查询。SUPER MARIO ODYSSEY
因此,如果我们尝试运行所有这些查询并以相同的方式在主机(用户)的 GPU 上写入结果,那么在绘制每个场景元素以写回计数器后,它会严重停止 GPU。
为了防止这种情况发生,每当游戏请求 GPU 等待命令完成渲染时,Blinkhawk 都会同步内存。这允许高效的批处理,以及在等待利用计数器值后发生的 GPU 命令。
转动镜头,整个城市神奇地消失了(超级马里奥奥德赛)
其次,在来宾(交换机)的GPU中,计数器可以随时重置,也可以根本不重置。 但是这种行为并没有在OpenGL和Vulkan等图形API中公开。 相反,这些 API 具有仅计算较小部分(例如单次绘制或多次绘制)的查询。 这意味着我们需要获取所有查询结果并汇总它们,尤其是在游戏从未重置计数器的情况下。
在旧的查询缓存中,我们习惯于在单个 GPU 线程上汇总所有查询结果,这无法跟上繁重的工作负载。 随着查询结果数量的增加,对它们求和所花费的时间也在增加。 这对于大约 50 或 80 个查询来说很好,但有些游戏可以轻松地在单个帧内进行数千个查询。
Blinkhawk尝试了几种不同的算法,最终确定了基于Hillis Steele扫描算法的实现。
结果呢?好吧,让以下列表不言自明:
里面的灯笼是固定的。Luigi’s Mansion 3
没有闪光弹(路易吉的豪宅3)
使用高 GPU 精度时,细节级别是固定的。不再有树木闪烁。Pokémon Scarlet & Violet
在某些Koei Tecmo游戏中渲染是固定的,当使用高GPU精度时。Marvel Ultimate Alliance 3: The Black Order
使用高 GPU 精度和禁用异步着色器构建时,会修复发光粒子。Xenoblade Chronicles 2 & 3
正确填充火焰时钟(异度之刃编年史3)
中的阴影是固定的。Metroid Prime Remastered
不是黑暗萨穆斯(银河战士总理重制版)
在使用主机条件渲染的游戏中,低端和/或功耗受限硬件的性能有所提高,例如、、、大多数Koei Tecmo游戏等。Pokémon Scarlet & VioletLuigi’s Mansion 3SUPER MARIO ODYSSEY
还有更多!
更多 GPU 更改
GPU 的变化并不止于此;还有很多内容要介绍。
让我们从一个令人惊讶的端口开始:本月登陆Switch和其他游戏机,随之而来的是专有RAGE引擎的新版本,为我们的开发人员提供了一些需要解决的怪癖。 你知道,新版本通常也是如此。Red Dead Redemption
动态GPU二人组(Blinkhawk和Maide)分析了游戏,并得出结论,最初渲染中断的原因是由于Vulkan上缺乏对蒙版深度模板清除的支持。
深度模具或深度和模板缓冲区的组合是一种将深度缓冲区和模具缓冲区组合到内存中的单个图像中的图像类型,从而加快 GPU 的测试以确定是否将绘制任何给定像素。
进一步详细说明:
深度缓冲区存储相机与当前最接近它的像素之间的距离,允许 GPU 确定哪些像素将被其他对象覆盖,因此不应绘制。
模板缓冲区更专业:它为每个像素存储一个字节,开发人员通常使用它来标记某些类型的对象。例如,可以为地面分配值 1,为树木和树叶分配值 2,为玩家分配值 17,依此类推。了解哪些像素属于哪些对象以应用各种效果非常有用。这是一个很棒的视频,展示了如何在 中使用模板缓冲区的示例。此视频中提到的材质遮罩缓冲区是模板缓冲区,用于防止效果应用于不需要的材质。The Legend of Zelda: Breath of the Wild
这些缓冲区的主要用途是正确渲染具有阴影、反射和透明度的场景。如视频示例所示,通过标记每个像素,许多类型的图形效果变得更加容易,因为这允许 GPU 根据像素的材质类型有条件地应用效果。
那么,为什么明确的操作在Vulkan上是一个问题呢? 在图形编程中,清除用于将缓冲区的所有数据重置为指定值。 Switch的NVN和OpenGL等图形API支持应用掩码来清除操作。 应用清除时,遮罩会更改图像的哪些位将受到影响:设置为 1 的位位置受清除的影响,设置为 0 的位位置将单独保留。 例如,如果游戏需要 4 位模具的上 8 位进行后续绘制,则它可以将掩码设置为 二进制 ,并清除值为 0 的模具。 这将导致仅清除较低的 4 位,而根据需要保留较高的 4 位。00001111
OpenGL 支持所有清除操作的遮罩,包括颜色、深度和模板缓冲区。 但是,Vulkan 旨在支持移动 GPU,而在移动 GPU 上,最有效的实现可能是在清除旧缓冲区时完全丢弃它。 这样可以避免从内存中读回缓冲区,而这种读取可能很昂贵。 因此,Vulkan 没有直接等同于蒙版清除,并且需要一次清除图像的整个“方面”(颜色、深度或模板)。
Red Dead Redemption在其模板缓冲区上使用遮罩清除。这就是为什么这个错误只影响草和灌木丛:游戏试图用面具保持这些值不变。 但是由于我们直接从游戏中将清除转换为 Vulkan 清除,我们只是擦除了整个模板缓冲区,在此过程中破坏了灌木和草的渲染。
我们为Vulkan提出的解决方案类似于我们之前为《女神异闻录5 Royal》使用的技巧:使用常规抽奖,而不是透明抽奖。 通过常规绘制,我们能够使用内置的硬件支持来应用模板蒙版,并产生与 OpenGL 相同的结果。
现有的新系统通过绘制全屏三角形来工作,这允许常规模板硬件处理屏蔽和缓冲区写入。多亏了这一点,Red Dead Redemption中草丛和灌木丛的渲染问题现在得到了解决。你好!您可以直接正确渲染到您的脸部,无论喜欢与否。
你有一些龙舌兰酒,然后胡安决定他是一个冒险家(荒野大镖客救赎)
Blinkhawk和Maide还发现了间接计算调度模拟方式的旧回归。 对于外行,间接调度是一种技术,用于允许 GPU 从另一个计算着色器或 GPU 操作生成的结果中获取需要执行的工作量,而不是在记录时由 CPU 传递。通过让 GPU 像这样独立地工作来避免较慢的 CPU 路径可以提高性能。 如此独立而强大的Tegra X1 GPU。看着它成长。
由于这种后期的干预,、、 现在渲染得更好了:Rabbids 系列中的阴影具有适当的阴影水平,现在可以看到《孤独之海》中的环境。Mario + Rabbids Kingdom BattleMario + Rabbids Sparks of HopeSea of Solitude
这个花了一段时间,嗯(马里奥+兔子王国之战和孤独之海)
《孤海》中的水需要模仿Tegra X1的其他非常棘手的方面,所以这是以后的功课。
正如麦德现在也了解到的那样,快速路径是一个古怪的女士。 她负责直接从 GPU 上传和下载图像数据,转换 CPU 和系统内存上的图像数据。 但是,它只有在满足适当条件时才能起作用。 如果你不小心翼翼地靠近她,你会在错误的地方、错误的时刻得到错误的数据。 这就是幸运,一个在Vulkan上崩溃的游戏,并在OpenGL上完全崩溃。Accelerated DMASid Meier's Civilization VI
罪魁祸首?未将目标缓冲区和/或映像标记为已修改,导致任何将来的读取都不会触发相应的下载。这导致游戏读取了错误的数据。快速路径的这一怪癖现已得到解决,并且添加了用于地址对给定图像格式无效的情况的 CPU 回退路径。策略迷现在可以尽情地互相攻击。 甘地说,和平从来都不是一种选择。
再转一圈(席德梅尔的文明VI)
对于我们有文化的玩家来说,Blinkhawk 和 byte[] 为我们带来了期待已久的修复。 它们涉及模拟交换机的 GPU 驱动程序如何模拟硬件不支持的功能。是的。Bayonetta 3
这个故事围绕着 OpenGL 函数展开,该函数根据提供的角度在多个 mipmap 级别上进行纹理查找,并返回单个纹素。textureGrad
好吧,Switch 的 Tegra X1 上基于 Maxwell 的 GPU 无法原生地为 3D 纹理执行此操作,因此它使用 SAM 和 RAM 指令进入和离开一种特殊模式,我们对此知之甚少——但我们知道它用于计算纹理获取的导数。
通过寻找这种指令模式,Blinkhawk 实现了对 中雾和云的初步支持。 byte[]后来修复了该实现,使其按照Blink最初的意图运行,并避免在Mesa和基于RDNA3的GPU(AMD Radeon RX 7000系列)上崩溃。Bayonetta 3
神秘迷雾(巴约内塔3)
Blinkhawk 不打算就此止步,还改进了在缓冲区缓存中丢弃不必要写入的逻辑,并改进了索引缓冲区(存储形成网格的顶点索引)大小的估计方式。 结果呢?中 的性能提升 69% 或更高,具体取决于系统规格。好。Bayonetta 3
阿拉,阿拉(巴约内塔3)
byte[] 发现 Yuzu 对 NVNflinger 的实现(负责呈现到屏幕的服务)缺少缩放模式选项“保留纵横比”。实现它可以解决其基本版本中的渲染问题。Gunvolt Chronicles Luminous Avenger iX
地狱是的,精灵!(Gunvolt Chronicles Luminous Avenger iX)
一位用户报告说,很久以前的未知更改导致不断崩溃。 byte[] 发现罪魁祸首隐藏在分配期间映射的对齐方式而不是释放,这是前 Skyline 模拟器开发人员章程最初发现的错误。回归解决,游戏稳定,案件结束。AI: THE SOMNIUM FILES
初级,我亲爱的用户(AI:SOMNIUM FILES)
最后,为了结束本节,与其说是图形代码更改,不如说是构建过程更改,vonchenplus 将 MoltenVK 作为外部依赖项添加到 yuzu 的 CMake 设置中,允许 Apple 用户在他们的 Vulkan 饥饿机器上构建 yuzu 时自动获取此翻译库的最新版本。(AGXV,有人吗?
让我们从简单的东西开始(勇者斗恶龙III救赎的种子)
正确跟上MoltenVK更新可以让macOS版本运行一些基本游戏,但要让禁果公司的设备跟上速度,还有很多工作要做。
OpenGL特定的改进,这也改进了Vulkan
没错,Mesa和NVIDIA Fermi/Kepler用户,轮到你得到一些爱了。Epicboy 回来了,它对启动这一切的旧经典 API OpenGL 进行了一些重大更改。
首先是针对OpenGL和Vulkan API的GPU ASTC解码的重大改革。基于计算着色器的解码器多个领域的代码优化将 Vulkan ASTC 解码性能提高了 60%,但它使 NVIDIA 上的 OpenGL 快了 15 倍,使其现在在解码 ASTC 纹理方面比 Vulkan 略快。
微妙的跳跃
留在 Vulkan 支持上的 GPU 现在可以在 、、 等游戏中享受更流畅的性能。The Legend of Zelda: Tears of the KingdomBayonetta 3Luigi’s Mansion 3
若要充分利用此更改,必须将该方法设置为 ,并且如果您使用的是 Vulkan,则应启用该方法。 这两个选项都可以在中找到。ASTC recompressionUncompressedEnable asynchronous presentationEmulation > Configure… > Graphics > Advanced
toastUnlimited后来阻止了Mesa的本机ASTC解码器,因为它现在比我们的实现慢得多。
最后,Epicboy 解决了在我们将 Vulkan 作为默认 API 之前玩家非常普遍的问题。 坐下吧,孩子们,故事时间到了。Pokémon Legends: Arceus
在不那么遥远的美好时光里,柚子只是在试验一个不完整和不成熟的 Vulkan 后端,没有 LDN/LAN 支持,Android 版本被认为是一个发烧的梦想。 当时我们默认使用 OpenGL API,在着色器后端的三个选项中,GLASM 是首选的着色器后端,因为它不会影响不兼容的驱动程序——它是 NVIDIA 独有的“功能”,任何其他驱动程序都会自动恢复到与供应商无关的 GLSL。 这为 NVIDIA 用户提供了当时最好的体验,以及最短的着色器构建时间,直到 Vulkan 改进到足以成为今天的完全替代品。
在这些迁移日子里,一个非常常见的报告是角色阴影是错误的——它要么给角色引入了奇怪的微尘,要么它们看起来完全没有任何形式的照明。 这个问题很快就被发现源于GLASM。Pokémon Legends: Arceus
由于GLASM过去和现在都几乎不可能工作,因为它完全缺乏调试和辅助开发的工具,因此在Rodrigo引入它之后,没有开发人员愿意接触它。当他后来离开去更绿色的牧场时,这导致我们的 GLASM 着色器后端变得完全无法维护。
好吧,进入 2023 年,Epicboy 卷起袖子开始工作。他发现问题在于GLASM如何处理转换反馈。通过实现对多个转换反馈缓冲区的支持,他不仅解决了 Switch 中唯一好的主 Pokémon 版本中的问题(作者的观点,你不能证明我错了),而且很可能是许多其他依赖转换反馈来渲染的现代 Switch 游戏。
对于Gamecube来说仍然不错的图形(神奇宝贝传奇:阿尔宙斯)
我们希望我们的勇士仍在摇摆永不消亡的GTX 400至700系列GPU从这些变化中受益。
天际线框架:第 3 部分
经过漫长的等待,对天际线框架的支持,随之而来的是对 ARCropolis 模组框架的支持终于落地了! 但我们正在超越自己。让我们看看 byte[] 是如何使这成为可能的。Super Smash Bros. Ultimate
作为实施称为 ASLR(地址空间布局随机化)的安全技术的一部分,可以在交换机上加载程序代码的大范围地址。 事实上,即使 Switch 只有 4 GB 的物理内存,可以虚拟映射程序代码的区域大小也可以高达 512GB。 程序不应假设它们在地址空间内的加载位置,因为它们可以在控制台上此范围内的任何位置移动。 事实证明,Skyline 框架要求程序不在区域一开始就加载,但 yuzu 总是在那里加载它,导致它可靠地崩溃。 byte[] 通过将代码加载地址进一步移动到 ASLR 区域,为其运行留出空间,从而解决了 Skyline 的这一限制。
柚子负责处理来自访客代码的服务呼叫的代码并不完全处于理想状态。 模拟器早期的一个特别烦人的问题是锁,它阻止服务对象接收来自不同会话的并发请求。 由于实现不正确(锁根本不应该存在),但许多现有的 yuzu 代码依赖于它,byte[] 反而避免只在对套接字接口的调用周围锁定,避免在 Skyline 的 TCP 记录器处于活动状态时出现死锁。 要一劳永逸地消除此服务锁,还有更多工作要做。
通过这些更改,Skyline框架可以运行,但是需要做更多的工作才能使ARCropolis启动并运行,并且Smash模组社区感到满意。 值得庆幸的是,byte[] 并没有止步于此,而是继续实现所需的更改。
ARCropolis 曾经在连接到 SSL/TLS 套接字时错误地启动握手,而没有先设置主机名。 这已经在 ARCropolis 的依赖项中得到了修复,但大多数用户还没有更新到更正后的版本,所以 yuzu 必须支持这种行为。
最后,yuzu 缺少对 HTML 手动模组的支持,所以 byte[] 也实现了对它的支持。
经过这几次修复后的最终结果是,Super Smash Bros. Ultimate的大多数模组现在都可以工作了!
永远的柚子炸鸡
还有罗宾。
这是 、 和实现的最后一部分。但在我们开始之前,我们必须解释一些事情。Project Y.F.C.Query Cache RewriteHost Conditional Rendering
为什么我们需要查询缓存?
许多 GPU 公开计数器,这些计数器用于从 GPU 执行的各种命令中收集数据,例如绘制了多少像素或生成了多少三角形。 游戏使用查询在需要使用这些计数器并将其加载到内存中。
Yuzu 的查询缓存负责跟踪 Switch 游戏的 GPU 计数器的值以及来自游戏的服务查询请求。
它的用途是什么?
一些游戏可以利用这些获取的数据来进一步优化其渲染。例如,使用称为遮挡剔除的常用技术优化其渲染的三角形数量。SUPER MARIO ODYSSEY
遮挡剔除是一项功能,当摄像机当前看不到对象时,该功能会禁用对象的渲染,因为它们在屏幕外或被其他对象遮挡(遮挡)。
在 中,游戏首先渲染简单的边界框,这些边界框覆盖将在屏幕上渲染的所有对象。 然后,它查询渲染到每个框的像素数,并且仅渲染其相应框具有任何像素的真实对象。SUPER MARIO ODYSSEY
同样,游戏使用像素计数来检查给定角色触摸的墨水。 游戏同时测试盟友墨水和敌人墨水,如果两个测试都失败,则角色不会站在任何墨水中。Splatoon
中孔(Splatoon 2)
发展与挑战
柚子已经有一个多年前开发的查询缓存。 但是,这种实现并不完美,并且存在许多问题。仅举几例:
它无法保存除像素计数之外的任何查询
它无法以正确的顺序写入内存
它不会使后来被其他查询类型覆盖的查询无效
我们的常驻 GPU 开发人员 Blinkhawk 着手重新设计查询缓存,以解决这些问题并使代码现代化。 但是,正如他后来发现的那样,这并不容易。
回想一下,查询缓存的工作原理是在主机 GPU 上运行查询。 事实证明,弄清楚如何使其在主机GPU上工作实际上是整个重写中最困难的部分,因为Switch GPU的功能与Vulkan等主机图形API公开的内容之间存在显着差异。
在开发过程中,Blinkhawk在Host GPU查询方面遇到了两大挑战。 首先,出于性能原因,我们无法在处理命令后立即向主机 GPU 提交命令。我们需要对它们进行批处理以获得任何合理的速度水平。这就引出了一个问题:我们什么时候需要执行查询并同步内存?
一旦您开始游戏,游戏就会开始进行查询以获取 GPU 计数器。 通常,结果是在计数完成后立即由 Switch 的 GPU 获得的——当渲染完成时。 但是像这样的游戏,它使用遮挡剔除,会进行很多查询。SUPER MARIO ODYSSEY
因此,如果我们尝试运行所有这些查询并以相同的方式在主机(用户)的 GPU 上写入结果,那么在绘制每个场景元素以写回计数器后,它会严重停止 GPU。
为了防止这种情况发生,每当游戏请求 GPU 等待命令完成渲染时,Blinkhawk 都会同步内存。这允许高效的批处理,以及在等待利用计数器值后发生的 GPU 命令。
转动镜头,整个城市神奇地消失了(超级马里奥奥德赛)
其次,在来宾(交换机)的GPU中,计数器可以随时重置,也可以根本不重置。 但是这种行为并没有在OpenGL和Vulkan等图形API中公开。 相反,这些 API 具有仅计算较小部分(例如单次绘制或多次绘制)的查询。 这意味着我们需要获取所有查询结果并汇总它们,尤其是在游戏从未重置计数器的情况下。
在旧的查询缓存中,我们习惯于在单个 GPU 线程上汇总所有查询结果,这无法跟上繁重的工作负载。 随着查询结果数量的增加,对它们求和所花费的时间也在增加。 这对于大约 50 或 80 个查询来说很好,但有些游戏可以轻松地在单个帧内进行数千个查询。
Blinkhawk尝试了几种不同的算法,最终确定了基于Hillis Steele扫描算法的实现。
结果呢?好吧,让以下列表不言自明:
里面的灯笼是固定的。Luigi’s Mansion 3
没有闪光弹(路易吉的豪宅3)
使用高 GPU 精度时,细节级别是固定的。不再有树木闪烁。Pokémon Scarlet & Violet
在某些Koei Tecmo游戏中渲染是固定的,当使用高GPU精度时。Marvel Ultimate Alliance 3: The Black Order
使用高 GPU 精度和禁用异步着色器构建时,会修复发光粒子。Xenoblade Chronicles 2 & 3
正确填充火焰时钟(异度之刃编年史3)
中的阴影是固定的。Metroid Prime Remastered
不是黑暗萨穆斯(银河战士总理重制版)
在使用主机条件渲染的游戏中,低端和/或功耗受限硬件的性能有所提高,例如、、、大多数Koei Tecmo游戏等。Pokémon Scarlet & VioletLuigi’s Mansion 3SUPER MARIO ODYSSEY
还有更多!
更多 GPU 更改
GPU 的变化并不止于此;还有很多内容要介绍。
让我们从一个令人惊讶的端口开始:本月登陆Switch和其他游戏机,随之而来的是专有RAGE引擎的新版本,为我们的开发人员提供了一些需要解决的怪癖。 你知道,新版本通常也是如此。Red Dead Redemption
动态GPU二人组(Blinkhawk和Maide)分析了游戏,并得出结论,最初渲染中断的原因是由于Vulkan上缺乏对蒙版深度模板清除的支持。
深度模具或深度和模板缓冲区的组合是一种将深度缓冲区和模具缓冲区组合到内存中的单个图像中的图像类型,从而加快 GPU 的测试以确定是否将绘制任何给定像素。
进一步详细说明:
深度缓冲区存储相机与当前最接近它的像素之间的距离,允许 GPU 确定哪些像素将被其他对象覆盖,因此不应绘制。
模板缓冲区更专业:它为每个像素存储一个字节,开发人员通常使用它来标记某些类型的对象。例如,可以为地面分配值 1,为树木和树叶分配值 2,为玩家分配值 17,依此类推。了解哪些像素属于哪些对象以应用各种效果非常有用。这是一个很棒的视频,展示了如何在 中使用模板缓冲区的示例。此视频中提到的材质遮罩缓冲区是模板缓冲区,用于防止效果应用于不需要的材质。The Legend of Zelda: Breath of the Wild
这些缓冲区的主要用途是正确渲染具有阴影、反射和透明度的场景。如视频示例所示,通过标记每个像素,许多类型的图形效果变得更加容易,因为这允许 GPU 根据像素的材质类型有条件地应用效果。
那么,为什么明确的操作在Vulkan上是一个问题呢? 在图形编程中,清除用于将缓冲区的所有数据重置为指定值。 Switch的NVN和OpenGL等图形API支持应用掩码来清除操作。 应用清除时,遮罩会更改图像的哪些位将受到影响:设置为 1 的位位置受清除的影响,设置为 0 的位位置将单独保留。 例如,如果游戏需要 4 位模具的上 8 位进行后续绘制,则它可以将掩码设置为 二进制 ,并清除值为 0 的模具。 这将导致仅清除较低的 4 位,而根据需要保留较高的 4 位。00001111
OpenGL 支持所有清除操作的遮罩,包括颜色、深度和模板缓冲区。 但是,Vulkan 旨在支持移动 GPU,而在移动 GPU 上,最有效的实现可能是在清除旧缓冲区时完全丢弃它。 这样可以避免从内存中读回缓冲区,而这种读取可能很昂贵。 因此,Vulkan 没有直接等同于蒙版清除,并且需要一次清除图像的整个“方面”(颜色、深度或模板)。
Red Dead Redemption在其模板缓冲区上使用遮罩清除。这就是为什么这个错误只影响草和灌木丛:游戏试图用面具保持这些值不变。 但是由于我们直接从游戏中将清除转换为 Vulkan 清除,我们只是擦除了整个模板缓冲区,在此过程中破坏了灌木和草的渲染。
我们为Vulkan提出的解决方案类似于我们之前为《女神异闻录5 Royal》使用的技巧:使用常规抽奖,而不是透明抽奖。 通过常规绘制,我们能够使用内置的硬件支持来应用模板蒙版,并产生与 OpenGL 相同的结果。
现有的新系统通过绘制全屏三角形来工作,这允许常规模板硬件处理屏蔽和缓冲区写入。多亏了这一点,Red Dead Redemption中草丛和灌木丛的渲染问题现在得到了解决。你好!您可以直接正确渲染到您的脸部,无论喜欢与否。
你有一些龙舌兰酒,然后胡安决定他是一个冒险家(荒野大镖客救赎)
Blinkhawk和Maide还发现了间接计算调度模拟方式的旧回归。 对于外行,间接调度是一种技术,用于允许 GPU 从另一个计算着色器或 GPU 操作生成的结果中获取需要执行的工作量,而不是在记录时由 CPU 传递。通过让 GPU 像这样独立地工作来避免较慢的 CPU 路径可以提高性能。 如此独立而强大的Tegra X1 GPU。看着它成长。
由于这种后期的干预,、、 现在渲染得更好了:Rabbids 系列中的阴影具有适当的阴影水平,现在可以看到《孤独之海》中的环境。Mario + Rabbids Kingdom BattleMario + Rabbids Sparks of HopeSea of Solitude
这个花了一段时间,嗯(马里奥+兔子王国之战和孤独之海)
《孤海》中的水需要模仿Tegra X1的其他非常棘手的方面,所以这是以后的功课。
正如麦德现在也了解到的那样,快速路径是一个古怪的女士。 她负责直接从 GPU 上传和下载图像数据,转换 CPU 和系统内存上的图像数据。 但是,它只有在满足适当条件时才能起作用。 如果你不小心翼翼地靠近她,你会在错误的地方、错误的时刻得到错误的数据。 这就是幸运,一个在Vulkan上崩溃的游戏,并在OpenGL上完全崩溃。Accelerated DMASid Meier's Civilization VI
罪魁祸首?未将目标缓冲区和/或映像标记为已修改,导致任何将来的读取都不会触发相应的下载。这导致游戏读取了错误的数据。快速路径的这一怪癖现已得到解决,并且添加了用于地址对给定图像格式无效的情况的 CPU 回退路径。策略迷现在可以尽情地互相攻击。 甘地说,和平从来都不是一种选择。
再转一圈(席德梅尔的文明VI)
对于我们有文化的玩家来说,Blinkhawk 和 byte[] 为我们带来了期待已久的修复。 它们涉及模拟交换机的 GPU 驱动程序如何模拟硬件不支持的功能。是的。Bayonetta 3
这个故事围绕着 OpenGL 函数展开,该函数根据提供的角度在多个 mipmap 级别上进行纹理查找,并返回单个纹素。textureGrad
好吧,Switch 的 Tegra X1 上基于 Maxwell 的 GPU 无法原生地为 3D 纹理执行此操作,因此它使用 SAM 和 RAM 指令进入和离开一种特殊模式,我们对此知之甚少——但我们知道它用于计算纹理获取的导数。
通过寻找这种指令模式,Blinkhawk 实现了对 中雾和云的初步支持。 byte[]后来修复了该实现,使其按照Blink最初的意图运行,并避免在Mesa和基于RDNA3的GPU(AMD Radeon RX 7000系列)上崩溃。Bayonetta 3
神秘迷雾(巴约内塔3)
Blinkhawk 不打算就此止步,还改进了在缓冲区缓存中丢弃不必要写入的逻辑,并改进了索引缓冲区(存储形成网格的顶点索引)大小的估计方式。 结果呢?中 的性能提升 69% 或更高,具体取决于系统规格。好。Bayonetta 3
阿拉,阿拉(巴约内塔3)
byte[] 发现 Yuzu 对 NVNflinger 的实现(负责呈现到屏幕的服务)缺少缩放模式选项“保留纵横比”。实现它可以解决其基本版本中的渲染问题。Gunvolt Chronicles Luminous Avenger iX
地狱是的,精灵!(Gunvolt Chronicles Luminous Avenger iX)
一位用户报告说,很久以前的未知更改导致不断崩溃。 byte[] 发现罪魁祸首隐藏在分配期间映射的对齐方式而不是释放,这是前 Skyline 模拟器开发人员章程最初发现的错误。回归解决,游戏稳定,案件结束。AI: THE SOMNIUM FILES
初级,我亲爱的用户(AI:SOMNIUM FILES)
最后,为了结束本节,与其说是图形代码更改,不如说是构建过程更改,vonchenplus 将 MoltenVK 作为外部依赖项添加到 yuzu 的 CMake 设置中,允许 Apple 用户在他们的 Vulkan 饥饿机器上构建 yuzu 时自动获取此翻译库的最新版本。(AGXV,有人吗?
让我们从简单的东西开始(勇者斗恶龙III救赎的种子)
正确跟上MoltenVK更新可以让macOS版本运行一些基本游戏,但要让禁果公司的设备跟上速度,还有很多工作要做。
OpenGL特定的改进,这也改进了Vulkan
没错,Mesa和NVIDIA Fermi/Kepler用户,轮到你得到一些爱了。Epicboy 回来了,它对启动这一切的旧经典 API OpenGL 进行了一些重大更改。
首先是针对OpenGL和Vulkan API的GPU ASTC解码的重大改革。基于计算着色器的解码器多个领域的代码优化将 Vulkan ASTC 解码性能提高了 60%,但它使 NVIDIA 上的 OpenGL 快了 15 倍,使其现在在解码 ASTC 纹理方面比 Vulkan 略快。
微妙的跳跃
留在 Vulkan 支持上的 GPU 现在可以在 、、 等游戏中享受更流畅的性能。The Legend of Zelda: Tears of the KingdomBayonetta 3Luigi’s Mansion 3
若要充分利用此更改,必须将该方法设置为 ,并且如果您使用的是 Vulkan,则应启用该方法。 这两个选项都可以在中找到。ASTC recompressionUncompressedEnable asynchronous presentationEmulation > Configure… > Graphics > Advanced
toastUnlimited后来阻止了Mesa的本机ASTC解码器,因为它现在比我们的实现慢得多。
最后,Epicboy 解决了在我们将 Vulkan 作为默认 API 之前玩家非常普遍的问题。 坐下吧,孩子们,故事时间到了。Pokémon Legends: Arceus
在不那么遥远的美好时光里,柚子只是在试验一个不完整和不成熟的 Vulkan 后端,没有 LDN/LAN 支持,Android 版本被认为是一个发烧的梦想。 当时我们默认使用 OpenGL API,在着色器后端的三个选项中,GLASM 是首选的着色器后端,因为它不会影响不兼容的驱动程序——它是 NVIDIA 独有的“功能”,任何其他驱动程序都会自动恢复到与供应商无关的 GLSL。 这为 NVIDIA 用户提供了当时最好的体验,以及最短的着色器构建时间,直到 Vulkan 改进到足以成为今天的完全替代品。
在这些迁移日子里,一个非常常见的报告是角色阴影是错误的——它要么给角色引入了奇怪的微尘,要么它们看起来完全没有任何形式的照明。 这个问题很快就被发现源于GLASM。Pokémon Legends: Arceus
由于GLASM过去和现在都几乎不可能工作,因为它完全缺乏调试和辅助开发的工具,因此在Rodrigo引入它之后,没有开发人员愿意接触它。当他后来离开去更绿色的牧场时,这导致我们的 GLASM 着色器后端变得完全无法维护。
好吧,进入 2023 年,Epicboy 卷起袖子开始工作。他发现问题在于GLASM如何处理转换反馈。通过实现对多个转换反馈缓冲区的支持,他不仅解决了 Switch 中唯一好的主 Pokémon 版本中的问题(作者的观点,你不能证明我错了),而且很可能是许多其他依赖转换反馈来渲染的现代 Switch 游戏。
对于Gamecube来说仍然不错的图形(神奇宝贝传奇:阿尔宙斯)
我们希望我们的勇士仍在摇摆永不消亡的GTX 400至700系列GPU从这些变化中受益。
天际线框架:第 3 部分
经过漫长的等待,对天际线框架的支持,随之而来的是对 ARCropolis 模组框架的支持终于落地了! 但我们正在超越自己。让我们看看 byte[] 是如何使这成为可能的。Super Smash Bros. Ultimate
作为实施称为 ASLR(地址空间布局随机化)的安全技术的一部分,可以在交换机上加载程序代码的大范围地址。 事实上,即使 Switch 只有 4 GB 的物理内存,可以虚拟映射程序代码的区域大小也可以高达 512GB。 程序不应假设它们在地址空间内的加载位置,因为它们可以在控制台上此范围内的任何位置移动。 事实证明,Skyline 框架要求程序不在区域一开始就加载,但 yuzu 总是在那里加载它,导致它可靠地崩溃。 byte[] 通过将代码加载地址进一步移动到 ASLR 区域,为其运行留出空间,从而解决了 Skyline 的这一限制。
柚子负责处理来自访客代码的服务呼叫的代码并不完全处于理想状态。 模拟器早期的一个特别烦人的问题是锁,它阻止服务对象接收来自不同会话的并发请求。 由于实现不正确(锁根本不应该存在),但许多现有的 yuzu 代码依赖于它,byte[] 反而避免只在对套接字接口的调用周围锁定,避免在 Skyline 的 TCP 记录器处于活动状态时出现死锁。 要一劳永逸地消除此服务锁,还有更多工作要做。
通过这些更改,Skyline框架可以运行,但是需要做更多的工作才能使ARCropolis启动并运行,并且Smash模组社区感到满意。 值得庆幸的是,byte[] 并没有止步于此,而是继续实现所需的更改。
ARCropolis 曾经在连接到 SSL/TLS 套接字时错误地启动握手,而没有先设置主机名。 这已经在 ARCropolis 的依赖项中得到了修复,但大多数用户还没有更新到更正后的版本,所以 yuzu 必须支持这种行为。
最后,yuzu 缺少对 HTML 手动模组的支持,所以 byte[] 也实现了对它的支持。
经过这几次修复后的最终结果是,Super Smash Bros. Ultimate的大多数模组现在都可以工作了!