我目前正在大量使用点云,并且我已经实现了一种分割算法,该算法将具有特定最大距离的点聚集成段。
为了优化这一点,我给每个段一个轴对齐的边界框,以检查给定点是否可能与段匹配,然后再仔细观察并迭代这些点并计算距离(我实际上使用八叉树这个,修剪掉大部分的点。)
我已经通过 gnuprof 运行了我的程序,结果如下:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
52.42 5.14 5.14 208995661 0.00 0.00 otree_node_out_of_bounds
19.60 7.06 1.92 189594292 0.00 0.00 otree_has_point_in_range
11.33 8.17 1.11 405834 0.00 0.00 otree_node_has_point_in_range
9.29 9.08 0.91 352273 0.00 0.00 find_matching_segments
[...]
如您所见,大部分计算时间都花在otree_node_out_of_bounds
其中实现如下:
int otree_node_out_of_bounds(struct otree_node *t, void *p)
{
vec3 *_p = p;
return (_p->x < t->_llf[0] - SEGMENTATION_DIST
|| _p->x > t->_urb[0] + SEGMENTATION_DIST
|| _p->y < t->_llf[1] - SEGMENTATION_DIST
|| _p->y > t->_urb[1] + SEGMENTATION_DIST
|| _p->z < t->_llf[2] - SEGMENTATION_DIST
|| _p->z > t->_urb[2] + SEGMENTATION_DIST);
}
其中SEGMENTATION DIST
是编译时间常数,以允许 gcc 进行一些常数折叠。_llf
并且_urb
是类型float[3]
并且代表八叉树的边界框。
所以,我的问题基本上是,是否可以对这个函数进行一些偷偷摸摸的优化,或者更一般地说,有没有更有效的方法来对 AABB 进行边界检查,或者用不同的方式来表达它,我可以加快速度吗?通过使用一些 C/gcc 魔法以某种方式进行比较?
如果您需要更多信息来回答这个问题,请告诉我:)
谢谢,安迪。