版本:Unity 6 (6000.0)
语言:英语
修复卡顿或停滞
预热着色器

着色器加载

Unity 从您构建的应用程序中以以下方式加载已编译的着色器

  1. 当 Unity 加载场景场景包含您的游戏环境和菜单。可以将每个独特的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰,实质上是分段设计和构建您的游戏。 更多信息
    查看 术语表
    运行时资源时,它会将该场景或资源的所有已编译着色器在 GPU 上运行的程序。 更多信息
    查看 术语表
    变体加载到 CPU 内存中。
  2. 默认情况下,Unity 将所有着色器变体解压缩到 CPU 内存中的另一个区域。您可以控制着色器在不同平台上使用的内存大小
  3. Unity 第一次需要使用着色器变体渲染几何体时,Unity 会将着色器变体及其数据传递给图形 API 和图形驱动程序。
  4. 图形驱动程序会创建着色器变体的特定于 GPU 的版本,并将其上传到 GPU。

此方法可确保 Unity 和图形驱动程序在 Unity 需要之前,不会在 GPU 上处理和存储所有着色器变体。但是,图形驱动程序第一次创建特定于 GPU 的着色器变体时,可能会出现明显的停滞。

Unity 会缓存每个特定于 GPU 的着色器变体,以避免 Unity 再次需要该着色器变体时出现停滞。

当不再有任何对象引用着色器变体时,Unity 会从 CPU 和 GPU 内存中完全删除该着色器变体。

Unity 加载哪些着色器

Unity 只加载与平台的图形 API、硬件和图形层级兼容的已编译着色器。

如果 Unity 找不到所需的着色器变体(因为您或 Unity从构建的应用程序中剥离了着色器变体),Unity 会尝试选择类似的着色器变体。如果 Unity 找不到类似的着色器变体,它将使用洋红色的错误着色器

您可以启用严格的着色器变体匹配以阻止 Unity 尝试选择类似的着色器变体。

Unity 如何选择子着色器

如果着色器变体包含多个子着色器,Unity 会尝试选择并使用一个与以下所有内容兼容的子着色器

  • 平台的硬件。
  • 当前的ShaderLab 细节级别 (LOD)
  • 活动的渲染管线一系列操作,将场景的内容显示在屏幕上。Unity 允许您从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息
    查看 术语表

Unity 会按照以下顺序,在以下元素中搜索第一个兼容的子着色器

  1. 着色器中出现的子着色器顺序。
  2. 任何回退着色器对象Shader 类的实例,着色器对象是着色器程序和 GPU 指令的容器,以及告诉 Unity 如何使用这些程序和指令的信息。将它们与材质一起使用以确定场景的外观。 更多信息
    查看 术语表
    中的子着色器,按照它们在着色器对象中出现的顺序。

如果 Unity 找不到兼容的子着色器,它将使用洋红色的错误着色器。

您可以使用ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
查看 术语表
标签设置哪些子着色器与哪些硬件兼容。查看ShaderLab:为子着色器分配标签

检查 Unity 何时加载着色器

要检查着色器何时从序列化数据加载,请在分析器一个帮助您优化游戏的窗口。它显示了在游戏的各个区域花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑所花费的时间百分比。 更多信息
查看 术语表
中搜索以下分析器标记放在代码中以描述 CPU 或 GPU 事件,然后在 Unity 分析器窗口中显示。默认情况下添加到 Unity 代码中,或者您可以使用 ProfilerMarker API 添加自己的自定义标记。 更多信息
查看 术语表

  • Shader.ParseThreaded
  • Shader.ParseMainThread

其他资源

修复卡顿或停滞
预热着色器