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的更多相关文章

  1. osg(OpenSceneGraph)学习笔记1:智能指针osg::ref_ptr<>

    OSG的智能指针,osg::ref_ptr<> osg::Referenced类管理引用计数内存块,osg::ref_ptr需要使用以它为基类的其它类作为模板参数. osg::ref_pt ...

  2. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统

    一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...

  3. 19个三维GIS软件对比

    19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...

  4. 国内外主流的三维GIS软件

    我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一.上世纪八十年代末以来,空间信息三维可视化技术成为业界研 ...

  5. C++中的智能指针、轻量级指针、强弱指针学习笔记

    一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...

  6. 3DEarth PPT :一款专为GIS系统研发的三维汇报演示系统

    3DEarth PPT(三维地球汇报演示系统)又称 3DGis PPT,是专为GIS系统研发的三维汇报演示系统.对有3DGis系统的客户它可以作为一个组件(dll)嵌入原系统,对没有3DGis系统的客 ...

  7. 数字孪生,数据驱动下的北京 CBD 智能楼宇三维可视化系统

    前言 楼宇作为建筑基础设施的主体,为人们提供着重要的生存空间.随着物联网.人工智能概念的兴起以及智慧城市如火如荼的开展,智能楼宇的重要性越发突显. 随着城市现代化建设的发展,建筑的智能化,特别是公用建 ...

  8. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  9. 绿色城市智慧运营:Web 3D 垃圾分类 GIS 系统

    前言 感谢所有为上海疫情奉献的人,祈求上海疫情早日清零,中国加油,上海加油! <上海市生活垃圾管理条例>施行至今已有两年多,上海市民践行绿色低碳理念.主动参与生活垃圾分类的习惯基本养成,分 ...

  10. 开源(免费)三维 GIS(地形,游戏)

    先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...

随机推荐

  1. 宋红康-Java基础复习笔记详细版

    Java基础复习笔记 第01章:Java语言概述 1. Java基础学习的章节划分 第1阶段:Java基本语法 Java语言概述.Java的变量与进制.运算符.流程控制语句(条件判断.循环结构).br ...

  2. Java 设计模式实战系列—策略模式

    从优惠打折活动说起 电商平台为了增加销量经常搞一些活动,比如 618.双十一,还有一些节假日活动,根据销量的变化又经常更新不同的活动.最开始为了增加销量,全场都六折: // 打六折 public Bi ...

  3. [python] 基于matplotlib-scalebar库绘制比例尺

    matplotlib-scalebar是一个Python库,用于在matplotlib图形中添加比例尺.它允许用户指定比例尺的大小.位置.字体和颜色,以及比例尺的单位.该库支持不同的比例尺单位,例如米 ...

  4. 【xx-job】 定时任务调度

    XXL-JOB XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展. 现已开放源代码并接入多家公司线上产品线,开箱即用. 一.任务调度中心 1.1 下载XXL- ...

  5. Reactjs学习笔记

    本篇是关于React的简介 ReactJS是Facebook推出的一款前端框架,2013年开源,提供了一种函数式编程思想,拥有比较健全的文档和完善的社区,在React16的版本中对算法进行了革新,称之 ...

  6. SQL Server 配置允许远程连接

    前言 需要别人远程你的数据库,首先需要的是在一个局域网内,或者连接的是同一个路由器,接下来就是具体步骤: 1.首先是要检查SQLServer数据库服务器中是否允许远程链接.其具体操作为: 1. 打开数 ...

  7. cgroup Linux中的资源限制

    参考链接:容器技术的基石:cgroup 直接上实验: # docker run --rm -d --cpus=0.1 --memory=100M --name=test redis:alpine WA ...

  8. 【技术积累】Linux中的命令行【理论篇】【一】

    7z命令 命令介绍 7z命令是Linux系统中的一个压缩和解压缩工具,它可以用来创建.压缩和解压缩7z格式的文件.7z是一种高压缩率的文件格式,通常比其他常见的压缩格式(如zip和gzip)具有更高的 ...

  9. 园子的商业化努力-阿里云开发者社区合作:RDS MySQL Serverless 免费试用活动

    阿里云开发者社区这个月组织了一个针对"云数据库 RDS MySQL Serverless 版"免费试用用户的做任务活动,上周找园子合作,希望能在园子里推广一下这个活动. 由于时间太 ...

  10. Kali开机启动模式修改

    kali Linux安装之后默认启动图形化界面,为了减轻系统负担,可以修改启动进入字符界面. 具体步骤如下: 1.打开引导配置文件 vim /etc/default/grub 2.修改GRUB_CMD ...