OGRE分析之消息机制

OGRE分析之消息机制
Mythma
http://www.cppblog.com/mythma
Email: mythma@163.com
一、 消息的产生
InputReader:从各种输入设备读取数据,可以看作是消息产生地。具体的InputReader由PlatformManager创建,它是与平台相关的。
InputEvent:消息的载体。界面元素层输入消息的基类。
输入消息在它的产生地正常处理之前先被发送给Listeners。这样就可以用Listeners和GuiElement subclasses拦截消息,改变消息处理的默认行为。
InputEvent包含判断组合键的按下情况。
二、 消息的处理
EventListener:真正处理消息的地方。
EventTarget:处理消息的中介。所有InputEvent消息处理者的基类。EventTarget处理消息是由各种Listener完成的。KeyTarget调用KeyListener,MouseTarget调用MouseListener,MouseMotionTarget调用MouseMotionListener。
三、 消息的传递
EventDispatcher:代理分发消息。负责把InputEvent消息分派给EventTarget。在分发
第 1 页 共 2 页
OGRE 分析之消息机制 ----- Mythma
消息时,EventDispatcher根据InputEvent的类型(MouseEvent或者KeyEvent)分别发送给需要的PositionTarget。
EventTarget由TargetManager管理,每一个TargetManager都对应一个EventDispatcher。对应OverlayManager的EventDispatcher管理2D GUI组件,对应SceneManager的EventDispatcher管理3D物体。
EventProcessor:获取消息、维护消息队列、分发消息。
EventProcessor在初始化的时候,创建一个EventQueue和一个InputReader, InputReader初始化为侦听鼠标和键盘消息,接收到的消息存放于上述的EventQueue中。
EventProcessor是一个FrameListener,调用
EventProcessor::startProcessingEvents(true)把EventProcessor添加到Root的FrameListener链表中(实际为std::set),并激活EventQueue。
EventProcessor又是EvenetTarget,所以维护有Listener列表,从基类继承而来的。除此之外,EventProcessor还维护了一个EvenetTarget列表和EventDispatcher列表。而所有的这些都是用来处理或传递消息的。
四、 消息处理整个过程
程序进入Root::startRendering()后,进入消息循环。在渲染帧开始之前,Root调用所有注册的FrameListener的FrameListener::framStarted(…)函数,使之做好渲染前的准备。前面分析了EventProcessor属于FrameListener并注册到了Root,所以Root会调用EventProcessor:: framStarted(…)函数。此时,EventProcessor调用InputReader捕获鼠标、键盘消息,然后进入消息分发阶段。
EventProcessor将把队列中所有的消息通过EventDispatchers分发给EventTarget处理,EventTarget本身不能处理消息,需要借助EventListeners来处理。所以消息由依附在EventTarget上的EventListeners处理。
EventDispatchers返回后,若存在没有处理的消息则先由EventProcessor维护的EventTargets处理,仍未处理的则由EventProcessor本身处理。由于EventProcessor也是EventTargets,所以它需要发给添加到EventProcessor中的EventListeners来处理。
处理完鼠标键盘消息之后,Root开始调用RenderSystem来渲染RenderTarget。然后调用所有FrameListener的FrameListener::frameEnded(…)。
总体过程可以看成如下顺序如下:
InputReader
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值