减少着色器切换

Kanzi 必须在每次渲染批次与前一个批次的着色器不同时切换着色器。因为材质可以有自己的顶点和片段着色器,在某些情况下,您的应用程序在渲染场景时必须多次切换着色器。

在 OpenGL 中,顶点和片段着色器各自编译成一个着色器程序,并在需要使用时发送到 GPU。GPU 一次只存储一个程序。在场景中的每种材质至少需要进行一次着色器切换。如果对象的呈现顺序需要频繁切换着色器程序,渲染速度可能会变慢。

您可以在 Kanzi Studio Preview Performance HUD 中查看着色器切换的数量,或在 Kanzi Engine API 中通过调用 Renderer::getShaderSwitchCount 查看。请参阅 排除应用程序性能问题。

着色器切换操作会降低应用程序的性能,因此请尽量减少着色器切换次数。要减少着色器切换:

  • 尽量多次使用相同的着色器。这种方法的缺点是它可能会增加 uniform 发送的次数。

  • 按材质类型渲染对象以提高性能。请参阅 按材质类型渲染节点。

按材质类型渲染节点

要按材质类型渲染节点:

  1. 在 Library 按 Alt 并右键单击 Rendering > Object Sources 中选择 Sorting Filter。

    ../../_images/create-sorting-filter.png
  2. 在 Properties 集中:

    • Source 到您要从中收集节点以进行过滤的源。 例如,要将您的过滤器应用于项目中的所有节点,请选择 Root Object Source。 您可以选择另一个过滤器的输出作为您收集节点以进行过滤的源。

    • Sorting Type 到 Material type 以按材质类型对节点进行分组。通过按材质类型对节点进行分组,您可以优化您的 Kanzi 应用程序,因为这样 Kanzi 可以减少着色器切换的次数。

    • 启用或禁用 Reverse Order 属性:

      • 当启用时,它会反转节点的当前顺序。

      • 当禁用时,它会保留节点的当前顺序。

  3. 在 Library > Rendering > Render Pass Prefabs 中创建一个 Group Render Pass,并在其中创建:

    • Clear Render Pass

    • Gather Lights Render Pass 和其中的 Draw Objects Render Pass

    ../../_images/render-passes-for-filters.png
  4. 在 Library 中,选择您创建的 Draw Objects Render Pass,并在 Properties 中将 Object Source 属性设置为您创建的过滤器或收集过滤器的对象源。

  5. 在 Node Tree 中,选择要应用过滤器的 Viewport 2D 节点,并在 Properties 中将 Render Pass Prefab 属性设置为其后代 Draw Objects Render Pass 使用您创建的过滤器作为其对象源的 Group Render Pass。

    ../../_images/render-pass-prefab-set-to-group-render-pass.png

    Kanzi Studio 渲染由过滤器收集的节点。

另请参阅

使用二进制着色器

优化片段着色器

并行加载资源

排除应用程序性能问题