gpt4 book ai didi

c++ - 降低 Unreal Engine 4.22 上 C++ 的时间复杂度

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:05:41 24 4
gpt4 key购买 nike

我正在使用光线追踪模拟开发激光雷达传感器。模拟可配置为以每秒所需的帧数运行(在我的例子中为 30 fps。即 1 帧运行时间为 33.34 毫秒)。

目前每秒进行 300000 次光线追踪(包括水平和垂直)。在 30 fps 下,每帧进行 10000 次光线追踪。代码如下所示

//call back at the start of frame (just for understanding - not the actual code, data type conversions and some other basics are ignored)
uint32 channels = 16;
float vert_angle[] = {15, 13, 11, 9, 7, 5, 3, 1, -1, -3, -5, -7, -9, -11, -13, -15};
float hor_angle_ref = 0;
uint32 points_per_second = 300000;
float rotation_frequency = 10;

/* 300000 points per second is divided into points per frame.
These points are distributed horizontally and vertically*/
void callback_scan(){
uint32 poits_to_scan_with_one_laser = points_per_second/ (fps * channels);
auto hor_angle_covered_this_frame = points_per_second* rotation_frequency * (1/fps);
auto hor_angle_resolution = hor_angle_covered_this_frame / poits_to_scan_with_one_laser ;
auto hor_angle = hor_angle_ref ;

for(auto i= 0u; i< poits_to_scan_with_one_laser ; ++i){
for(auto ch= 0u; ch< channels; ++ch){
auto hitPoint = raytrace(hor_angle, vert_angle[ch]);
// process_data(); -> distance, time and energy are calculated
/* distance -> Euclidean distance calculation and addition of noise
time -> c=d/t
energy -> Pr = Pt*pow(D,2)*nsys*natm*row/ pow(dist,2);*/
}
hor_angle += hor_angle_resolution ;
}
hor_angle_ref = hor_angle;

}

上面的代码运行得很好。一切都在 33.33 毫秒的预期时间内完成。现在需要引入效应发散https://en.wikipedia.org/wiki/Beam_divergence .

使用的解决方案:每个点取 8 个样本。即嵌套 for 循环内的 8 个光线追踪。总共 (8+1)*300000 光线追踪。此解决方案占用了大量时间,并且不可能在 33 毫秒内完成。任何人都可以建议任何其他替代方案来构建代码/算法的体系结构/我可以使用一种不同的方法来实现它,同时减少计算复杂性。

附加信息:

虚幻引擎 4.22,在 GPU 上运行

最佳答案

我没有关于您使用的引擎的基本知识,也没有您尝试实现的效果,但我知道有 2 种主要的加速光线追踪器的方法(除了明显的并行化和 GPU):

  1. 使用旧的帧/光线而不是转换更多的光线

    这通常用于泛光、反射、运动模糊和类似的效果……所以简单地不是在稍微不同的方向上转换更多光线,而是使用来自最后一个或多个帧的光线……然而,这需要额外的缓冲区来存储需要最后一帧数据。如果您需要的不仅仅是结果颜色,它可能需要相当大的 RAM,尤其是对于光线追踪器。

  2. 使用随机而不是 split 光线

    这是很常见的方法。你知道当光线撞击表面时它应该 split 成反射和折射光线。随机光线追踪不会 split 。相反,它取决于伪随机值,它以 50/50 的机会反射或折射。正如您在没有 split 的情况下看到的那样,为场景转换的光线要少得多。另一方面,这会产生明显的噪声(类似于弱光条件下的旧 CCD 相机图像)。可以通过将最后几帧平均在一起(或每帧对同一场景进行多次光线跟踪)来部分抑制它......

    这样做的另一个优点是它不需要 GLSL 中未实现的递归,因此您可以更轻松地在 GLSL 中进行光线追踪。没有它,您将需要将递归转换为迭代,这并不简单,请参阅:

关于c++ - 降低 Unreal Engine 4.22 上 C++ 的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com