在多个帧之间分配渲染

您可以将渲染工作负载分配到多个帧中,以减少渲染整个帧所需的工作量和时间。

要分配渲染工作负载,您可以:

使用 Progressive Rendering Viewport 2D 节点

使用 Progressive Rendering Viewport 2D 节点将渲染工作负载分配到多个帧中,以减少渲染整个帧所需的工作量和时间。

Kanzi 每 n 帧更新由 Progressive Rendering Viewport 2D 节点渲染的所有内容,其中 n 是 Progressive Rendering Viewport 2D 节点使用的渲染通道预设的子渲染通道数。

例如,如果 Progressive Rendering Viewport 2D 节点使用的 Group 渲染通道预设件具有四个子渲染通道,Kanzi 每四帧更新一次 Progressive Rendering Viewport 2D 节点渲染的内容。当您使用 Progressive Rendering Viewport 2D 节点渲染交互内容时,这可能会降低此类内容的响应速度。

当您将复杂及渲染密集型内容划分为偶数部分时,可以使用 Progressive Rendering Viewport 2D 节点来提高应用程序的渲染性能。

在 Progressive Rendering Viewport 2D 中,Kanzi 在一个帧中渲染一个渲染通道。为了防止帧率波动,将渲染分配到 Progressive Rendering Viewport 2D 节点使用的渲染通道中。要将渲染分配到均匀的部分,确保每个渲染通道渲染:

  • 边数大致相同的多边形

  • 复杂度相似的着色器

  • 大小相似的纹理

  • 数量相似的纹理

例如,使用 Progressive Rendering Viewport 2D 节点以不同的更新频率渲染内容。要以 60 fps 渲染部分内容,而其余内容以 30 fps 渲染,则所有内容的渲染时间必须在 16 ms 或更短(1000 ms / 60 fps = 16.6 ms)。如果渲染 60 fps 内容所需的最长时间为 10 ms,要以 30 fps 显示其余内容:

  1. 将您想以 30 fps 渲染的内容分成两部分或三部分,使每部分在 6 ms 或更短的时间内渲染。

    要以 60 fps 渲染您的 60 fps 内容,每帧的总渲染时间(包括 60 fps 和 30 fps 内容)不得超过 16.6 ms。

  2. 使用 Progressive Rendering Viewport 2D 节点渲染 30 fps 内容。

    如果将内容分成两部分,Kanzi 每两帧渲染整个 30 fps 内容。如果将内容分成三部分,Kanzi 每三帧渲染整个 30 fps 内容。

../../_images/progressive-rendering-viewport-2d-different-rendering-frequencies.svg

小技巧

将内容分成多个部分时,要了解渲染每个部分需要多少时间,应:

  1. 要显示 Performance HUD,可以:

  2. 隐藏您不想渲染的内容。在 Node Tree 中的 Kanzi Studio 中,选择您想要隐藏的节点,然后:

    • 按下 Ctrl H。

    • 在 Properties 中,添加并禁用 Node > Visible 属性。

通过完成教程学习如何使用 Progressive Rendering Viewport 2D 节点。请参阅 教程:渐进式渲染。

../../_images/progressive-rendering-completed.gif

要使用 Progressive Rendering Viewport 2D 节点:

  1. 使用 Kanzi 过滤器或 Combine Object Source 项来收集您希望在多个帧中分配渲染的节点。请参阅 过滤器 (Filters) 和 使用对象源。

    例如,使用 Tag Filter 收集节点:

    1. 在 Node Tree 中,选择您想要跨多个帧渲染的节点。在 Properties 中,使用 Tags 属性标记在不同渲染通道中渲染的节点。请参阅 使用标签。

      例如,要将渲染分为两部分:

      1. 为您希望使用第一次渲染通道渲染的节点打上标签 Pass 1。

      2. 为需要使用第二次渲染通道渲染的节点打上标签 Pass 2。

    2. 在 Library 中,按 Alt 并右键单击 Rendering,并根据您在上一步中标记节点的标签创建相应数量的 Tag Filter 过滤器。在 Properties 中,将 Included Tags 属性设置为您希望通过该 Tag Filter 收集的标签。

      例如,将第一个 Tag Filter 过滤器命名为 Tag Filter Pass 1,并在 Properties 中,将 Included Tags 属性设置为 Pass 1。

      ../../_images/distibuting-rendering-filters.png ../../_images/tag-filter-pass-1.png
  2. 在 Library > Rendering 中,按 Alt 并右键单击 Render Pass Prefabs,然后创建 Progressive Rendering Viewport 2D 节点用于渲染其内容的 Group 渲染通道预设件。

    ../../_images/create-group-render-pass.png
  3. 在 Library 中,在您于上一步中创建的 Group 渲染通道中 按 Alt 并右键单击:

    1. Clear 渲染通道

    2. 为您在第一步中创建的每个节点集合创建一个 Gather Lights 渲染通道,并在其中创建一个 Draw Objects 渲染通道

    ../../_images/distributing-rendering-render-passes-in-library.png
  4. 在 Library 中,选择您在上一步中创建的每个 Draw Objects 渲染通道。在 Properties 中,将 Object Source 属性设置为收集您希望此渲染通道渲染的节点的过滤器或 Combine Object Source 项。

    例如,选择第一个 Draw Objects 渲染通道,并将 Object Source 属性设置为 Tag Filter Pass 1。

    ../../_images/draw-objects-render-pass-object-source.png
  5. 在 Node Tree 中,创建一个 Progressive Rendering Viewport 2D 节点。在 Properties 中,将 Render Pass Prefab 属性设置为 Group 渲染通道。

    您将 Kanzi 设置为使用 Group 渲染通道预设件渲染 Progressive Rendering Viewport 2D 节点。

    ../../_images/render-pass-prefab-set-to-group-render-pass.png
  6. 在 Node Tree 中,将您在第一步中收集的内容添加到 Progressive Rendering Viewport 2D 节点。

  7. 在 Library 中,在 Clear 渲染通道中添加并设置 Clear Color 0 属性,以生成有意义的颜色输出,包括 alpha 通道。

    ../../_images/clear-render-pass-with-clear-color-set.png

通过渐进渲染使用动画

您无法使用 Animation Player 或状态转换来在 Progressive Rendering Viewport 2D 节点中为节点设置动画。

要将动画用于渐进渲染:

  1. 在 Node Tree 中选择一个 Progressive Rendering Viewport 2D 节点,您要在其中使用动画。

  2. 在 Properties 中,将 Timeline 属性设置为您要使用的 Animation、Animation Clip 或 Timeline Sequence。

对由 Progressive Rendering Viewport 2D 节点渲染的内容应用抗锯齿。

要将抗锯齿应用于由 Progressive Rendering Viewport 2D 节点渲染的内容, 在 Node Tree 中选择 Progressive Rendering Viewport 2D 节点, 在 Properties 中添加 Multisample Level 属性,并将其设置为您要使用的抗锯齿采样数。

请参阅您要在其上运行 Kanzi 应用程序的设备文档以获取支持的值,因为抗锯齿样本的数量取决于设备。如果将 Multisample Level 属性设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

../../_images/progressive-rendering-viewport-2d-in-project-step-3.png ../../_images/progressive-rendering-multisample-level.png ../../_images/car-without-multisampling.png ../../_images/car-with-multisampling.png

Progressive Rendering Viewport 2D 属性类型和消息。

有关 Progressive Rendering Viewport 2D 节点的可用属性类型和消息的列表,请参阅 Progressive Rendering Viewport 2D。

分配合成目标的渲染

要减少每帧的渲染工作负载,您可以设置 Kanzi 更新 Composition Target 渲染通道的合成目标的频率。

要分配合成目标的渲染:

  1. 在 Library > Rendering > Render Pass Prefabs 中,选择您用于将内容渲染到合成目标的 Composition Target 渲染通道。请参阅 将内容渲染到一个合成目标、将内容渲染到多个合成目标 和 渲染到纹理。

    ../../_images/composition-target-render-pass-in-compose-and-blit-pass.png
  2. 在 Properties 中,添加并设置:

    • Render Pass > Update Rate 为您希望更新 Composition Target 渲染通道所渲染内容的频率:

      • 要在每帧更新内容,请设置为 1。这是默认值。

      • 要每隔一帧更新内容,请设置为 2;要每隔四帧更新内容,请设置为 4,以此类推。

      • 要仅渲染一次内容,请设置为 0。

    • Render Pass > Update Rate Offset 到您想要偏移渲染速率的帧数。

      通过这种方式,您可以将多个渲染通道的渲染分配到不同的帧。

      例如,如果您有两个 Composition Target 渲染通道,其内容每隔一帧更新一次,请在其中一个渲染通道中将 Update Rate Offset 设置为 1。这样,Kanzi 会在交替的帧中更新这些渲染通道渲染的内容。

    小技巧

    要在使用相同渲染通道预设的多个 Viewport 2D 节点中将 Update Rate 和 Update Rate Offset 属性设置为不同的值,您可以自定义该渲染通道预设的实例。请参阅 自定义渲染通道的实例。

    ../../_images/properties-update-rate.png

分配立方体贴图反射的渲染

要减少每帧渲染工作负载的数量,您可以设置 Kanzi 更新的频率:

  • Cubemap 渲染通道渲染的内容。

  • Cubemap 渲染通道将其内容渲染到的立方体贴图纹理中的面。

要分配立方体贴图反射的渲染

  1. 在 Library > Rendering > Render Pass Prefabs 中,选择您用于渲染立方体贴图反射的 Cubemap 渲染通道。请参阅 使用 Cubemap 渲染通道创建立方体贴图反射。

    ../../_images/cubemap-render-pass-in-library.png
  2. 在 Properties 中,添加并设置:

    • Render Pass > Update Rate 为您希望更新 Cubemap 渲染通道所渲染内容的频率:

      • 要在每帧更新内容,请设置为 1。这是默认值。

      • 要每隔一帧更新内容,请设置为 2;要每隔四帧更新内容,请设置为 4,以此类推。

      • 要仅渲染一次内容,请设置为 0。

    • Face Update Rate 为您希望在 Cubemap 渲染通道的 Result Texture 中每帧更新的立方体贴图面数。

      Result Texture 包含 Cubemap 渲染通道将其自身及其子渲染通道渲染到的立方体贴图纹理。

      默认情况下,Kanzi 以您使用 Update Rate 属性设置的速率更新所有六个立方体贴图面。

      例如,当您将 Face Update Rate 设置为 3 并将 Update Rate 设置为 2 时,Kanzi 以此速率更新立方体贴图面:

      帧 (Frame)

      Cubemap faces

      n

      +x, -x, +y

      n + 1

      -

      n + 2

      -y, +z, -z

      n + 3

      -

      n + 4

      +x, -x, +y

      n + 5

      -

      n + 6

      -y, +z, -z

      n + 7

      -

    • Render Pass > Update Rate Offset 到您想要偏移渲染速率的帧数。

      通过这种方式,您可以将多个渲染通道的渲染分配到不同的帧。

      例如,当您将 Update Rate Offset 设置为 1 时,Kanzi 会在第 n + 1 帧更新第一个立方体贴图面。

    ../../_images/properties-cubemap-render-pass-update-rate.png

另请参阅

教程:渐进式渲染

过滤器 (Filters)

使用对象源

渲染最佳实践

将内容渲染到合成目标

创建立方体贴图反射

使用 Kanzi Studio 渲染通道预设