• <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>

            力為的技術(shù)博客

            聯(lián)系 聚合 管理
              154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

            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é)

             




            posted on 2015-11-03 16:43 力為 閱讀(3688) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 4. C++ FAQ
            久久这里只有精品视频99| 91精品国产高清久久久久久国产嫩草 | 久久久久亚洲AV无码观看| 免费一级欧美大片久久网| 一级做a爰片久久毛片16| 久久伊人色| 久久精品人成免费| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久91亚洲人成电影网站| segui久久国产精品| 亚洲综合伊人久久综合| 无码8090精品久久一区| 久久亚洲精品无码AV红樱桃| 久久亚洲2019中文字幕| 久久久一本精品99久久精品66 | 大美女久久久久久j久久| 久久天天躁狠狠躁夜夜不卡| 四虎国产精品免费久久久| 日产精品久久久一区二区| 热99re久久国超精品首页| 久久人做人爽一区二区三区| 国产免费福利体检区久久| 久久婷婷激情综合色综合俺也去| 久久99国产一区二区三区| 国产精品热久久无码av| 久久99热只有频精品8| 囯产极品美女高潮无套久久久| 久久99精品久久久久久秒播| jizzjizz国产精品久久| 亚洲国产精品久久久天堂| 久久久久se色偷偷亚洲精品av| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国内精品久久久久影院日本| 亚洲中文字幕伊人久久无码| 亚洲综合熟女久久久30p| 亚洲另类欧美综合久久图片区| 国内精品久久久久影院网站| 亚洲成人精品久久| 国产亚洲色婷婷久久99精品91| 国产精品久久久99| 色偷偷91久久综合噜噜噜噜|