使用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 总结
略
使用std::vector优化点云动画显示一例的更多相关文章
- PCL中outofcore模块---基于核外八叉树的大规模点云的显示
写在前面 最近公众号的活动让更多的人加入交流群,尝试提问更多的我问题,群主也在积极的招募更多的小伙伴与我一起分享,能够相互促进. 这里总结群友经常问,经常提的两个问题,并给出我的回答: (1) ...
- 你想知道的 std::vector::push_back 和 std::vector::emplace_back
引言 C++ 11 后,标准库容器 std::vector 包含了成员函数 emplace 和 emplace_back.emplace 在容器指定位置插入元素,emplace_back 在容器末尾添 ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++ error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“
原文地址:http://blog.csdn.net/onlyou930/article/details/5602654 圆环套圆环之迭代器 话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令 ...
- 编程杂谈——std::vector与List<T>的性能比较
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...
- C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案
介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- cocos2dx 动画显示异常
最近遇到一个问题 好多cocostudio导出的动画 显示都会有异常 很明显的融合方式 把混合方式里面的 src 改成one dst 改成 one-src alpha 解决 后面附上同行的文章 浅显易 ...
- std::vector介绍
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
随机推荐
- 页面中引入mui 地址选择,点击页面中其他input时页面回到顶部
问题:在页面中引入mui地址选择时,点击页面中的input页面会滚到顶部(谷歌浏览器中出现的bug),在手机上点击input会出现跳动.开始的时候是想修改mui.min.js里的滚动事件,但是后来找到 ...
- 搭积木(block)
[问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...
- poj 2689 (素数二次筛选)
Sample Input 2 17 14 17 Sample Output 2,3 are closest, 7,11 are most distant. There are no adjacent ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- Linux 脚本为什么会有#!
我们在Linux系统终端编辑脚本时第一行通常这么写: #!/usr/bin/env python3 为什么要写这一行,起什么作用? 我们先看看不写这一行会出现什么?那么就会报下面的错误. #!/usr ...
- React 深入系列4:组件的生命周期
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...
- 如何导入python中的模块
作为一名新手Python程序员,你首先需要学习的内容之一就是如何导入模块或包.但是我注意到,那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活.在本文中,我们将探讨以下 ...
- python2.7入门---简介&基础语法
Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构.基于上述原因, ...
- 前端工程师:电信专业转前端是如何拿到阿里、腾讯offer的?
1.个人情况 ● 211本科 985硕士 电信专业 女生 ● 16年3月开始学习前端 ● 16年7月开始实习,共五家实习经历(不是特别厉害的厂) ● 秋招拿到两个offer(阿里.腾讯).没错只有这两 ...
- 字符串的最长回文串:Manacher’s Algorithm
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...