次の問題のメモリ割り当てを減らすための適切な戦略を考え出すのに苦労しています:
ツリーを作成中です。std::vector
最初は、いくつかのデータ (インデックスのリスト ())を含むルートしかありません。インデックスの一部が左の子に、残りの部分が右の子に移動する 2 つの部分に分割します。左/右にいくつ行くかわかりません。ルートの処理が完了すると、ルートのインデックスを保存する必要がなくなります。実際、私は葉のものだけに興味があります。さらに、分割ごとにデータを追加可能!したがって、ルートに 20 個の要素がある場合、分割後、左の要素は 12 個、右の要素は 10 個になる可能性があります。
各ノードで、std::vector
これらのインデックスを含む を保持します。要素を追加するとき、push_back()
多くのメモリ割り当てにつながる要素です。
インデックスを維持するための良い戦略は何ですか?
この質問は、SBVH データ構造の生成に関連しています。
コード:
struct Node {
std::vector<unsigned> indices_;
// ... some other stuff here
}
void partition(Node* node) {
Node* left = new Node();
Node* right = new Node();
float axis = findSplitPosition(node);
for(size_t i = 0; i < node->indices_.size(); ++i) {
if (index is strictly left on axis) {
left->indices_.push_back(node->indices_[i]);
} else if(index is strictly right on axis) {
right->indices_.push_back(node->indices_[i]);
} else {
// it intersects the axis -> add to left and right
left->indices_.push_back(node->indices_[i]);
right->indices_.push_back(node->indices_[i]);
}
}
// root indices no longer needed
node->indices_.clear();
}