ogre 学习笔记 - Day 10
结合之前,对 Ogre 基本的流程做了一个分析。
-
ResourceManager 存在加载顺序,LoadOrder, 它是一个 Read(float)?而且值的差距有点大。100,110, 300,350…,而且,同为 ResourceManager,new 的顺序不在一起,那么,它可能依赖之前创建的对象。分析时却没发现。至少,现在没发现依赖的地方。
-
它带着很多宏定义,标识是否使用某功能。
-
所有的对象都创建完后,加载plugin。加载 plugin.cfg 中指定的 dll。
dll 以 “dllStartPlugin” 作为入口。这就是 Ogre的插件功能。 -
创建完root后,
随着创建 OverlaySystem,
OverlaySystem 创建了一个 OverlayManager, 添加了3个 对象工厂- PanelOverlayElement 面板
- BorderPanelOverlayOverlay 边框面板
- TextAreaOverlayElement 字体区域
-
onetimeconfig 就是运行时弹出的选择 RenderSytem的弹窗,选择完后,设置 RenderSystem.
-
setup
root初始化,初始化时默认会创建窗口,通过传入false,表示由应用创建窗口。
locateResources 定位资源,找到 resources.cfg,读取配置。这里只做定位
initialiseRTShaderSystem
loadResources 定位完资源后,开始导入资源。在root初始化的时候创建了一堆的 ResourceManager,ScriptComplier。在之前的学习中,得知ogre把资源配置成为 script,在root中设置了几个scriptcompiler。
到这里,initapp就结束了。initapp里初始化root,加载各种需要的对象,加载资源。做了这么多的事情,那么初始化时间就可能很长,可能需要想办法缩短它的时间,特别是加载资源的时间.
RootStartRendering
- _initRenderTargets, 初始化渲染目标
- 帧循环
在这个函数里,发送了 FrameListener 里的事件。
最后处理Lod事件.
closeApp
- saveMicrocodeCache 保存shader缓存,这应该是为了下次快速加载。
- 销魂窗口时,用了循环,之前创建的时候没有太在意,按照这个设计,它可以有多窗口模式?!
到这里,大多数的流程都在InitApp里。
初始化完成后,就获取Root,调用Root::start Rendering。帧循环只是简单的发送了一些事件。
结束后,释放资源。
帧循环很简单,除了RenderSystem之外,没有涉及到其他的对象。只发送了几个事件。
那么,整个应用的循环,都依赖与事件系统了。
那么,接下来就是分析事件系统,分析各种Lisenter的了。