Performance 提高光线跟踪器性能

Performance 提高光线跟踪器性能,performance,graphics,d,raytracing,Performance,Graphics,D,Raytracing,我正在用D()编写一个相对简单的光线跟踪器/路径跟踪器,但即使进行了充分的优化,它仍然需要每个光线数千个处理器周期。我还能做些什么来加快速度吗?更一般地说,您知道光线跟踪的好的优化/更快的方法吗 编辑:这是我已经在做的 代码已经在高度并行地运行 临时数据以缓存效率高的方式进行结构化,并与16b对齐 分为32x32块的屏幕 目的阵列以这样的方式排列,即磁贴中的所有后续像素在存储器中是顺序的 执行基本场景图优化 对象的常用组合(框中的平面CSG)将替换为预优化对象 向量结构能够利用GDC的自动

我正在用D()编写一个相对简单的光线跟踪器/路径跟踪器,但即使进行了充分的优化,它仍然需要每个光线数千个处理器周期。我还能做些什么来加快速度吗?更一般地说,您知道光线跟踪的好的优化/更快的方法吗

编辑:这是我已经在做的

  • 代码已经在高度并行地运行
  • 临时数据以缓存效率高的方式进行结构化,并与16b对齐
  • 分为32x32块的屏幕
  • 目的阵列以这样的方式排列,即磁贴中的所有后续像素在存储器中是顺序的
  • 执行基本场景图优化
    • 对象的常用组合(框中的平面CSG)将替换为预优化对象
  • 向量结构能够利用GDC的自动向量化支持
  • 通过延迟求值发现光线上的后续命中;这可以防止对CSG进行不必要的计算
  • 三角形既不支持也不优先。仅限普通基本体,以及CSG操作和基本材质属性
  • 支持边界

    • 光线跟踪器速度的典型一阶改进是某种空间分割方案。仅基于您的项目大纲页面,似乎您还没有这样做

      最常用的方法可能是八叉树,但最好的方法可能是多种方法的组合(例如,空间分区树和邮件装箱等)。包围盒/球体测试是一种快速、廉价且令人讨厌的方法,但您应该注意两件事:1)它们在许多情况下没有多大帮助;2)如果您的对象已经是简单的基本体,您将不会获得太多(甚至可能会失去)。您可以更容易地(比八叉树)实现用于空间分区的规则网格,但它只适用于稍微均匀分布的场景(就曲面位置而言)

      这在很大程度上取决于所表示对象的复杂性、内部设计(即是否允许局部变换、对象的引用副本、隐式曲面等),以及您试图达到的精度。如果您正在编写一个具有隐式曲面的全局照明算法,则权衡可能与为网格对象或其他对象编写基本光线跟踪器有所不同。我还没有详细看过你的设计,所以我不确定你是否已经考虑过上面的内容


      与任何性能优化过程一样,您必须首先进行测量,以找到实际花费时间的地方,然后进行改进(根据偏好进行算法改进,然后根据需要进行代码修改)

      我根本不知道D,因此我无法查看代码并找到具体的优化,但我可以概括地说

      这取决于你的要求。最简单的优化之一就是减少任何特定光线可以跟随的反射/折射的数量,但随后您开始失去“完美结果”

      光线跟踪也是一个问题,因此如果您有资源(如多核处理器),可以考虑并行计算多个像素


      除此之外,您可能只需要分析并弄清楚到底是什么花费了这么长时间,然后尝试优化它。是交叉口检测吗?然后对代码进行优化,以此类推。

      我还能做些什么来加速它吗?

      D、 根据实现和编译器的不同,提出了相当好的性能。由于您还没有解释您正在使用的光线跟踪方法和优化,因此我无法在这方面给您提供太多帮助

      然后,下一步是对程序运行时序分析,重新编码程序集中最常用的代码或对性能影响最大的最慢的代码

      一般来说,请查看以下问题中的参考资料:

      我非常喜欢使用图形卡(一台大规模并行计算机)来做一些工作的想法

      该站点上还有许多其他与光线跟踪相关的资源,其中一些资源列在本问题的侧栏中,其中大部分资源可以在。

      一些建议中找到

      • 使用边界对象快速失败
      • 在第一步投影场景(就像普通图形卡一样),并仅在光线计算中使用光线跟踪
      • 并行化代码

        • 我的第一个问题是-您是否在尝试优化单个静止屏幕的跟踪, 或者这是为了优化多个屏幕的跟踪以计算动画


          优化单个镜头是一回事,如果要计算动画中的连续帧,需要考虑/优化很多新事物。

          我从光线跟踪器中学到的一件事是,许多旧规则不再适用。例如,许多光线跟踪算法都会进行大量测试,以从计算成本高昂的计算中“提前退出”。在某些情况下,我发现消除额外的测试并始终运行计算直到完成要好得多。在现代机器上,算法速度很快,但错过分支预测的代价很高。通过使用最小的条件分支重写光线多边形相交测试,我的速度提高了30%

          有时候最好的方法是违反直觉的。例如,我发现当我将许多场景分解为大量较小的对象时,包含几个较大对象的场景运行速度要快得多。根据场景几何体的不同,这将允许空间细分算法抛出大量的相交测试。让我们面对现实,交叉测试只能这么快完成。您必须消除它们才能获得显著的加速

          等级bo