研发三维GIS系统笔记/框架改造/智能指针重构框架-003
1. 使用智能指针重构系统
原有的系统都是裸指针,在跨模块与多线程中使用裸指针管理起来很麻烦,尤其是多任务系统中会出现野指针
1 class CELLTileTask :public CELLTask
2 {
3 public:
4 CELLQuadTree* _node;
5 TileId _tileId;
6 CELLImage _image;
7 };
任务队列中存储了 CELLQuadTree* _node; 在频繁或者剧烈操作相机的情况下,造成大量的瓦片任务,同时瓦片任务中存储的对四叉树对象已经被释放
在进行使用的过程中,就会出现野指针,为了避免这些问题,引入智能指针来解决对象的生命周期的问题。避免野指针的出现。
2. 基类对象改造
基类对象是被引擎中的所有其他的类继承使用,所以先改造基类,从基类开始支持智能指针。
1 class CELLObject :public std::enable_shared_from_this<CELLObject>
2 {
3 public:
4 using ObjectPtr = std::shared_ptr<CELLObject>;
5 public:
6 CELLObject()
7 {}
8 virtual ~CELLObject()
9 {}
10 ObjectPtr ptr()
11 {
12 return shared_from_this();
13 }
14
15 template<class T>
16 std::shared_ptr<T> toPtr()
17 {
18 return std::dynamic_pointer_cast<T>(ptr());
19 }
20 };
好处1,std::enable_shared_from_this<CELLObject> 这一句很重要,这样对象中继承了智能指针中的引用计数对象,降低访存次数,提升效率
好处2:可以实现智能指针与裸指针的相互转化,可以从裸指针转换成智能指针。
3. 改造代码
引擎中四叉树节点
using NodePtr = std::shared_ptr<CELLQuadTree>;
class CELLQuadTree :public CELLObject
{
public:
enum ChildId
{
CHILD_LT,
CHILD_RT,
CHILD_LB,
CHILD_RB,
};
enum
{
FLAG_HAS_IMAGE = 1<<0,
FLAG_HAS_CULL = 1<<1,
FLAG_RENDER = 1<<2,
};
public:
typedef std::vector<CELLQuadTree*> ArrayNode;
typedef CELLTerrainInterface TerrainApi;
using NodePtr = std::shared_ptr<CELLQuadTree>;
public:
TerrainApi* _terrain;
/// 数据标志
uint _flag;
/// 对应瓦片id
TileId _tileId;
real2 _vStart;
real2 _vEnd; float2 _uvStart;
float2 _uvEnd;
/// 对应瓦片的范围(世界坐标)
aabb3dr _aabb;
/// 位置
ChildId _cornerId;
/// 当前瓦片的父节点,这里不能使用智能指针,否则会造成相互引用,造成智能指针无法释放(相互依赖引用)
CELLQuadTree* _parent;
/// 瓦片的孩子节点,注意这里,使用了智能指针
NodePtr _childs[4];
/// 纹理id
uint _textureId;
};
4. 节点示释放代码,不在使用delete 操作
for (int i = 0 ;i < 4 ; ++ i)
{
_childs[i] = nullptr;
}
5. 任务系统改造,使用智能指针对象
1 class CELLTask :public CELLObject
2 {
3 public:
4 CELLTask()
5 {}
6 virtual ~CELLTask()
7 {}
8 };
9
10 using TaskPtr = std::shared_ptr<CELLTask>;
6. 任务对象
1 class CELLTaskSystem
2 {
3 public:
4 class TaskThread :public CELLThread
5 {
6 public:
7 bool _exitFlag;
8 CELLTaskSystem* _system;
9 public:
10 TaskThread(CELLTaskSystem* pSystem)
11 {
12 _system = pSystem;
13 _exitFlag = true;
14 }
15 public:
16 virtual void join()
17 {
18 _exitFlag = true;
19 CELLThread::join();
20
21 }
22 virtual bool onCreate()
23 {
24 _exitFlag = false;
25 return false;
26 }
27 virtual bool onRun()
28 {
29 while (!_exitFlag)
30 {
31 _system->run();
32 }
33 return false;
34 }
35 virtual bool onDestroy()
36 {
37 return false;
38 }
39 };
40
41 typedef std::vector<CELLThread*> ArrayThread;
42 typedef std::list<TaskPtr> ArrayTask;
43 public:
44 CELLTaskObserver* _observer;
45 ArrayThread _threads;
/// 这里使用智能指针队列,而不是裸指针
46 ArrayTask _tasks;
47 CELLSemaphore _semphore;
48 CELLMutex _mutex;
49 };
研发三维GIS系统笔记/框架改造/智能指针重构框架-003的更多相关文章
- osg(OpenSceneGraph)学习笔记1:智能指针osg::ref_ptr<>
OSG的智能指针,osg::ref_ptr<> osg::Referenced类管理引用计数内存块,osg::ref_ptr需要使用以它为基类的其它类作为模板参数. osg::ref_pt ...
- VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统
一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...
- 19个三维GIS软件对比
19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...
- 国内外主流的三维GIS软件
我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一.上世纪八十年代末以来,空间信息三维可视化技术成为业界研 ...
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- 3DEarth PPT :一款专为GIS系统研发的三维汇报演示系统
3DEarth PPT(三维地球汇报演示系统)又称 3DGis PPT,是专为GIS系统研发的三维汇报演示系统.对有3DGis系统的客户它可以作为一个组件(dll)嵌入原系统,对没有3DGis系统的客 ...
- 数字孪生,数据驱动下的北京 CBD 智能楼宇三维可视化系统
前言 楼宇作为建筑基础设施的主体,为人们提供着重要的生存空间.随着物联网.人工智能概念的兴起以及智慧城市如火如荼的开展,智能楼宇的重要性越发突显. 随着城市现代化建设的发展,建筑的智能化,特别是公用建 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 绿色城市智慧运营:Web 3D 垃圾分类 GIS 系统
前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...
- 开源(免费)三维 GIS(地形,游戏)
先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...
随机推荐
- Spark SQL 及其DataFrame的基本操作
1.Spark SQL出现的 原因是什么? Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个叫作Data Frame的编程抽象结构数据模型(即带有Schema信息的RDD),S ...
- global average pooling
首先需要对深度网络中常见的pooling方式,以及全连接层有大致的了解.(此处略过不提.) paper: Network in Network fully connected layer 的缺点 在N ...
- 前端Vue自定义询问弹框和输入弹框
前端Vue自定义询问弹框和输入弹框, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13119 效果图如下: 使用方法 < ...
- SQL SERVER 查看表说明,字段属性
查询表字段属性,说明等: 1 SELECT 2 表名=case when a.colorder=1 then d.name else '' end, 3 表说明=case when a.colorde ...
- 加速体细胞突变检测分析流程-系列2(ctDNA等高深度样本)
Sentieon●体细胞变异检测系列-2 Sentieon 致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率.准确度和可靠性. 针对 ...
- 使用Githud 实现分发IPA包遇到的坑
最近要用到测试包分发,首先想到了,蒲公英,但是把包扔上去,扫描下载的时候发现,现在需要用户登录才能下载,弃了. 又跑到fir ,发现还得实名才能用,还得上传各种证件照,而且好像每天只有10个下载量,. ...
- 3D降噪_运动估计块运动匹配
运动估计 运动估计是视频去噪技术的重要组成之一,计算相邻两帧视频序列各像素的相对运动偏移量,从而得到其运动轨迹. 点 ( i , j ) (i,j) (i,j)和 ( x , y ) (x,y) (x ...
- Linux安装与配置FTP服务
1.FTP安装与配置 1.1.FTP安装 一般使用yum直接在线安装 # 在线安装FTP yum install -y vsftpd 安装完成后查看ftp状态 # 查看ftp状态 systemctl ...
- pandas 根据列的值选取所有行
原文链接:https://blog.csdn.net/changzoe/article/details/82348913 在其他论坛上看到的,原文链接如上所示.为方便记忆,原文如下所示: 选取等于某些 ...
- 查看Nginx是否启动
查看Nginx进程 ps -ef | grep nginx 输出如下: root 1036 1 0 Jul15 ? 00:00:00 nginx: master process /www/server ...