版本:Unity 6 (6000.0)
语言:English
着色器加载
创建着色器变体集合

预热着色器

当 Unity 首次在构建的应用程序中使用着色器在 GPU 上运行的程序。 更多信息
参见 术语表
变体时,场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲,将游戏分段设计和构建。 更多信息
参见 术语表
可能会出现卡顿。这是因为 Unity 和图形驱动程序需要编译着色器变体,并使用已编译的着色器代码及其相关的 GPU 状态创建管道状态对象 (PSO)。

为了减少卡顿,请在首次需要之前编译着色器并创建 PSO,以便图形驱动程序将其缓存到磁盘。这称为预热、预加载或预处理。通常在加载屏幕期间进行预热,例如应用程序启动时或加载场景时。

注意:某些 API 处于实验阶段,尚未准备好投入生产使用。这些 API 和文档将来可能会发生更改或被移除。

使用 DirectX 12、Metal 或 Vulkan 预热着色器

要在 DirectX 12、Metal 或 Vulkan 上预热着色器,请使用实验性 GraphicsStateCollection API。此 API 收集项目在运行时使用的特定 GPU 状态,现代图形 API 需要创建和缓存准确的 PSO。

请按照以下步骤操作

  1. 在构建应用程序的测试运行中,使用 GraphicsStateCollection.BeginTraceGraphicsStateCollection.EndTrace 方法记录应用程序使用的着色器变体和 GPU 状态。
  2. 要将记录的信息保存为 .graphicsState 文件,请使用 GraphicsStateCollection.SendToEditor API。
  3. 在最终项目中,加载 .graphicsstate 文件,然后使用 WarmUpWarmUpProgressively API 预热着色器变体。这两个 API 都返回 JobHandle 对象,您可以使用它们异步预热着色器变体。

您应该为使用的每个图形 API 创建一个不同的 .graphicsstate 文件。

有关更多信息,请参阅 GraphicsStateCollection

使用其他图形 API 预热着色器

请使用以下方法进行预热

  • 要预热着色器对象Shader 类的实例,着色器对象是着色器程序和 GPU 指令以及告知 Unity 如何使用它们的信息的容器。将它们与材质一起使用以确定场景的外观。 更多信息
    参见 术语表
    ,请使用 Experimental.Rendering.ShaderWarmup API。
  • 要预热当前内存中所有着色器对象的所有变体,请使用 Shader.WarmupAllShaders API。

要预热着色器变体集合,请执行以下任一操作

检查着色器是否已预热

要检查 Unity 和图形驱动程序何时编译着色器并创建 PSO,请在 Profiler一个帮助您优化游戏的窗口。它显示在游戏的各个区域花费的时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。 更多信息
参见 术语表
中搜索以下探查器标记放置在代码中以描述 CPU 或 GPU 事件,然后在 Unity 探查器窗口中显示。默认情况下添加到 Unity 代码中,或者您可以使用 ProfilerMarker API 添加您自己的自定义标记。 更多信息
参见 术语表

  • Shader.CreateGPUProgram 用于 Unity 创建着色器变体的特定于 GPU 的版本。
  • CreateGraphicsGraphicsPipelineImpl 用于 Unity 创建 PSO。

其他资源

着色器加载
创建着色器变体集合