当 Unity 在构建的应用程序中首次使用着色器变体时,场景可能会卡顿。这是因为 Unity 和图形驱动程序需要编译着色器变体,并使用编译的着色器代码及其相关 GPU 状态创建一个管线状态对象 (PSO)。
要减少卡顿,请在首次需要着色器之前编译着色器并创建 PSO,以便图形驱动程序将它们缓存到磁盘上。这称为预热或预烘焙。通常在加载屏幕期间(应用程序启动时或加载场景时)进行预热。
注意:有些 API 是实验性的,尚未准备好用于生产。这些 API 和文档将来可能会被更改或删除。
要在 DirectX 12、Metal 或 Vulkan 上预热着色器,请使用实验性 GraphicsStateCollection API。此 API 收集项目在运行时使用的特定 GPU 状态,现代图形 API 需要这些状态来创建和缓存准确的 PSO。
请执行以下步骤:
GraphicsStateCollection.BeginTrace 和 GraphicsStateCollection.EndTrace 方法记录应用程序使用的着色器变体和 GPU 状态。.graphicsState 文件,请使用 GraphicsStateCollection.SendToEditor API。.graphicsstate 文件,然后使用 WarmUp 或 WarmUpProgressively API 预热着色器变体。这两个 API 都返回可用于异步预热着色器变体的 JobHandle 对象。应该为使用的每个图形 API 创建一个不同的 .graphicsstate 文件。
有关更多信息,请参阅 GraphicsStateCollection。
通过以下方式进行预热:
要预热着色器变体集合,请执行以下操作之一:
ShaderVariantCollection.WarmUp 在构建的应用程序启动时预热着色器变体。要检查 Unity 和图形驱动程序何时编译着色器并创建 PSO,请在性能分析器 (Profiler) 中搜索以下性能分析器标记:
Shader.CreateGPUProgram。CreateGraphicsGraphicsPipelineImpl。