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. 【WALT】WALT入口 update_task_ravg() 代码详解

    目录 [WALT]WALT入口 update_task_ravg() 代码详解 代码展示 代码逻辑 ⑴ 判断是否进入 WALT 算法 ⑵ 获取 WALT 算法中上一个窗口的开始时间 ⑶ 如果任务刚初始 ...

  2. tomcat Filter内存马

    idea调试的时候加入源代码 <dependency> <groupId>org.apache.tomcat</groupId> <artifactId> ...

  3. fdisk 命令 创建分区 实现扩容

    fdisk 命令 创建分区 实现扩容 Linux fdisk命令简介 Linux fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表.BSD 或者 SUN 类型的磁盘列表. 菜单操 ...

  4. 零基础实现Java直播(二):实现流程

    一.前提条件 在实现Java直播前,请确保: 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成. 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 App ...

  5. QOJ 6504. CCPC Final 2022 D Flower's Land 2题解

    QOJ 6504. CCPC Final 2022 D Flower's Land 2题解 题意简述 给你一个只含 \(0,1,2\) 的序列,相邻两个相同的数字可以直接消掉. 询问包含两种 区间所有 ...

  6. .Net 一套接口多实现

    .Net 一套接口多实现 接口(interface)可理解为规范.标准.协议.接口是用来约束各方都在同一组规范下工作. 电脑外设USB接口,各个品牌商家生产的U盘.鼠标都能够被电脑主板识别并工作,这是 ...

  7. Xshell远程连接虚拟机及连接故障排查

    用Xshell 远程连接虚拟机 如果按前面博客装好虚拟机,会发现刚装好的虚拟机直接连Xshell连不上,宿主机也ping不通虚拟机,这就需要修改VMware的默认网络配置 修改步骤: 1.在VMwar ...

  8. 如何在工作中利用Prompt高效使用ChatGPT?

    导读 AI 不是来替代你的,是来帮助你更好工作.用better prompt使用chatgpt,替换搜索引擎,让你了解如何在工作中利用Prompt高效使用ChatGPT. 01背景 现在 GPT 已经 ...

  9. CF1787E The Harmonization of XOR 题解

    CF1787E The Harmonization of XOR 题目大意 给定 \(n\) 个数 \([1, 2, 3, \cdots, n]\) 和两个正整数 \(k\) 和 \(x\). 将这些 ...

  10. 9k+ Star 简洁好用的开源 Linux 运维管理面板

    如果你的公司需要进行服务器运维管理,那么运维管理面板就是一个不可或缺的需求.因为并非每一位运维工程师都能在命令行下游刃有余,不需要借助辅助工具就能确保服务器安全.流畅运行.尤其是对于刚刚踏入运维领域的 ...