管道状态对象( PSO )定义了在向 GPU 提交工作时硬件如何解释和渲染输入数据。 PSO 的正确管理对于系统资源的最佳使用和游戏的顺利进行至关重要。
建议:
- 在工作线程上异步创建 PSO 。
- PSO 创建是着色器编译和相关暂停发生的地方。
- 从具有通用着色器的通用 PSO 开始,这些着色器可以快速编译并稍后生成专门化。
- 这可以让您更快地启动和运行,即使您还没有运行最优化的 PSO 或着色器。
- PSO 之间共享的着色器将只编译一次。
- 避免运行时 PSO 编译,因为它们很可能会导致暂停。
- 驱动程序管理的着色器磁盘缓存可能会起到拯救作用。
- 使用 PSO 库。
- 尽可能对“不在乎”字段使用相同的合理默认值。
- 这为粒子群优化算法的重用提供了更多可能性
- 使用
/all_resources_bound / D3DCOMPILE_ALL_RESOURCES_BOUND
编译标志(如果可能的话)。- 编译器可以在优化纹理访问方面做得更好。
- 通过 PSO 和镶嵌使用来安排绘制调用。
- 请记住, PSO 创建是编译着色器和引入暂停的地方。
- 在使用 PSO 之前尽早异步创建 PSO 非常重要。
- 仔细处理 PSO 编译线程的线程优先级。
- 使用空闲优先级如果不急于防止游戏线程的速度减慢。
- 考虑在“匆忙”时暂时提高优先级
不推荐:
- 在同一命令队列上的计算和图形之间切换是非常必要的。
- 这仍然是一个重大的转变。
- 启用/禁用过度切换镶嵌。
- 这也是一个重量级的转变。
- 在使用 PSO 之前尽早异步创建 PSO 非常重要。
- 仔细处理 PSO 编译线程的线程优先级。
- 使用空闲优先级如果不急于防止游戏线程的速度减慢。
- 考虑在“匆忙”时暂时提高优先级
- 使用 FXC 在 DX12 中生成 DXBC 。
- 这导致额外的 DXBC 到 DXIL 的转换,增加了编译时间和 PSO 库的大小。
- 一次将大量(数十万) PSO 串行化到 PSO 库中的磁盘。
- 这可能会大大增加系统内存的使用量。
- 改为使用“错过并更新粒子群优化库”策略。
本文介绍了在 NVIDIA GPU 上使用管道状态对象时的最佳实践。要在应用程序中获得高性能且一致的帧速率,请参考高级 API 性能技巧。
鸣谢
感谢 Patrick Neil 和 Dhiraj Kumar 的建议和帮助。