`
hmd94hmd
  • 浏览: 14738 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

CEGUI 学习笔记 - 启动详细分析

 
阅读更多

CEGUI 学习笔记 - 启动详细分析
2010年11月12日
  CEGUI是OGRE推荐 并支持最好的GUI框架。它被设计成具有非常好的移植性,扩展性,以及非常灵活的UI生成方式.
  今天我也是初学CEGUI,看了下其源码,感觉其框架被设计的非常“离散”,这固然对使用者造成一定的困难,但它带来的好处却远远超过它的缺点。我们可以非常灵活的,以我们自己的方式配置出使用我们应用的架构。
  我以我的理解方式先来大概说下CEGUI的整体框架. 首先,它和OGRE类似,都有个根对象,这里叫做System,它负责管理了整个框架的生成以及销毁.
  System构造函数是这样写的
  System(Renderer* renderer,
  ResourceProvider* resourceProvider,
  XMLParser* xmlParser,
  ScriptModule* scriptModule,
  const String& configFile,
  const String& logFile);
  这样的构造方式就体现了CEGUI离散但非常灵活的方式生成我们需要的框架.我们来详细解释下这里参数的作用。
  1. renderer这指定了我们CEGUI系统的渲染设备。CEGUI的SAMPLE里提供了几种渲染设备,有D3D9 D3D8 D3D7 OPENGL等,我就不一一例了。也就是说,如果我们不想用它提供的默认渲染设备,我们可以自己继承Renderer类,来实现适合我们自己平台的渲染器。比如OGRE里就专门为CEGUI提供了自己的渲染器(感兴趣的读者,可以参考OGRE源码). 由于是GUI系统,不可能没有渲染设备,这也就默认规定了这个参数不可以为空,我们必须为它指定一个渲染器,否则会抛出一个Runtime错误.
  2. resourceProvider 这个指定了CEGUI的资源提供者(暂时这么翻译吧:)).看过OGRE源码的读者肯定知道,OGRE里也有个类似的东东,叫OGREResourceManager,这里的功能和OGRE的差不多一样。也就是说它负责维护我们所有资源的搜索目录,以及资源的加载和释放. 这个参数如果为空的话,那么CEGUI会默认的采用库里已经写好的一个ResourceProvider,叫做DefaultResourceProvider.我们完全可以继承ResourceProvider来实现我们自己的ResourceProvider. 比如OGRE里,因为已经有了类似的资源管理方式,所以OGRE里就继承了ResourceProvider,把OGRE的那一套管理方式搬到CEGUI里了.
  3. xmlParser 这个参数顾名思义,就是指XML的解析器。看看CEGUI考虑的多么详细,几乎它把能拆卸的模块都给独立开来,并且还能够自己定制,多么好的想法啊. 如果这个参数为空的话,那么CEGUI就会采用它默认的xmlParsel库,这里叫做ExpatParser. 我们也可以使用别的XML解析器,比如tinyXml(个人比较推荐这个拉:)).
  4. scriptModule 脚本模块. 这个我还没有仔细分析过。不知道脚本在CEGUI里做什么用。可能是用脚本来动态的管理GUI吧(个人猜想,以后学习了再来补充). 这里如果是空的话, CEGUI不会给你创建一个默认的。CEGUI的库里只有对lua的封装库。
  5. configFile 总配置xml. CEGUI里有非常多的配置文件,几乎每个模块都会涉及到一个。但这个配置文件是管理所有模块的配置文件的。说明白点,就是把所有模块的配置文件的文件名写在这个总的配置文件里。这个参数一般情况下是留空串的。但你也可以自己写这个配置文件,并把文件名传进去.也可以在System创建完之后,再自己按需每个模块单独加载配置。
  6. logFile 日志文件名。默认为CEGUI.log。System里的构造函数里会判断,如果当前系统里没有Logger,那么它会用默认的DefaultLogger. 然而DefaultLogger里是不允许文件名为空串的,否则会抛出一个Runtime异常.所以,我们如果想屏蔽Logger信息的话,要自己继承Logger并实现,然后在System对象创建之前,生成我们自己的Logger.
  这是System的参数详细解释,下一篇我将详细的说一下System里到底做了些什么事.
  再说说System的构造函数里到底做了哪些事情。
  详细的过程就不写了,只说说比较重要的几个步骤。
  1. 如果ConfigFile不为空的话, 分析此XML,并得到相关的配置(比如Font,Scheme,Layout等).
  2. 创建Logger.
  3. 创建所有单件.
  4. 创建系统内定的窗口样式.(必须创建,所有其它的样式都依赖于它们).
  5. 如果Scheme不为空,加载Secheme.
  6. 如果Layout不为空,加载Layout.
  7. 如果Script Module不为空,加载Script Module.
  8. 如果初始化Script不为空,运行它.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics