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

使用std::vector优化点云动画显示一例的更多相关文章

  1. PCL中outofcore模块---基于核外八叉树的大规模点云的显示

    写在前面   最近公众号的活动让更多的人加入交流群,尝试提问更多的我问题,群主也在积极的招募更多的小伙伴与我一起分享,能够相互促进.   这里总结群友经常问,经常提的两个问题,并给出我的回答: (1) ...

  2. 你想知道的 std::vector::push_back 和 std::vector::emplace_back

    引言 C++ 11 后,标准库容器 std::vector 包含了成员函数 emplace 和 emplace_back.emplace 在容器指定位置插入元素,emplace_back 在容器末尾添 ...

  3. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  4. C++ error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“

    原文地址:http://blog.csdn.net/onlyou930/article/details/5602654 圆环套圆环之迭代器 话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令 ...

  5. 编程杂谈——std::vector与List<T>的性能比较

    昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...

  6. C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案

    介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...

  7. C++ 中的std::vector介绍(转)

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  8. cocos2dx 动画显示异常

    最近遇到一个问题 好多cocostudio导出的动画 显示都会有异常 很明显的融合方式 把混合方式里面的 src 改成one dst 改成 one-src alpha 解决 后面附上同行的文章 浅显易 ...

  9. std::vector介绍

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

随机推荐

  1. 实验吧_who are you?(盲注)

    who are you? 翻翻源码,抓抓包,乱试一通都没有什么结果 题目中提示有ip,立马应该联想到X-Forwarded-For 虽然知道是这个方面的题,但完全不知道从何入手,悄咪咪去翻一下wp 才 ...

  2. Office 365 应用开发的 .NET Core 模板库

    概述 前不久我写过一篇文章拥抱开源,Office 365开发迎来新时代,给大家介绍了Office 365开发的典型场景是如何支持开源平台的:Office 365通过Microsoft Graph,以R ...

  3. 51nod 1770 数数字

    1770 数数字 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题  收藏  关注 统计一下 aaa ⋯ aaan个a × b 的结果里面 ...

  4. HEOI2017游记

    Day -1: noip与标准时限差了0.02秒,并没有申诉成功,导致NOIWC多交了900元钱. 滚回去准备学考,文科瞎写居然拿了A,可啪. NOIWC颓废记由于我实在太颓了所以懒得填坑了. THU ...

  5. Android Studio创建/打开项目时一直处于Building“project name”Gradle project info的解决办法

    重新安装了Android studio 之后, 启动android studio,打开原来的项目,界面一直停留在: 一直停留在此界面的原因是:Android studio 在下载 Gradle ,但是 ...

  6. Awesome-Text-Classification:文本分类资源合集

    Awesome-Text-Classification https://github.com/fendouai/Awesome-Text-Classification Projects fastTex ...

  7. 自定义alert窗口样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. GrideSearchCV 优化算法参数

    很多机器学习算法有参数,比如 linear_model.LogisticRegression()中有参数C. sklearn中的GrideSearchCV可方便调参过程.如下: import nump ...

  9. DotnetSpider (二) Downloader的设置 Request自定义数据字典

    本篇主要分享自定义Downloader和Request信息,实现自定义请求内容,及将自定义内容存储. ** 温馨提示:如需转载本文,请注明内容出处.**     本文连接:http://www.cnb ...

  10. 重置winsock目录解决不能上网的问题

    摘自:http://www.52microsoft.com/netsh-winsock-reset/ 有时候,我们会遇到能成功连接网络但是却无法上网的问题.屏幕右下角系统托盘中的网络连接图标显示正常, ...