none
Directx12 计算着色器 异常慢 RRS feed

  • 问题

  • 事情是这样的  我在尝试开发小引擎

    现在在搞后期效果 用计算着色器实现

    但是遇到了非常蛋疼的性能问题,渲染图形是正常的,但是用计算着色器非常慢,

    是绝对不正常的慢,我反复测试无果,用计算着色器将贴图复制到另外一个贴图  这最简单的操作 都会降低25%的帧率

    我的渲染过程是这样的

    我封装了一个资源类 把一个资源同时作为UAV SRV RTV使用

    我只用一个TYPE_DIRECT的COMMAND LIST来完成所有渲染

    先把模型按一般流程渲染到一个贴图(一堆DrawIndexedInstanced)

    这些操作是正常的,性能也正常 

    把贴图转换成SRV作为计算着色器的资源

    事先准备好的相同资源转换为UAV作为计算着色器的输出

    然后重新设置状态为计算状态  然后开始Dispatch

    再把资源状态转换回来

    这个时候 很玄学 他是成功运行的 输出也是正确的   但是性能非常非常低  帧率损失非常大 

    直接复制SRV到UAV都会降低25%的帧率 。复杂点的操作 直接个位帧率。

    开性能探查器的探查结果是 Dispatch后面的ResourceBarrier过分耗时了 

    我的理解其实ResourceBarrier的耗时也就是计算的耗时  我也测试了 耗时和分辨率几乎成正比

    我看微软的miniengine也是这样干的 但是miniengine工作得很好 我的就不正常

    我折腾了好久 始终没有找到原因 特来求教 先谢谢各位!

    2018年2月2日 13:44

答案

  • 问题终于解决  我的渲染方式并没有错
    问题在于Dispatch数量,我之前直接Dispatch全分辨率数量,直到我看到了这个古老的CS评测文章
    http://www.opengpu.org/forum.php?mod=viewthread&tid=2472&extra=&highlight=%E6%80%A7%E8%83%BD&page=1
    使用计算着色器 应该尽可能降低Dispatch数量,此贴终结!
    • 已标记为答案 LiaoLiJia 2018年2月13日 7:55
    2018年2月13日 7:54
  • 总结一下  

    要使计算着色器发挥性能,Dispatch数量(组数量)要与组线程数量 平衡。
    组数量过多会大幅度降低性能,通常全屏计算的情况下,XY组线程数量设为16,组数量除以16。
    在以前可以是32,但是现在着色器编译器限制每组线程量最高为768。

    这个问题耗费了我半个月时间,在各种书和教程上我都没有看到有 组数量对性能影响 的内容
    真是个大坑,希望遇到像我这样的问题的人能看到这个帖子,少走弯路
    • 已标记为答案 LiaoLiJia 2018年2月13日 8:25
    2018年2月13日 8:24

全部回复

  • 问题终于解决  我的渲染方式并没有错
    问题在于Dispatch数量,我之前直接Dispatch全分辨率数量,直到我看到了这个古老的CS评测文章
    http://www.opengpu.org/forum.php?mod=viewthread&tid=2472&extra=&highlight=%E6%80%A7%E8%83%BD&page=1
    使用计算着色器 应该尽可能降低Dispatch数量,此贴终结!
    • 已标记为答案 LiaoLiJia 2018年2月13日 7:55
    2018年2月13日 7:54
  • 总结一下  

    要使计算着色器发挥性能,Dispatch数量(组数量)要与组线程数量 平衡。
    组数量过多会大幅度降低性能,通常全屏计算的情况下,XY组线程数量设为16,组数量除以16。
    在以前可以是32,但是现在着色器编译器限制每组线程量最高为768。

    这个问题耗费了我半个月时间,在各种书和教程上我都没有看到有 组数量对性能影响 的内容
    真是个大坑,希望遇到像我这样的问题的人能看到这个帖子,少走弯路
    • 已标记为答案 LiaoLiJia 2018年2月13日 8:25
    2018年2月13日 8:24