Ich habe ein openvdb-Gitter, das ich mit einem Funktor und openvdb :: tools :: foreach iterieren möchte.Wie benutze ich einen openvdb (parallel) für den Zugriff auf mehrere Grids?
//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 {
}
};
Wenn der einzigen GI beteiligt Betrieb einfach
Bei jedem Voxel (Iteration), obwohl ich zugreifen müssen und ändern, um zusätzliche Gitter (s) basierend auf dem berechneten Wert der Iteration
Functor op;
openvdb::tools::foreach(visibleGrid->cbeginValueOn(), op, true, true);
genannt haben könnte Schritt.
My inital Lösung beteiligt zum Funktors des zusätzlichen Gitters den Accessor Bereitstellen (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()
}
};
die Accessor Functor bei Bauzeit vorgesehen ist, und darüber hinaus jeder Faden der parallel zu einer Kopie erhalten von der Funktor:
Functor op(G2->getAccessor());
openvdb::tools::foreach(G1->cbeginValueOn(), op, true, **false**);
Leider ist diese Lösung nicht funktionieren, da:
- die Accessor darf nicht const sein zugegriffen werden
- aber Functor :: operator() muss eine konstante Methode sein, um von Werkzeugen verwendet werden :: foreach
Eine zweite schmutzig Lösung war, die Functor zu erklären Accessor-Kopie als veränderbar. Diese Lösung funktioniert nicht in Debug aufgrund einer openvdb-Zusicherung fehlgeschlagen (höchstwahrscheinlich ein Speicherverlust).
Gibt es eine Lösung für das Problem? Z.B. a tools :: foreach, das nicht erfordert, dass operator() const ist.
Guter Punkt! Indem ich den Accessor jedes Mal instanziiere, obwohl ich den zuletzt gecachten Baumpfad verliere, auf den zugegriffen wurde. Das gibt mir eine Penaltyperformance – Pierluigi
@Pierluigi Das ist wahr. Was ich auch hinzugefügt haben sollte, ist, dass Sie den Accessor einfach nach Wert anstatt nach Referenz übergeben können, so dass Sie den Cache intakt halten. – pingul
@Pierluigi Ein weiteres Beispiel in der Bearbeitung hinzugefügt. – pingul