首页 > 其他分享 >研发三维GIS系统笔记/框架改造/智能指针重构框架-003

研发三维GIS系统笔记/框架改造/智能指针重构框架-003

时间:2023-10-08 18:58:37浏览次数:37  
标签:std GIS 框架 ptr 003 智能 shared public 指针

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 };

 



 

标签:std,GIS,框架,ptr,003,智能,shared,public,指针
From: https://www.cnblogs.com/FastEarth/p/17748864.html

相关文章

  • Spring框架概述
    1.Spring框架是轻量级的JavaEE框架2.Spring可以解决企业应用开发的复杂性3.Spring有两个核心部分:IOC和Aop(1)IOC:控制反转,把创建对象的过程交给Spring进行管理(2)Aop:面向切面,不修改源代码进行功能增强4.Spring特点(1)方便解耦,简化开发(2)Aop变成支持(3)方便程序测试(4)方便和其他框架进行整合(5)方......
  • 《玩转smardaten | GIS地图无码化配置全方位指南》
    GIS地图作为一种特殊图表,将地理位置信息和地图结合起来进行处理、管理和分析。这些地图可以让用户以多种方式查看、分析和解释地理数据,包括创建图层、生成主题地图和执行空间分析等,更加形象完整的辅助数据可视化。常用的场景如......
  • Rethinking Point Cloud Registration as Masking and Reconstruction论文阅读
    RethinkingPointCloudRegistrationasMaskingandReconstruction2023ICCV*GuangyanChen,MeilingWang,LiYuan,YiYang,YufengYue*;ProceedingsoftheIEEE/CVFInternationalConferenceonComputerVision(ICCV),2023,pp.17717-17727paper:Rethin......
  • 框架集 表格 列表
    一.框架集(frameset)注意:要把body删了 rows以纵向分 cols以横向分framboder=0/1是否有边框border=1边框为1frame框架noresize是否有拖拽scrolling=yes/no/auto是否有下拉或右拉target中的值可以自定义跳转但是必须在frameset中使用 二.内框架ifram......
  • 金融信创黄金三年:小程序生态+跨端技术框架构建
    小程序应用场景生态的发展,受益于开源技术的发展,以及响应快速开发的实际业务需求,一些跨端框架如:Electron、wxPython、FinClip、Tauri、Flutter等发展也非常迅速,小程序生态+跨端技术框架,不仅能满足自有超级App的灵活技术构建,快速引入第三方生态,还能通过小程序容器技术连接一切可以......
  • 研发三维GIS系统笔记/实现wgs84投影-001
    1.工作内容,改造引擎,支持wgs84投影改造原因:目前投影是墨卡托投影(与GoogleMap一致)目前的GIS系统是二维的采用这个坐标系是没有问题的但不支持wgs84瓦片数据以及高程数据,工作中很多数据是wgs84格式的,尤其很多三维GIS都是采用wgs84投影wgs84与mercator从数据上......
  • P1003 [NOIP2011 提高组] 铺地毯
    第一思路:开一个N*N的数组,每次都扫一遍地毯范围并标记编号然后你会发现:喜提MLE为什么呢?我们来看看数据范围0≤n≤1e4n的范围是1e4,数组总大小为1e16,大约需要4000TB的内存空间服务器也不带这么玩的正解:将地毯信息用结构体存储structnode{ intx1,y1,x2,y2;//x1......
  • pig4cloud框架系列五:OAuth2之授权码模式认证
    前言:OAuth2目前被广泛用于第三方登录场景中,用于鉴权,认证。本文主要简单介绍一下授权码模式认证。场景:使用微信登录迅雷一,名词概念1,第三方应用程序:迅雷2,服务提供商:微信3,资源所有者:登录用户4,认证服务器:微信用来处理认证的服务器5,资源服务器:微信存放用户生成的资源的服务器,它......
  • html表单与框架
    1.以form开头其中常用的属性有 action="" method="" enctype="" name="" action:属性用来设置接收和处理浏览器递交的表单内容的服务器程序的URL method:属性用来定义浏览器将表单中的信息提交给服务器端的处理程序的方式,取值可以为:GET或POST. enctype:属性指示浏览......
  • C#/.NET/.NET Core优秀项目和框架2023年9月简报
    思维导航前言DncZeusIEJIE.NETObfuscarConfuserExCommon.UtilityOptimizerJustDecompilednSpyILSpyQuickLookWingTaiFreeSchedulerCollectiveOAuth加入DotNetGuide技术交流群前言公众号每月定期推广和分享的C#/.NET/.NETCore优秀项目和框架(公众号每周至......