渲染最佳实践

通过优化渲染性能,您可以显著提高应用程序的性能。

Kanzi 渲染节点如下:

  • 渲染并变换位于屏幕之外的节点。

  • 将 Blend Intensity 属性设置为 0 的 3D 节点将被渲染。

  • 禁用 Visible 属性的 3D 节点不会被渲染或变换。

  • 将 Opacity 属性设置为 0 的 2D 节点不会被渲染,其子节点也不会被渲染,但会被转换。

  • 禁用 Visible 属性的 2D 节点不会被渲染,其子节点也不会被渲染,但会被转换。

优化应用程序的渲染性能

要优化您应用程序的渲染性能:

  • 包含很多片段计算的着色器可能是渲染过程中最重要的部分。请参阅 优化片段着色器。

  • 当由于场景发生变化而重新计算布局时,可能会导致 CPU 的性能下降。请参阅 优化布局的渲染。

  • 当属性类型启用 Affect Layout 并且此类属性的值在节点上发生变化时,Kanzi 会重新计算该节点的布局。确保仅在需要时重新计算布局。例如,每帧重新计算布局会降低应用程序性能。Affect Layout 在仅影响布局的 Kanzi 属性中启用。对于自定义属性类型,您可以设置它们是否影响布局。请参阅 创建属性类型。

  • 将渲染负载分配给多个帧,以减少渲染一个完整帧所需的工作量和时间。请参阅 在多个帧之间分配渲染。

  • 过度绘制会增加填充率,因而降低 GPU 性能。请参阅 使用 Sorting Filter 防止过度绘制。。

  • 当渲染不透明的内容时,请始终按照从前到后的顺序进行渲染。只有在有充分理由的情况下才从后到前进行渲染。

  • 由于透明节点的可视化依赖于具备支持它们的适当数据,为了正确求解混合方程,正确渲染透明节点,必须从后向前渲染。请参阅 渲染部分透明节点。

  • 如果节点呈现的顺序需要在着色器程序之间过多切换,则渲染速度会减慢。请参阅 减少着色器切换。

  • 当渲染大量兼容网格导致绘制调用数量过多时,请使用动态批处理来减少绘制调用的数量。动态批处理在重建批次时会带来额外的 CPU 处理开销,因此当对象频繁创建或销毁时,请对目标场景进行剖析。请参阅 使用动态批处理。

  • 将每个渲染目标的第一个 Viewport 节点的渲染通道设置为清除所有缓冲区。

  • 确保将所有渲染目标最多只清除一次。

  • 请勿将任何渲染目标的颜色、深度或模具清除一次以上。

  • 移除重叠的背景画刷。例如,如果 RootPage 节点设置了背景画刷,并且其子节点也设置了背景画刷,请从 RootPage 节点移除背景画刷。

  • 在移动时以较低质量渲染动画项目。提高性能,但降低质量。

  • 要动态更改 Text Block 节点中文本的大小,请使用 Render Transformation 或 Layout Transformation 属性的 Scale 属性字段,而不是 Font Size 属性。例如,当您想要在 Text Block 节点中为文本大小设置动画时,请使用此方法。使用 Font Size 属性动态缩放文本时,Kanzi 会为不同的字体大小创建多个纹理,并且不会从内存中释放它们。

  • 避免不必要的填充。例如,避免:

    • 用3D平面填充屏幕。例如,如果您使用3D平面仅通过在角落使用alpha 0的纹理来绘制圆形对象,在大多数情况下,如果您根据形状裁剪网格,由于填充率的影响,渲染速度会更快。

    • 在阿尔法设置为 0 的情况下渲染 3D。这会导致填充,但没有视觉效果。

  • 与其实时渲染效果,不如将效果烘焙到纹理中。例如,创建纹理来模拟阴影和景深。这样可以提高性能,但也会增加内存消耗。

查看渲染到纹理中的节点

在某些平台上,在帧缓冲对象之间切换可能会导致显著的性能下降。Kanzi 将节点渲染到纹理中的条件可能很复杂。例如,旋转、缩放或不透明度可能会导致渲染到纹理的发生。

要查看节点是否渲染到纹理中,并导致帧缓冲对象切换,请在 Preview 中单击 analyze-off-1 进入 Analyze 模式,右键单击 analyze-on-1,然后选择 Framebuffer objects。Preview 用透明的橙色条纹突出显示渲染到纹理中的图层。

另请参阅

优化片段着色器

优化布局的渲染

配置节点以实现高效渲染

在多个帧之间分配渲染

使用 Sorting Filter 防止过度绘制。

缓存 2D 节点

渲染部分透明节点

减少着色器切换

排除应用程序性能问题