使用std::vector优化点云动画显示一例
1. 准备
使用std::vector应该知道几点:
(1)内存连续的容器,有点像数组
(2)与std::list相比,插入和删除元素比较慢- 因为数据迁移
(3)添加元素可能会引发内存分配和数据迁移。
2. 问题
AnyCAD::API::PointCloudNode使用FloatList 及std::vector<float>来存储一些列的点[x0, y0, z0, x1, y1, z1, .....]:
void | SetPoints (const FloatList &buffer) |
若想要显示n个点,需要3n的长度:
为了在空间中模拟某个物体的运动轨迹,即一系列的点,如何才能高效的实现动态绘制呢?
3. 方案
最基本的办法:
定义的变量:
PointCloudNode m_PointCoud; std::_vector<float> m_Points;
每次调用push_back添加点:
void onAddPoint(x, y, z) { m_Points.push(x); m_Points.push(y); m_Points.push(z); m_PointCloud.SetPoints(m_Points); render(); }
“优化1”:为了减少显示的点太多引起内存问题和效率问题,可以限定显示的点的个数
int MAX_POINT3_COUNT = MAX_POINT_COUNT * 3;
void onAddPointV1(x, y, z) { if(m_Points.size() > MAX_POINT3_COUNT) { m_Points.erase(m_Points.begin()); m_Points.erase(m_Points.begin()); m_Points.erase(m_Points.begin()); } m_Points.push(x); m_Points.push(y); m_Points.push(z); m_PointCloud.SetPoints(m_Points); render(); }
onAddPointV1引入了什么问题?
优化2:避免每次vector都重新分配内存,指定vector的初始内存大小
m_Points.reserve(MAX_POINT3_COUNT);
优化3:避免由于删除头元素引擎的数据迁移
新加入的点放在队尾还是队头,对于显示而言,结果都是一样一样的。所以可以覆盖”过期的"的点。
int m_TotalCount = 0;
void onAddPointV3(x, y, z) { ++m_TotalCount; if(m_TotalCount <= MAX_POINT_COUNT) { m_Points.push_back(x); m_Points.push_back(y); m_Points.push_back(z); } else { int pos = (m_TotalCount % 100 - 1) * 3; m_Points[pos] = x; m_Points[pos+1] = y; m_Points[pos+2] = z; } m_PointCloud.SetPoints(m_Points); render(); }
4 总结
略