• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            力為的技術博客

            聯系 聚合 管理
              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 力為 閱讀(3698) 評論(0)  編輯 收藏 引用 所屬分類: 4. C++ FAQ
            人人狠狠综合久久亚洲88| 亚洲欧美日韩精品久久| 久久久噜噜噜www成人网| 久久无码AV中文出轨人妻| 久久精品国产精品国产精品污| 日韩精品无码久久久久久| 久久精品免费一区二区| 久久夜色精品国产噜噜亚洲a| 久久久久免费视频| 久久久久国产精品嫩草影院| 亚洲精品乱码久久久久久按摩| 久久久久久久精品妇女99| 成人精品一区二区久久 | 蜜臀久久99精品久久久久久小说| 久久精品aⅴ无码中文字字幕重口| 国产成人精品久久亚洲| 久久精品国产亚洲AV无码娇色| 久久久久久亚洲精品影院| 91精品国产91热久久久久福利| 无码人妻少妇久久中文字幕蜜桃 | 亚洲综合伊人久久大杳蕉| 亚洲国产精品无码久久久不卡| 国内精品久久久久久不卡影院| 热综合一本伊人久久精品| 久久精品国产2020| 久久精品免费网站网| 国产精品日韩深夜福利久久| 国产精品久久久久9999| 久久精品一区二区三区中文字幕| 99国产欧美精品久久久蜜芽| 久久婷婷五月综合97色一本一本| 亚洲一区精品伊人久久伊人| 蜜臀久久99精品久久久久久小说| 久久精品国产免费观看三人同眠| 怡红院日本一道日本久久| 国产精品久久成人影院| 久久国产欧美日韩精品| 久久精品中文闷骚内射| 久久精品国产99久久久| 久久精品国产亚洲AV无码麻豆 | 久久久久亚洲AV无码网站|