您现在的位置是:首页 >技术交流 >Unity3D :运行时 UI 的性能注意事项网站首页技术交流

Unity3D :运行时 UI 的性能注意事项

yevtte2023 2024-06-26 06:01:03
简介Unity3D :运行时 UI 的性能注意事项

推荐:将 NSDT场景编辑器 加入你的3D工具链
3D工具集: NSDT简石数字孪生

运行时 UI 的性能注意事项

本页介绍如何提高运行时的性能用户界面
.

优化数据存储

您可以使用 usageHints 来设置元素在运行时的使用方式,以便相应地优化数据存储。例如:

visualElement.usageHints = UsageHints.DynamicTransform;

下表通过示例描述了要用于哪些元素的属性:

具有以下元素使用这个
频繁更改其位置或转换UsageHints.DynamicTransform如果更改 、 或元素,请在该元素上设置 UsageHints.DynamicTransformstyle.leftstyle.topstyle.position
许多经常更改位置或转换的子元素DynamicTransformUsageHints.GroupTransform在 ShaderGraph 中,每个节点都使用 ,在视图容器上设置 UsageHints.GroupTransformDynamicTransform
正在设置动画的内置样式颜色UsageHints.DynamicColor如果更改元素的 、 或任何边框颜色(如 ),请在该元素上设置 UsageHints.DynamicColorstyle.backgroundColorstyle.unityBackgroundImageTintColorstyle.borderLeftColor

考虑设备功能

一些安卓设备和WebGL
无法部分修补索引缓冲区。如果您的受众使用此类设备,或者如果您以 WebGL 为目标,UI 工具包呈现仍然有效,但性能可能会降低。为避免性能下降,请勿同时对太多元素进行动画处理,并在设备上进行配置文件。

避免网格镶嵌

构建的计算成本很高网孔
曲面细分视觉元素
.每当元素的大小(宽度/高度)发生变化时,其几何图形都会重新构建,这可能是动画或频繁调整大小的问题。

一般来说,变换和纹理在灵活性和重用方面并不是好的选择。但是,在制作动画时,为了获得更好的性能,请执行以下操作:

  • 使用变换而不是宽度或其他布局属性
  • 使用纹理或 2D精灵
    而不是圆角和边框

控制动态图集的纹理

要减少因纹理更改而中断的批次数并实现良好的性能,请使用图集将同时使用的纹理组合在一起。您可以使用以下任一方法实现此目的:

  • 使用精灵图集
    .使用此方法,您可以更好地控制精灵,但需要手动创建精灵图集。
  • 使用动态图集。UI 工具包会在视觉元素引用动态图集时自动向动态图集添加纹理或从中删除纹理。

验证动态图集中的纹理

使用动态图集将纹理组合在一起时,要限制绘制调用的次数,请确保纹理进入动态图集。若要验证,请使用帧调试器。帧调试器可帮助您观察纹理更改并推断批量中断。

以下示例验证动态图集是否包含运行时 UI 中的所有纹理。

示例动态图集窗口包含运行时 UI 中的所有纹理。

应用内置筛选器

动态图集纹理从指定的最小大小开始,并根据需要增长,水平或垂直加倍,直至指定的最大大小。您可以在面板设置资源中定义最小和最大图集大小。您还可以使用动态图集中的滤镜来决定是否向图集添加子纹理。

要启用或禁用滤镜,请在面板设置资源的检查器窗口中,从动态图集设置>活动滤镜下拉列表中选择选项。

使用自定义筛选器

您可以将自定义过滤器分配给 PanelSettings.dynamicAtlasSettings.customFilter 以在全局或每个纹理的基础上添加或放宽约束。

以下自定义筛选器示例绕过 Size 筛选器中的大纹理,同时使 Size 筛选器对其他纹理保持活动状态:

using UnityEngine;
using UnityEngine.UIElements;

class MyCustomFilter : MonoBehaviour
{
    public PanelSettings panelSettings;
    public Texture2D largeTexture;

    void OnEnable() { panelSettings.dynamicAtlasSettings.customFilter = Filter; }

    void OnDisable() { panelSettings.dynamicAtlasSettings.customFilter = null; }

    bool Filter(Texture2D texture, ref DynamicAtlasFilters filtersToApply)
    {
        if (texture == largeTexture)
        {
            // Disable the Size check for this one.
            filtersToApply &= ~DynamicAtlasFilters.Size;
        }
        return true;
    }
}

3D建模学习工作室整理翻译,转载请注明出处!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。