我正在将许多对象合并到包含渲染数据(网格)的单个向量中。这个向量被清除并重新填充每个帧(好吧,差不多)。
问题是,清除然后再保留向量大小对我的性能有很大的影响,因为clear()也可能会改变容量。
换句话说,我需要控制向量的容量何时发生变化。我想保留旧容量很长一段时间,直到我决定自己是时候改变它了。
我看到两个选项:
更新
此外,如果调用调整大小(10),然后调用调整大小(5)(仅用于说明,将实际数字乘以数百万),该怎么办?
稍后调用resize(5)会导致向量重新分配吗?
答案 0 :(得分:9)
实际上clear
成员函数保持向量容量不变。它只会破坏(调用析构函数)每个向量元素,并将向量大小设置为0。
在这种情况下,在每次迭代时,我会调用clear()
来销毁所有向量元素,然后调用成员函数reserve(size)
,在向量容量太小的情况下,它将会将其增加到至少size
。
答案 1 :(得分:2)
这个矢量被清除并重新填充每一帧(好吧,差不多)。
我会推荐一种不同的方法。
创建一个充当渲染数据缓冲区的类。
如果我没弄错的话,你永远不会减少缓冲区的容量。您只需在需要时增加容量。
确保该类是实现细节,并且只构造实例。
这是我正在思考的骨架实现。
namespace Impl_Detail
{
struct Buffer
{
size_t capacity;
size_t size;
std::vector<char> data;
// Pick whatever default capacity makes sense for your need.
Buffer(size_t cap = 100) : capacity_(cap), size_(0), data(cap) {}
void ensureCapacity(size_t cap)
{
if ( capacity_ < cap )
{
capacity_ = cap;
data.resize(capacity_);
}
}
// Add any other helpful member functions as needed.
};
// Create an instance and use it in the implementation.
Buffer theBuffer;
}