我有一个openvdb网格,我想迭代使用函子和openvdb :: tools :: foreach。如何使用openvdb(并行)的foreach访问多个网格?
//the grid I am iterating on
Grid G;
//the operator used to update each single voxel of G
struct Functor{
inline void operator()(const Grid::ValueOnCIter& iter) const {
}
};
如果只涉及胃肠道的操作可以基于迭代的计算值都简称
Functor op;
openvdb::tools::foreach(visibleGrid->cbeginValueOn(), op, true, true);
在每个体素(迭代),虽然我需要访问和修改其他电网(S)步。
我inital解决方案涉及提供给仿函数的附加电网(S)的访问:
struct Functor{
Grid2::Accessor grid2_accessor;
Functor(Grid2::Accessor& a) : grid2_accessor(a){}
inline void operator()(const Grid::ValueOnCIter& iter) const {
//use grid2_accessor based on iter.getCoord()
}
};
存取提供给函子,在施工时间,而且每个并行的线程得到的副本仿函数:
Functor op(G2->getAccessor());
openvdb::tools::foreach(G1->cbeginValueOn(), op, true, **false**);
不幸的是这种解决方案不起作用,因为:
- 存取器必须不能被访问
- 常量但函子::运算符()必须是一个const方法通过工具一起使用的foreach ::
第二脏溶液申报函子访问器复制为可变。由于openvdb断言失败(很可能是内存泄漏),此解决方案在Debug中不起作用。
有问题的解决方案吗?例如。一个工具:: foreach不要求operator()是const。
好点!通过每次实例化访问器,尽管我失去了上一次访问的缓存树路径。这给了我一个表演处罚 – Pierluigi
@Pierluigi这是真的。我应该添加的是,您可以通过值而不是通过引用传递访问器,这样可以保持缓存完好无损。 – pingul
@Pierluigi在编辑中添加了另一个示例。 – pingul