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. PostgreSQL 12 文档: 部分 VII. 内部

    部分 VII. 内部 这一部分包含PostgreSQL开发者可能用到的各类信息. 目录 50. PostgreSQL内部概述 50.1. 一个查询的路径 50.2. 连接如何建立 50.3. 分析器阶 ...

  2. 华为云GaussDB亮相2023可信数据库发展大会,荣获三项评测证书!

    摘要:2023可信数据库发展大会上,华为云数据库服务产品部总经理苏光牛围绕华为云GaussDB的产品能力和实践进行了分享 本文分享自华为云社区<华为云GaussDB亮相2023可信数据库发展大会 ...

  3. iOS CoreData总结

    相关主要类: NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互 NSManagedObjectModel 被管理的数据模型,数据结构 NSPer ...

  4. Dubbo的高级特性:服务治理篇

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 上一篇中,我们已经在Spring Boot应用中集成了Dubbo,并注册了一个服务提供方和一个服务使用方 ...

  5. 给程序员准备的“蜜糍”--SOD框架简介

    注:本文是SOD框架源码仓库的首页介绍,原文地址 一.框架介绍 1,SOD框架是什么? 以前有一个著名的国产化妆品"大宝SOD密",SOD框架虽然跟它没有什么关系,但是名字的确受到 ...

  6. 【Redis】字符串sds

    sds,即 Simple Dynamic Strings,是Redis中存储绝大部分字符串所采用的数据结构. typedef char *sds; 一.类型 sds的类型包括SDS_TYPE_5, S ...

  7. 如何将Maven项目快速改造成一个java web项目(方式一)

    因为实际需要,需要将一个maven项目改造成原生的java-web项目,写这边博客 来记录整个改造的过程.原始的maven项目,使用IDEA打开后,目录结构如下所示 直接通过文件夹查看项目结果如下 首 ...

  8. nginx配置文件内容(1)

    nginx.conf内容 在Nginx服务器的主配置文件nginx.conf中,包括全局配置.I/O事件配置.HTTP配置这三大块内容,配置语句的格式为"关键字  值:"(末尾以分 ...

  9. 浮点指令之找main函数

    环境 vs2019 编译选项x86(32位) debug版本 float指令练习 //c++源码 #include<stdio.h> int main(int argc,char* arg ...

  10. 一:wince 开发环境

    1:下载相关文件,vs2008 可以自行搜索安装 链接:https://pan.baidu.com/s/1b2shwCqmc1o9x-zsy8CmeA 提取码:qing