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 總結
略