我很难想出一个好的策略来减少以下问题的内存分配:
我正在建造一棵树。一开始,我只有包含一些数据的根(std::vector
索引列表())。我分成两部分,其中一部分索引到左孩子,另一部分到右孩子。我不知道有多少人会去左/右。有一次,我完成了对根的处理,我不再需要为它存储索引。事实上,我只对那些叶子感兴趣。此外,可以在每次拆分时添加其他数据!所以,如果根有 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();
}