力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

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 总结

 




posted on 2015-11-03 16:43 力为 阅读(3631) 评论(0)  编辑 收藏 引用 所属分类: 4. C++ FAQ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理