2023年8月进度报告
由...所写GoldenX86和CaptV0rt3x2023年9月13日
图图鲁~尤兹尔斯。你觉得上一份报告太短了吗?嗯,八月是全速前进!本月提供了重要的图形修复,开发人员围绕GPU限制工作,几个早该修复的文件系统修复,Skyline框架支持,一些Android和Apple的爱,等等!
永远的玉足炸鸡
还有罗宾。
这是最后一块关于Project Y.F.C.,的Query Cache Rewrite,以及的实现Host Conditional Rendering。但是在我们开始之前,我们必须解释一些事情。
为什么我们需要查询缓存?
许多GPU会公开计数器用于从GPU执行的各种命令中收集数据——比如绘制了多少像素或生成了多少三角形。游戏使用问题每当需要使用这些计数器时,就获取它们并将其加载到内存中。
yuzu的查询缓存负责跟踪Switch游戏的GPU计数器的值,并为游戏的查询请求提供服务。
它是用来做什么的?
一些游戏可以利用这些获取的数据来进一步优化它们的渲染。举个例子,SUPER MARIO ODYSSEY使用一种常用的称为遮挡剔除.
遮挡剔除是一项功能,当相机当前看不到对象时,该功能会禁用对象渲染,因为它们位于屏幕外或被其他对象遮挡(遮挡)。
在…里SUPER MARIO ODYSSEY,游戏首先渲染简单的边界框,这些边界框覆盖了将在屏幕上渲染的所有对象。然后,它查询渲染到每个框的像素数量,并且只渲染其对应框有任何像素渲染的真实对象。
同样的,Splatoon游戏使用像素计数来检查给定角色触摸的是谁的墨水。游戏测试盟友墨水和敌人墨水,如果两个测试都失败,则角色不会站在任何墨水中。
中井(Splatoon 2)
发展与挑战
yuzu已经有了一个多年前开发的查询缓存。然而,这种实现并不完美,存在许多问题。仅举几例:
除了像素计数之外,它不能保存任何查询
它未能以正确的顺序写入内存
它不会使后来被其他查询类型覆盖的查询无效
我们的常驻GPU开发人员,Blinkhawk,着手修改查询缓存以解决这些问题并使代码现代化。但是,正如他后来发现的那样,这并不容易。
回想一下,查询缓存通过在主机GPU上运行查询来工作。事实证明,弄清楚如何让它在主机GPU上工作实际上是整个重写过程中最困难的部分,因为Switch GPU的功能和Vulkan等主机图形API的功能之间存在巨大差异。
在开发过程中,Blinkhawk在主机GPU查询方面遇到了两大挑战。首先,出于性能原因,我们不能在处理命令后立即将其提交给主机GPU。我们需要对它们进行批处理,以获得任何合理的速度水平。这就引出了一个问题:我们什么时候需要执行查询和同步内存?
一旦你开始玩游戏,游戏就会开始查询以获取GPU计数器。通常情况下,在计数完成后,即渲染完成时,交换机的GPU会立即获得结果。但是像SUPER MARIO ODYSSEY,它使用遮挡剔除,使许多的问题。
因此,如果我们尝试运行所有这些查询并以相同的方式在主机(用户的)GPU上写入结果,则在绘制每个场景元素以写回计数器后,GPU将严重停滞。
为了防止这种情况发生,每当游戏请求GPU等待命令完成渲染时,Blinkhawk都会同步内存。这允许有效的批处理,以及在等待使用计数器值之后发生的GPU命令。
转动镜头,整个城市神奇地消失了(超级马里奥奥德赛)
由...所写GoldenX86和CaptV0rt3x2023年9月13日
图图鲁~尤兹尔斯。你觉得上一份报告太短了吗?嗯,八月是全速前进!本月提供了重要的图形修复,开发人员围绕GPU限制工作,几个早该修复的文件系统修复,Skyline框架支持,一些Android和Apple的爱,等等!
永远的玉足炸鸡
还有罗宾。
这是最后一块关于Project Y.F.C.,的Query Cache Rewrite,以及的实现Host Conditional Rendering。但是在我们开始之前,我们必须解释一些事情。
为什么我们需要查询缓存?
许多GPU会公开计数器用于从GPU执行的各种命令中收集数据——比如绘制了多少像素或生成了多少三角形。游戏使用问题每当需要使用这些计数器时,就获取它们并将其加载到内存中。
yuzu的查询缓存负责跟踪Switch游戏的GPU计数器的值,并为游戏的查询请求提供服务。
它是用来做什么的?
一些游戏可以利用这些获取的数据来进一步优化它们的渲染。举个例子,SUPER MARIO ODYSSEY使用一种常用的称为遮挡剔除.
遮挡剔除是一项功能,当相机当前看不到对象时,该功能会禁用对象渲染,因为它们位于屏幕外或被其他对象遮挡(遮挡)。
在…里SUPER MARIO ODYSSEY,游戏首先渲染简单的边界框,这些边界框覆盖了将在屏幕上渲染的所有对象。然后,它查询渲染到每个框的像素数量,并且只渲染其对应框有任何像素渲染的真实对象。
同样的,Splatoon游戏使用像素计数来检查给定角色触摸的是谁的墨水。游戏测试盟友墨水和敌人墨水,如果两个测试都失败,则角色不会站在任何墨水中。
中井(Splatoon 2)
发展与挑战
yuzu已经有了一个多年前开发的查询缓存。然而,这种实现并不完美,存在许多问题。仅举几例:
除了像素计数之外,它不能保存任何查询
它未能以正确的顺序写入内存
它不会使后来被其他查询类型覆盖的查询无效
我们的常驻GPU开发人员,Blinkhawk,着手修改查询缓存以解决这些问题并使代码现代化。但是,正如他后来发现的那样,这并不容易。
回想一下,查询缓存通过在主机GPU上运行查询来工作。事实证明,弄清楚如何让它在主机GPU上工作实际上是整个重写过程中最困难的部分,因为Switch GPU的功能和Vulkan等主机图形API的功能之间存在巨大差异。
在开发过程中,Blinkhawk在主机GPU查询方面遇到了两大挑战。首先,出于性能原因,我们不能在处理命令后立即将其提交给主机GPU。我们需要对它们进行批处理,以获得任何合理的速度水平。这就引出了一个问题:我们什么时候需要执行查询和同步内存?
一旦你开始玩游戏,游戏就会开始查询以获取GPU计数器。通常情况下,在计数完成后,即渲染完成时,交换机的GPU会立即获得结果。但是像SUPER MARIO ODYSSEY,它使用遮挡剔除,使许多的问题。
因此,如果我们尝试运行所有这些查询并以相同的方式在主机(用户的)GPU上写入结果,则在绘制每个场景元素以写回计数器后,GPU将严重停滞。
为了防止这种情况发生,每当游戏请求GPU等待命令完成渲染时,Blinkhawk都会同步内存。这允许有效的批处理,以及在等待使用计数器值之后发生的GPU命令。
转动镜头,整个城市神奇地消失了(超级马里奥奥德赛)