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
时,你可能需要清除库文件夹以确保 着色器一种在 GPU 上运行的程序。 更多信息
请参阅 词汇表 正确重新编译。
在低端设备上,实例化属性会产生显著的性能成本。例如,从 SSBO 加载可能比正常常量缓冲区加载慢很多。这是因为在许多低端设备上,这种类型的缓冲区加载经过纹理采样器,而常量缓冲区加载除非使用动态索引访问缓冲区,否则使用更快的硬件。实例化属性始终使用动态索引加载,因为它依赖于属性元数据,这意味着它们在低端设备上始终通过纹理采样器。要更好地针对低端设备优化项目,您可以在默认情况下禁用属性实例化。要执行此操作,启用定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT
,这将设置属性实例化为默认禁用。完成此操作后,您随后可以仅针对需要它的属性手动启用属性实例化。