提高光线跟踪器的性能

Fee*_*ure 18 graphics performance raytracing d

我在D(http://dsource.org/projects/stacy)中编写了一个相对简单的光线跟踪器/路径跟踪器,但即使进行全面优化,每条光线仍需要几千个处理器周期.我还能做些什么来加快速度吗?更一般地说,您是否知道光线跟踪的良好优化/更快的方法?

编辑:这就是我现在正在做的事情.

  • 代码已经高度并行运行
  • 临时数据以高效缓存方式构建,并与16b对齐
  • 屏幕分为32x32-tiles
  • 目标阵列以这样的方式排列,即图块中的所有后续像素在存储器中是顺序的
  • 执行基本场景图优化
    • 对象的常见组合(如框中的平面平面CSG)被预先优化的对象替换
  • 矢量结构能够利用GDC的自动矢量化支持
  • 通过懒惰评估找到后续的射线命中; 这可以防止对CSG进行不必要的计算
  • 三角形既不支持也不优先.仅限普通基元,以及CSG操作和基本材料属性
  • 支持边界

sim*_*mon 10

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

可能最常用的方法是八叉树,但最好的方法可能是方法的组合(例如空间分区树和邮箱等).边界框/球体测试是一种快速廉价且令人讨厌的方法,但你应该注意两件事:1)它们在许多情况下没有太大帮助; 2)如果你的对象已经是简单的原始体,你将不会获得太多(甚至可能输了).您可以更容易地(比八叉树)实现用于空间分区的常规网格,但它仅对于在某种程度上均匀分布的场景(就表面位置而言)非常有效

很大程度上取决于您所代表的对象的复杂程度,内部设计(即您是否允许局部变换,对象的引用副本,隐式曲面等),以及您尝试的准确程度.如果您正在编写具有隐式曲面的全局照明算法,那么权衡可能与您为网格对象或其他任何东西编写基本光线跟踪器时有所不同.我没有详细看过你的设计,所以我不确定你已经考虑过的上述内容,如果有的话.

像任何性能优化过程一样,您将首先必须先测量以找到您实际花费时间的位置,然后改进(通过优先级算法,然后根据需要编写代码)


Adr*_*thy 7

我用光线跟踪器学到的一件事是,很多旧规则不再适用了.例如,许多光线跟踪算法进行了大量测试以获得计算上昂贵的计算的"早期".在某些情况下,我发现消除额外测试并总是运行计算完成要好得多.算术在现代机器上很快,但错过的分支预测是昂贵的.通过用最小的条件分支重写它,我的光线 - 多边形相交测试的速度提高了30%.

有时最好的方法是违反直觉的.例如,我发现当我将它们分解成大量较小的对象时,许多具有几个大对象的场景运行得更快.根据场景几何图形,这可以允许您的空间细分算法抛出大量的交叉测试.让我们面对现实,相交测试只能这么快.你必须消除它们以获得显着的加速.

分层边界体积有很大帮助,但我终于弄清楚了kd树,并且速度大幅增加.当然,构建树的成本可能使其对实时动画不利.

注意同步瓶颈.

您需要了解情况,以确保将注意力集中在正确的位置.

  • 反直觉是这些天很多事情的方式.我十年前对优化的了解完全不在眼前.分支预测是一个非常重要的事情要理解. (2认同)

Ada*_*vis 6

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

D,取决于实现和编译器,提出了相当好的性能.由于您尚未解释您已经使用的光线跟踪方法和优化,因此我无法在那里给您太多帮助.

接下来,下一步是对程序运行时序分析,并重新编码最常用的代码或最慢的代码,而不是影响性能最高的程序集.

更一般地,请查看以下问题中的资源:

我真的很喜欢使用显卡(大规模并行计算机)来完成一些工作.

此站点上还有许多与光线跟踪相关的资源,其中一些列在此问题的侧栏中,其中大部分都可以在光线跟踪标记中找到.