OGRE分析之设计模式 iterator

C++进阶实战:精选八大开源项目,从网络编程到存储引擎 C++作为高性能系统开发的核心语言,其工程化实践离不开对网络编程、并发模型、数据结构和存储引擎等核心概念的理解。网络编程涉及I/O多路复用、线程池和HTTP协议解析,是构建高性能服务器的基石。并发模型通过生产者-消费者模式管理任务队列,有效提升吞吐量。数据结构如红黑树和跳表,是实现高效容器和存储系统的关键。这些技术共同支撑了从Web服务器到数据库引擎等广泛的应用场景。本文聚焦于TinyWebServer、MyTinySTL和rocksdb等八个精选开源项目,通过剖析其源码,帮助开发者掌握C++在实战中的高级 阅读详情

一、Singleton

 

Singleton 模式是OGRE中用的最广泛的设计模式,若干类都使用了该模式。Singleton模式本身很简单,实现方式多种多样,简单的如GoF提到的实现方式,复杂的有Loki库中解决方案,而OGRE的实现方法也是十分简单。
OGRE提供了一个模板类——Ogre::Singleton<T>,作为所有singleton类的基类: template <typename T> class Singleton { protected: static T* ms_Singleton; public: Singleton( void ) { assert( !ms_Singleton ); ms_Singleton = static_cast< T* >( this ); } ~Singleton( void ) { assert( ms_Singleton ); ms_Singleton = 0; } static T& getSingleton( void ) { assert( ms_Singleton ); return ( *ms_Singleton ); } static T* getSingletonPtr( void ) { return ms_Singleton; } };
需要使用Singleton的类,只需要从它继承即可: class MyClass : public Singleton<MyClass>{//..}
但在OGRE的源码中我们可以发现,从Singleton继承的类都Override了Singleton的成员getSingleton和getSingletonPtr。OGRE中是这样解释的:
Singleton的实现都在OgreSingleton.h文件中,这意味着任何包含OgreSingleton.h头文件的文件编译后都有Singleton的一份实现,这符合模板机制。但是从别的dll中使用基于Singleton的类时,就会产生连接错误。子类Override一下,把实现放在.cpp中,就会避免该问题。


二、 Factory Method
Factory Method本质上代理某个类的实例化过程,封装了一个new的语句而已。C++中new和delete通常都要成对出现,因此Factory Method也应该负责一个对象的delete(GoF没有提到由Factory Method构造的对象的析构问题)。另外,当一个类的构造函数的参数很多,其中有可以提供默认值的时候,用Factory Method还可以简化对象的创建。
OGRE中用到的Factory Method的地方很多。为满足最普遍的情况,OGRE有一个模板化的Factory Method——Ogre::FactoryObj< T >。因为具体类的构造函数的参数并不都相同,因此Ogre::FactoryObj< T >并不是OGRE所有工厂方法的基类。 template< typename T > class FactoryObj { public: virtual ~FactoryObj() {}; virtual const String& getType() const = 0; virtual T* createInstance( const String& name ) = 0; virtual void destroyInstance( T* ) = 0; };
OGRE大部分Factory Method的使用效果都是连接平行的类层次,如:
不使用Ogre::FactoryObj< T >的Factory Method很多,如:
还有ParticleEmitter和 ParticleEmitterFactory两个比较大的类层次等。

 

三、 Abstract Factory
Abstract Factory提供了用来创建一系列相关或相互依赖对象的接口。对使用者而言,无需关心使用的是何种具体的对象。OGRE中,该模式体现在它的Plug-in机制。
OGRE提供了Plug-in机制。利用Plug-in,一方面把与平台相关的部分和与平台无关的部分分离开来,如底层渲染系统既可以使用OpenGL,又可以使用DirectX;另一方面便于系统功能的扩充,如场景既可以使用BSP方式管理,又可以用Octree管理。
OGRE的Plug-in实现方式有两种,自此只讨论一下用Abstract Factory模式实现的Plug-in。以此方式实现的主要有两大类Plug-in:RenderSystem_x和Plugin_xSceneManager。
1、RenderSystem
RenderSystem是与渲染引擎相关的部分,如RenderSystem_Direct3D7.dll、RenderSystem_Direct3D9.dll、RenderSystem_GL.dll:
与渲染相关的对象都是通过具体的子RenderSystem创建的,这样就形成了不同类别的Render产品。在使用OGRE的时候,只需关心RenderSystem,而无需关心究竟是那种具体的RenderSystem。
RenderSystem创建的产品主要有:
1)RenderWindow
2) RenderTexture
3) HardwareOcclusionQuery

2、SceneManager
SceneManager是与场景内数据的组织方式相关的部分,如:Plugin_OctreeSceneManager.dll、Plugin_BSPSceneManager.dll等:
同样,SceneManager只是个接口,具体的场景管理是由子类完成的。它的产品系主要有:
1)SceneNode
2)RaySceneQuery
SceneManager中的很多Products是相同的,因此由SceneManager就完成创建过程。所以说SceneManager不是个纯粹的Abstract Factory。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pizi0475/archive/2010/03/17/5387619.aspx

 

MapIterator
说到Iterator,让人首先想到的是STL中各种iterators。OGRE源码中广泛用到了STL,尤其是容器map。但OGRE大部分情况下并没有直接使用与容器配套的迭代器,而是在iterator上包了一层。对序列式容器的iterator,OGRE包装为VectorIterator<T>,其const形式为ConstVectorIterator;对关联式容器(map),包装为MapIterator<T>,其const形式为ConstMapIterator。所以从另一个角度看,使用的是Adapter模式。

OGRE的包装本身没有什么复杂,看一下map的iterator封装就清楚了:

   template <class T>
    class MapIterator
     {
    private:
        typename T::iterator mCurrent;
        typename T::iterator mEnd;
        /**//// Private constructor since only the parameterised constructor should be used
        MapIterator()  {};
    public:
        typedef typename T::mapped_type MappedType;
        typedef typename T::key_type KeyType;
        /**//** Constructor.
        @remarks
            Provide a start and end iterator to initialise.
        */
        MapIterator(typename T::iterator start, typename T::iterator end)
            : mCurrent(start), mEnd(end)
         {
        }
        /**//** Returns true if there are more items in the collection. */
        bool hasMoreElements(void) const
         {
            return mCurrent != mEnd;
        }
        /**//** Returns the next value element in the collection, and advances to the next. */
        typename T::mapped_type getNext(void)
         {
            return (mCurrent++)->second;
        }
        /**//** Returns the next value element in the collection, without advancing to the next. */
        typename T::mapped_type peekNextValue(void)
         {
            return mCurrent->second;
        }
        /**//** Returns the next key element in the collection, without advancing to the next. */
        typename T::key_type peekNextKey(void)
         {
            return mCurrent->first;
        }
        /**//** Required to overcome intermittent bug */
         MapIterator<T> & operator=( MapIterator<T> &rhs )
          {
             mCurrent = rhs.mCurrent;
             mEnd = rhs.mEnd;
             return *this;
         }
        /**//** Returns a pointer to the next value element in the collection, without
            advancing to the next afterwards. */
        typename T::pointer peekNextValuePtr(void)
         {
            return &(mCurrent->second);
        }
        /**//** Moves the iterator on one element. */
        void moveNext(void)
         {
            mCurrent++;
        }

 };

 

九、Observer

      Observer模式“定义对象间一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并自动更新”。回想一下OGRE的消息机制,用的正是该模式。

      为了得到OGRE的各种消息(更新、鼠标、键盘),在初始化EventProcessor后需要向它添加各种Listeners:KeyListener、MouseListener、MouseMotionListener。而EventProcessor本身又是个FrameListener,在它startProcessingEvents的时候,又以FrameListener的身份注册到Root中。可以看出,Root是消息的发布者,EventProcessor 是个代理,它把消息分发给各种订阅者KeyListener、MouseListener或MouseMotionListener。

至于消息是如何分发的,可以参考Chain of Responsibility模式或消息机制分析。

 

十、Strategy

Strategy模式在于实现算法与使用它的客户之间的分离,使得算法可以独立的变化。

回想一下Bridge模式,可以发现,两者之间有些相似性:使得某一部分可以独立的变化。只不过Bridge是将抽象部分与它的实现部分分离。从两者所属的类别来看,Bridge强调静态结构,而Strategy强调更多的是行为——算法的独立性。

同样是Bridge模式中的例子,若把Mesh各版本文件读取的实现看作是算法,把MeshSerializer看作是算法的客户,那么该例也可以看作是Strategy模式。具体参考Bridge模式。

从上面可以看出,模式之间本没有绝对的界限,从不同的角度看可以得到不同的结论;另一方面,模式的实现也是随机应变,要与具体的问题想结合。

 

十一、Template Method

      Template Method比较简单的一个模式,属于类行为模式。可以用“全局与细节”、“步骤与实现”来概括,具体就是基类定义全局和步骤,子类来实现每一步的细节。

      OGRE给的Example框架使用了该模式,并具代表性。看一下ExampleApplication的setup()成员:

      bool setup(void)
     {
        mRoot = new Root();

        setupResources();

        bool carryOn = configure();
        if (!carryOn) return false;

        chooseSceneManager();
        createCamera();
        createViewports();

        // Set default mipmap level (NB some APIs ignore this)
        TextureManager::getSingleton().setDefaultNumMipmaps(5);

        // Create any resource listeners (for loading screens)
        createResourceListener();
        // Load resources
        loadResources();

        // Create the scene
        createScene();

        createFrameListener();

        return true;

    }

 

      该成员函数调用的其他virtual成员函数都有默认的实现,若不满足需求,子类可以自行实现。而setup()只是定义了一个设置顺序。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pizi0475/archive/2010/03/17/5387592.aspx

4、Ogre 图形渲染库设计与功能全解析 本文全面解析了Ogre图形渲染库的设计哲学与核心功能。Ogre采用面向对象的设计方法,将渲染过程抽象为对象模型,简化了场景的创建与管理。文章深入介绍了Ogre的设计亮点,包括其对常见设计模式的智能应用、场景图与内容的解耦、插件架构支持、硬件加速渲染器、灵活的渲染队列机制、强大的材质与动画系统等。此外,还涵盖了Ogre的子系统架构,如资源管理、场景管理、渲染系统等,并提供了典型的操作流程与代码示例,帮助开发者快速上手。最后总结了Ogre的优势与应用场景,适用于游戏开发、虚拟现实、可视化工具等高性能图形渲染需求 阅读详情

相关推荐

OGRE设计模式分析

OGRE的设计结构十分清晰,这得归功于设计模式的成功运用。 本文档详细分析了OGRE的设计模式。

OGRE中的设计模式

 Ogre使用观察者(Observer)模式将自己的每一个状态变化通知给应用程序,客户代码通过注册来监听Ogre中事件和状态的改变来得到相应通知(例如演示程序中使用的FrameListener对象,可以监听到应用程序每一帧渲染的开始和结束事件)。单件模式(Singleton)用来保证一个类只有一个实例迭代器模式(Iterator)用来历遍一个数据结构中的所有数据。访问者模式(Visitor)可

人在旅途/章鸽 的专栏 1205

OGRE设计模式详解

这是介绍OGRE设计模式的书籍,里面对OGRE的各种设计都进行了详细的讲述,是OGRE开发不可多得的资料

OGRE分析之设计模式(三)

OGRE分析之设计模式: Chain of Responsibility详细内容

actionmoon的专栏 518

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 125

C#上位机与OneNET云平台数据交互实战——基于HTTP与JSON解析

本文详细介绍了使用C#开发上位机软件与OneNET物联网云平台进行数据交互的实战方法。通过构建HTTP请求、解析JSON数据,实现设备数据的实时获取、界面展示与本地存储,为工业监控与数据采集提供了一套完整高效的C#解决方案。

kkk56的博客 220

OGRE中用到的设计模式

OGRE中用到的设计模式 1. 单例模式(Singleton) 2. 工厂方法(Factory Method) 3. 适配器模式(Adapter) 4. 桥接模式(Bridge) 5....

diaowu3299的博客 195

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

OGRE分析之设计模式Singleton,Factory Method,Abstract Factory

Singleton 模式是OGRE中用的最广泛的设计模式,若干类都使用了该模式。Singleton模式本身很简单,实现方式多种多样,简单的如GoF提到的实现方式,复杂的有Loki库中解决方案,而OGRE的实现方法也是十分简单。OGRE提供了一个模板类——Ogre::Singleton,作为所有singleton类的基类: template class Singleton { protected:

痞子龙3D编程 2123

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3320

FreeRTOS:卡在configASSERT( ( pxQueue ) )问题的解决

FreeRTOS卡在configASSERT( ( pxQueue ) )问题的解决

qq_42007164的博客 9567

OGRE分析之设计模式Iterator

说到Iterator,让人首先想到的是STL中各种iterators。OGRE源码中广泛用到了STL,尤其是容器map。但OGRE大部分情况下并没有直接使用与容器配套的迭代器,而是在iterator上包了一层。对序列式容器的iterator,OGRE包装为VectorIterator,其const形式为ConstVectorIterator;对关联式容器(map),包装为MapIterator,其

痞子龙3D编程 1613

深入解析安卓/Linux固件:从DTB到DTS的反编译实战

本文详细介绍了如何从安卓/Linux设备固件中提取并反编译DTB文件,将其转换为可读的DTS源码。通过实战步骤,包括拆解boot.img、处理resource.img以及使用dtc工具,帮助开发者深入理解设备硬件配置,为固件定制、驱动调试和系统移植提供关键支持。

weixin_29274337的博客 341

OGRE分析之设计模式

这段时间静下心来看了一下OGRE的源代码,有一点心得,于是写下来形成如下的几篇零散的文章: 阅读OGRE分析之设计模式(四) 摘要:Iterator Observer Strategy Template Method OGRE分析之设计模式(三) 摘要:OGRE分析之设计模式: Chain of Responsibility OGRE分析之设计模式(二) 摘要:分析OGRE用到的设计模式: Ada

力为的博客 4665

使用Simulink来模拟多旋翼无人机在风扰动条件下的飞行情况,并分析其稳定性

本教程详细介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先构建包含飞行器动力学模型、控制系统和环境模拟模块的系统框架,重点讲解简化动力学方程的实现方法。随后指导设计PID控制器来维持姿态稳定,并添加随机风扰动模型模拟环境干扰。通过设置输入信号和输出显示,最终实现对不同风速条件下无人机控制性能的评估。该实例为无人机控制系统设计提供了实用的仿真方法,强调利用MATLAB工具进行可视化分析和参数优化,以提高系统抗干扰能力和稳定性。

amy_mhd的博客 422

《Python等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级谁》Python编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,限时9.9元,欢迎订阅!

人生就是一个不断学习的过程 1881

OGRE分析之设计模式(四)

OGRE分析之设计模式(四)Mythma  Email: mythma@163.com       OGRE的设计结构十分清晰,这得归功于设计模式的成功运用。八、Iterator说到Iterator,让人首先想到的是STL中各种iterators。OGRE源码中广泛用到了STL,尤其是容器map。但OGRE大部分情况下并没有直接使用与容器配套的迭代器,而是在iterator上包

actionmoon的专栏 935

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Ogre 分析系列完全篇

<br />OGRE分析之设计模式(四)     <br /> 摘要: Iterator Observer Strategy Template Method <br />  阅读全文 OGRE分析之设计模式(三)       <br />摘要: OGRE分析之设计模式: Chain of Responsibility <br /> 阅读全文 OGRE分析之设计模式(二)      <br />摘要: 分析OGRE用到的设计模式: Adapter Bridge Proxy  <br />阅读全文 OGRE分析

Augmented Reality & Computer Graphics 975

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ogre 学习笔记 - Day 1

ogre 学习笔记 - Day 0 OGRE : Object-Oriented Graphics Rendering Engine 从名称可以得出,OGRE是一个渲染引擎 下载地址 https://www.ogre3d.org/ 最新版 ogre-13.1.0 编译 工具 cmake-gui, vs2019, vscode Configure configure时发现ogre会自动从github下载/编译依赖项,github速度有可能很慢,导致失败。 使用镜像 https://hub.fas

weixin_43859510的博客 1283

C++开源项目学习指南:从基础到进阶的实战路径

在软件工程领域,学习优秀开源项目是提升编程能力和工程思维的重要途径。其核心原理在于通过研究经过大规模实践检验的代码库,深入理解高性能、高并发、内存管理等关键技术概念的设计与实现。从技术价值看,这不仅能帮助开发者掌握现代编程语言特性(如C++11/14/17/20)的实际应用,更能学习到模块化设计、构建系统、测试框架等工程实践。在应用场景上,无论是构建网络服务、数据库系统、图形引擎还是开发工具链,都有对应的顶尖开源项目可供参考。本文聚焦于C++生态,针对不同学习阶段,系统梳理了包括Folly、RocksDB等

cucanqi9387的博客 461

OGRE分析之设计模式Adapter

Apdater模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。当使用第三方工具包时候,这种模式经常用到。OGRE使用了其他的几个开源项目,如Cg、freetype、ode、zzip等,与其他接口肯定会有不兼容的情况,这就需要Adapter。看一下OGRE的文件系统与zzip:OGRE是面向对象的,zzip提供的都是结构体和函数。为了处理压缩文件和普通文件使用相同的接口,就需要Adap

痞子龙3D编程 1961
上一篇: Ogre数据文件结构分析
下一篇: C/C++ 文件读写操作总结
WillbeFly
博客等级 码龄20年 2粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值