UNITY_DOTS_INSTANCED_PROP 宏有 3 个变体:
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(PropertyType, PropertyName)UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(PropertyType, PropertyName)UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(PropertyType, PropertyName)您可以通过此类宏指定是否可以在编译时实例化属性。它允许访问宏(如 UNITY_ACCESS_DOTS_INSTANCED_PROP)扩展到更优化的代码,并可对低端平台产生重大影响。
以下是使用上述所有宏变体的 DOTS 实例化属性块的示例:
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(float4, Color)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(float4, SpecColor)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(float4, EmissionColor)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
Color 属性可以进行实例化,也可以不进行实例化。根据属性元数据高位以动态方式选择正确的加载路径。SpecColor 属性不可进行实例化。此声明不会在常量缓冲区中添加 uint32 字段。这相当于完全不声明任何内容。快速禁用属性实例化非常有用,无需修改代码的其他部分。EmissionColor 属性进行实例化。属性始终从 unity_DOTSInstanceData 缓冲区进行加载,访问属性时绝不会发出动态分支。默认情况下,UNITY_DOTS_INSTANCED_PROP 与 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED 相同。可通过取消“com.unity.render-pipelines.core\ShaderLibrary\UnityDOTSInstancing.hlsl”中的定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT 的注释来更改此默认行为。执行此操作时,定义将启用,UNITY_DOTS_INSTANCED_PROP 将与 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED 相同。
注意:取消对定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT 的注释时,可能需要清除库 (Library) 文件夹,确保着色器已正确重新编译。
在低端设备上,实例化属性可能会占用大量性能。例如,从 SSBO 加载可能会比从常规的常量缓冲区加载要慢得多。这是因为在许多低端设备上,此类缓冲区加载会通过纹理采样器,而常量缓冲区加载会使用更快的硬件,除非使用动态索引来访问缓冲区。实例化属性始终通过动态索引进行加载,因为它依赖属性元数据,这表示实例化属性在低端设备上始终会通过纹理采样器。为更好地优化低端设备项目,可以默认禁用属性实例化。要实现此操作,请启用 define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT,这会将属性实例化设置为默认禁用。完成此操作后,可以手动仅对所需属性启用属性实例化。