内容创建/渲染

高级 API 性能:管道状态对象

 

管道状态对象( 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 的建议和帮助。

 

Tags