我有一個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