大多数浏览器和
Developer App 均支持流媒体播放。
-
基于 A11 的 Metal 2 - 光栅顺序组
光栅顺序组让各种 Metal 2 app 能够精准控制并行片段着色器线程访问相同像素坐标的顺序。了解 A11 如何通过支持多个组来扩展光栅顺序组,并新增用于访问线程组内存的功能。看看您可以如何改善单通道延期着色和顺序无关的透明渲染的性能。
资源
- Order Independent Transparency with Imageblocks
- Rendering a Scene with Deferred Lighting in Objective-C
- Tailor Your Apps for Apple GPUs and Tile-Based Deferred Rendering
相关视频
Tech Talks
-
下载
Raster Order Group 是 Metal 2 中一项全新的特性 我们进一步将它 特别为全新的 A11 GPU 进行了扩展 这个视频是 描述全新 A11 GPU 能力的五个视频之一 要想最大限度地理解好它 你需要观看先前的关于 Imageblocks 和图块着色器的视频
我会以一个关于 Raster Order Group 的简短回顾来开始 它在 Metal 2 已经可用 随后我们会继续进一步讨论全新 A11 的性能 Raster Order Group 是一个需要 GPU 去执行一部分片段着色器线程的特性 与其它重叠线程一起按序进行 这一顺序取决于 一个渲染通道中 Draw Call 的提交顺序 以及该 Draw Call 中每一个三角的顺序 重叠是取决于光栅器的 如果两个片段线程 以同一个帧缓冲器的 X 和 Y 位置 同一样本和同一层级为目标时 将被认为发生了重叠 例如 两个片段线程 如果同时对同一深度缓冲样本进行深度测试 即认为它们会重叠 这是一个典型的双三角案例 蓝色三角在前 绿色三角在后 对于传统图形帧缓冲的访问 混合一直是 GPU 会按序执行的一件事 GPU 不会突然混合 在后面的这个绿色三角 这是由于每一帧都安排了变化 但片段着色器 会同时且无序执行 在没有 Raster Order Group 的情况下 任务会在片段着色完成后 混合之前 才会按序执行 但如果你没有要向帧缓冲器中混合呢 近来 许多图形算法开发 都尝试依据你的片段着色器 创建更多有趣的数据结构 比如 为更好的后期处理或顺序独立透明 而生的多层编码技术 还有体素化 以及特定目的混合功能 所有这些都是基于片段着色器建立的 它们将数据存储于内存里 自定的数据结构中 而不是仅仅将颜色混合到输出纹理中 但如果从你的片段着色器主体 直接访问内存 能够以任何顺序 在任何时间同时发生 这是限制性非常大的 处理这些数据竞争导致了 那些算法的现有实现的代价 相比于在其他情况下 要昂贵得多
我们真正想要的 是得到那种类混合顺序的行为模式 但不是在片段着色器之后 而是在其中进行 我们实际上想要的是 我们的内存访问在按序连续进行的假象 这就是 Raster Order Group 所做的事 通过 Raster Order Group 可以让你把指针注释到内存里 通过那些指针的访问 是在一个前像素提交顺序中完成的 硬件在当前线程被允许继续进行之前 会等待任何旧有的 与当前线程重叠的 片段着色器线程完成 这实际上给你提供了互斥性 但更优越 它提供有序互斥性 你会知道哪一个线程将会 首先进入关键部分 以及接下来是哪一个 这一特性在 WWDC 2017 中已经详细介绍过了 具体是在介绍 Metal 2 的会议中 所以如果你想更深入地了解 你可以去看那个视频 那么我们了解完了基础部分 我们继续看一看 A11 GPU 中有什么新东西 Raster Order Group 在 A11 中 更加有用 更加强大 并且性能更好 首先 A11 会展现出 GPU 内部图块内存 比如在设备和纹理访问时 图块内存会变得更加有用 如果你可以以一个可预计顺序访问它 那么 Raster Order Group 现在也可以应用到图块内存 其次 当 Raster Order Group 在其他 GPU 上 被限制到每像素只有一个互斥体 A11 可以将细粒度可以控制得更好 使得更细腻的修饰成为可能 并且降低了 线程等待访问的频次 我要给你们看一些例子 来演示如何使用这些功能 来在某些常见的图形算法中 解锁全新的性能表现
第一个例子是经典延迟渲染 在传统 GPU 上 延迟渲染是分两步完成的 首先填充一个 G-Buffer 并输出多个纹理 接下来 二次渲染通道会读取这些纹理 渲染光体积 并计算渲染结果 但延迟渲染 往往会消耗许多内存带宽 我们的 A-series GPU 的优势之一 就是在芯片上保持尽可能多的带宽 消除这些中间过渡纹理 通过将两步合二为一 使用 GPU 中的 Imageblock 将 G-Buffer 完整地保持在图块大小的区块中 这两个任务都变成了一个渲染过程中的不同阶段 你可以在 A11 Imageblock 和图块着色的视频中更深入地了解 如何建立这些合并的渲染过程 这些视频重点介绍了 “同步”这个方面 单通道延迟渲染的性能表现 通过借用多个 Raster Order Group 会变得更佳 为了了解一下它 我们来深入看一些第二阶段的细节 光照 我们的基本光照处理 从绘制一个包含光照影响的卷标开始 它衍生出片段着色器线程 每一个线程都会 将一束光对应到一个像素中 我们的光照线程通过读取 G-Buffer 字段开始 在 A-series GPU 上 你会想要直接从 Imageblock 中读取这些 这是目前最快的内存 接下来你要执行已选定的渲染模型 这包含了相当多的数学运算 需要一定的时间来执行 最后 你需要回到 Imageblock 求和这一光照的作用量 这是非常快捷的一步 然后我们还有第二光照 由第二线程所应用 对于单步延迟渲染而言 在 A11 之前它看起来是这样的 你可以看到这一排序 是强加在最开始的 Imageblock 读取上的 迫使这两个光照的整个执行过程 按序连续进行 这是因为 GPU 仅仅支持单一 Raster Order Group 需要在访问任何后续线程开始之前 等待前一线程的所有访问完成 它甚至可以用于两个访问都是读取的情况 而且互不影响 A11 对于 Raster Order Group 的支持 消除了过同步 多组使你能够同时执行 这些不冲突的读取 并且只在累积结果的着色器的 简短的结尾部分同步
要做到这一点 你可以通过将我们的三个 G-Buffer 字段 添加到同一组中 将累积光照结果添加到第二组中 硬件现在可以对它们分开发出指令 一组中未完成的写入过程 不需要让另一组中的读取过程做出等待 同一组中的多个读取过程 不需要互相等待 这意味着更多的线程 可以在给定时间内运行 使得更多的平行性操作和更好的性能变得可能 远远超出你所现有的性能 也就是从开始就将你的 G-Buffers 置于片上状态 代码是非常简单的 我的三个 G-Buffer 字段 是同时读写的 我会给它们全部做注释并放入组 0 中 累计器是要在另一时间读写的 所以我会将它注释到组 1 中 只要确定采用后一切就差不多了 Raster Order Group 是一个非常容易上手的功能 在第二个李在中 我会通过添加其他阶段进去 将延迟渲染的例子做的更复杂一些 在我有了一个我的不透明内容的简化版本后 我要将一个透明阶段添加到其中 进一步渲染 并试图遵循从后到前的混合顺序 以 A11 一个非常擅长的方法去做这件事 就是使用我们的 Imageblock 来存储一个颜色和深度成对的数列 每个前向着色片段都向这一数列添加一个条目 来处理溢出 在我图块的结尾部分 我会排序然后混合从后到前 使用已存储的深度 启用从后至前混合 这条时间线从头到尾显示了一个图块的处理过程 从左到右是它的 Imageblock 我一开始通过 A11 的 Imageblock 展示了延迟渲染 然后我要以着色不透明色彩结束 在最后 我有这一透明阶段 在这里我要将我的颜色和深度数列 建立并排序 在每一通道中 Raster Order Group 将会控制 在片段线程之间多少平行性是可行的 出于性能表现的原因 我真的很希望这两个操作 成为一个渲染通道 我并不想将任何东西存在设备内存中 以便在过后的渲染中重新读取 但是 Imageblock 在我的场景的第一和第二部分之间 是非常不同的 无论是数据类型 还是 Raster Order Group 的分配任务 A11 可以将这一转变通过一步完成 要消除这两个阶段之间的差异 你需要在之间加入一个 图块着色器 图块着色器是一个线程组 可以访问整个图块 内存和 Imageblock 图块着色器的行为模式是 它们不会在所有前序 片段着色器 线程完成之前启动 与 Raster Order Group 的声明无关 这使你确定 这一 图块着色线程组 对于内存有特定访问 有了 图块着色器 你可以对整个 图块 进行读写 按你的期望重新设定格式 并且 可以通过它旧有的输出类型从 Imageblock 中读取 并且使用它新的类型 重新初始化 Imageblock 的内容 正如 图块着色器在开始执行之前 有一个完全屏障一样 在它们执行之后也有一个完全屏障 不会有后续的片段着色器线程 去访问内存 直到 图块着色器彻底完成 这与你在后续阶段如何设定 Raster Order Group 无关 这意味着你可以相信在透明任务开始之前 这一初始化设定可以完成
它的需求很简单 如果你想重新安排你的 Imageblock 内容 或者改变 Raster Order Group 所保护的字段 你需要在其中放置一个图块着色器 来确保这一转换过程有序且安全 我们为 A11 发布的一些样本代码 实际展示了这些序列
那么这以上这些就是关于如何在 A11 上 使用 Raster Order Group 的扩展能力 你们已经看过 Raster Order Group 在 A11 上相比于在其他 GPU 上是怎样的灵活 硬件支持多组工作 这可以消除过同步的问题 并提高性能表现 它们协同工作 有着 A11 的片段着色器对于图块内存的访问 你可以使用图块着色器来彻底改变 你 Imageblocks 的特性 包括在你的渲染通道中的 Raster Order Group 配置 将这些整合在一起 使你能够在 A11 上工作 在带宽方面非常宽裕 且性能表现优异
要了解更多关于 Metal 2 和 A11 的信息 以及样本代码的链接 请访问 Metal 开发者页面 感谢你的观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。