• 使用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 总结





  • 相关阅读:
    MySQL练习题
    MySql基础操作
    解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题
    1417. 重新格式化字符串--来源:力扣(LeetCode)
    字符消除
    Comsol中Absolute Pressure的解释
    气体流量与质量流率换算
    FileZilla MLSD错误:连接超时、读取目录列表失败
    Avalon总线的地址对齐与NIOS编程
    同步复位和异步复位--好文章就是要记录下来
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333101.html
Copyright © 2020-2023  润新知