1. 準(zhǔn)備
使用std::vector應(yīng)該知道幾點(diǎn):
(1)內(nèi)存連續(xù)的容器,有點(diǎn)像數(shù)組
(2)與std::list相比,插入和刪除元素比較慢- 因?yàn)閿?shù)據(jù)遷移
(3)添加元素可能會(huì)引發(fā)內(nèi)存分配和數(shù)據(jù)遷移。
2. 問題
AnyCAD::API::PointCloudNode使用FloatList 及std::vector<float>來存儲(chǔ)一些列的點(diǎn)[x0, y0, z0, x1, y1, z1, .....]:
void | SetPoints (const FloatList &buffer) |
若想要顯示n個(gè)點(diǎn),需要3n的長(zhǎng)度:
為了在空間中模擬某個(gè)物體的運(yùn)動(dòng)軌跡,即一系列的點(diǎn),如何才能高效的實(shí)現(xiàn)動(dòng)態(tài)繪制呢?

3. 方案
最基本的辦法:
定義的變量:
PointCloudNode m_PointCoud;
std::_vector<float> m_Points;
每次調(diào)用push_back添加點(diǎn):
void onAddPoint(x, y, z)
{
m_Points.push(x);
m_Points.push(y);
m_Points.push(z);
m_PointCloud.SetPoints(m_Points);
render();
}
“優(yōu)化1”:為了減少顯示的點(diǎn)太多引起內(nèi)存問題和效率問題,可以限定顯示的點(diǎn)的個(gè)數(shù)
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引入了什么問題?
優(yōu)化2:避免每次vector都重新分配內(nèi)存,指定vector的初始內(nèi)存大小
m_Points.reserve(MAX_POINT3_COUNT);
優(yōu)化3:避免由于刪除頭元素引擎的數(shù)據(jù)遷移
新加入的點(diǎn)放在隊(duì)尾還是隊(duì)頭,對(duì)于顯示而言,結(jié)果都是一樣一樣的。所以可以覆蓋”過期的"的點(diǎn)。
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 總結(jié)
略