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. 【linux命令】最强大的编辑器vim用法简介(基础篇)

    vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.它主要分为命令令行模式.插入模式和底行模式这三种,下面主要介绍一下这三种模式最简单常用的用法. 一.命令 ...

  2. 容器基础-- namespace,Cgoup 和 UnionFS

    Namespace 什么是 Namespace ? 这里的 "namespace" 指的是 Linux namespace 技术,它是 Linux 内核实现的一种隔离方案.简而言之 ...

  3. 大语言模型的开发利器langchain

    目录 简介 什么是langchain langchain的安装 langchain快速使用 构建应用 聊天模式 Prompt的模板 Chains Agents Memory 总结 简介 最近随着cha ...

  4. 记一次 .NET 某医院预约平台 非托管泄露分析

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ...

  5. Python中 sys.argv[]用法详解

    sys.argv[0]表示代码本身文件路径. sys.argv[]是一个从程序外部获取参数的桥梁,从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一 ...

  6. python添加水印

    # coding:utf-8 from PIL import Image, ImageDraw, ImageFont def add_text_to_image(image, text): font ...

  7. 磁盘问题和解决: fsck,gdisk,fdisk等

    错误: Resize inode not valid 对于gpt分区的硬盘一般fsck只能检查分区, 不能用于检查整个硬盘, 但是如果对硬盘设备运行时遇到这样的错误 $ sudo fsck -n /d ...

  8. Node: 将时间戳转换成日期并分组

    // 对时间戳按日期进行分组 let moment = require('moment') let timestamp_array = [ 1645059333000, 1613523333000, ...

  9. idea 2021新窗口打开工程

    描述 Mac M1,IDEA 2017 有部分兼容性问题,遂对IDEA进行升级 idea 升级2021(IntelliJ IDEA 2021.3 (Community Edition)) 打开新工程, ...

  10. 采用PCA算法&KMeans算法来实现用户对物品类别的喜好细分(菜篮子分析)(附带数据集下载)

    实现该项目的流程如下 """ 项目:用户对物品类别的喜好细分(菜篮子分析) 主算法:PCA降维算法 KMeans算法 总思路 1.导包 2.获取数据 3.数据处理 5.特 ...