Cocos2d-x 学习笔记(15.3) EventDispatcher DirtyFlag 脏标记
1. 定义
用枚举定义脏标记的4种类型。
enum class DirtyFlag
{
NONE = ,
FIXED_PRIORITY = << ,
SCENE_GRAPH_PRIORITY = << ,
ALL = FIXED_PRIORITY | SCENE_GRAPH_PRIORITY
};
这里用两位二进制值表示4种类型:
- 00 两容器都不脏,
- 01 仅自定义优先级监听器容器脏了,
- 10 仅场景图监听器容器脏了,
- 11 都脏了。
2. setDirty
参数为监听器ID、要置的脏值。
利用容器_priorityDirtyFlagMap存储脏标记信息,key:监听器ID,value:脏值。
对脏值修改时,进行按位或操作。

3. setDirtyForNode
该方法是把参数node和其所有子节点加入_dirtyNodes容器中。在事件分发方法开始时,会对这些node关联的所有监听器的ID置脏标记SCENE_GRAPH_PRIORITY。
4. 用处
4.1 事件中
在添加监听器到监听器容器时,根据监听器是否是场景图监听器,给受到影响的容器的listenerID置不同的脏标记。
if (listener->getFixedPriority() == )
{
setDirty(listenerID, DirtyFlag::SCENE_GRAPH_PRIORITY);
//...
}
else
{
setDirty(listenerID, DirtyFlag::FIXED_PRIORITY);
}
从容器删除监听器时,对受影响的容器ID置不同的脏标记。
removeListenerInVector(sceneGraphPriorityListeners);
if (isFound)
{
setDirty(listener->getListenerID(), DirtyFlag::SCENE_GRAPH_PRIORITY);
}
else
{
removeListenerInVector(fixedPriorityListeners);
if (isFound)
{
setDirty(listener->getListenerID(), DirtyFlag::FIXED_PRIORITY);
}
}
setPriority给指定的监听器设置指定的优先级时,需要对该ID的容器设置FIXED_PRIORITY脏标记。
if (listener->getFixedPriority() != fixedPriority)
{
listener->setFixedPriority(fixedPriority);
setDirty(listener->getListenerID(), DirtyFlag::FIXED_PRIORITY);
}
使用sortEventListeners对指定的ID容器进行排序时,若ID的脏标记为NONE,则不需要排序。
DirtyFlag dirtyFlag = DirtyFlag::NONE;
auto dirtyIter = _priorityDirtyFlagMap.find(listenerID);
if (dirtyIter != _priorityDirtyFlagMap.end())
{
dirtyFlag = dirtyIter->second;
}
if (dirtyFlag != DirtyFlag::NONE)
{
//排序操作
}
在事件分发函数开始时,调用updateDirtyFlagForSceneGraph(),对_dirtyNodes中的node关联的所有监听器的ID置脏标记SCENE_GRAPH_PRIORITY。
只有使用resumeEventListenersForTarget方法,恢复指定node的所有监听器时,会把该node加入_dirtyNodes。
4.2 Node中
sortAllChildren setGlobalZOrder setLocalZOrder三个方法都会对参数node执行setDirtyForNode,因为这些node的优先级可能发生变化,分发事件前需要重新对他们排序,从而对监听器容器重新排序。
5. 总结
脏标记是为了判断是否有必要对监听器容器排序而设置。在事件分发时,当发现监听器容器之前有添加删除操作时,需要对监听器容器进行排序,把事件依次分发到排序后的容器里的监听器,由监听器进行事件处理。
node的监听器被暂停恢复后,暂停过的这些监听器容器也需要重新排序。
node优先级可能改变时,调用setDirtyForNode。
Cocos2d-x 学习笔记(15.3) EventDispatcher DirtyFlag 脏标记的更多相关文章
- Cocos2d-x 学习笔记(15.2) EventDispatcher 事件分发机制 dispatchEvent(event)
1. 事件分发方法 EventDispatcher::dispatchEvent(Event* event) 首先通过_isEnabled标志判断事件分发是否启用. 执行 updateDirtyFla ...
- Cocos2d-x 学习笔记(15.1) EventDispatcher
EventDispatcher对监听器进行管理,围绕着监听器工作.可以添加.删除.暂停/恢复监听器.分发事件到监听器. 1. 一些成员 /** 把ListenerID和同ID监听器的容器对应 */ s ...
- Cocos2d-x 学习笔记(15.4) EventDispatcher 事件分发具体逻辑 dispatchEventToListeners函数
dispatchEvent(Event* event)方法在对事件对应的监听器进行重新排序后,进行事件分发操作.具体操作由dispatchEventToListeners方法执行. 该方法声明: vo ...
- Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法
Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法 Summary的用法和Group一样简单,分为两步: 启用Summary功能 在Feature标签内,添加如 ...
- SQL反模式学习笔记15 分组
目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. ...
- 并发编程学习笔记(15)----Executor框架的使用
Executor执行已提交的 Runnable 任务的对象.此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节.调度等)分离开来的方法.通常使用 Executor 而不是显式地创建 ...
- R语言可视化学习笔记之添加p-value和显著性标记
R语言可视化学习笔记之添加p-value和显著性标记 http://www.jianshu.com/p/b7274afff14f?from=timeline 上篇文章中提了一下如何通过ggpubr ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Beego 学习笔记15:布局页面
页面布局 1> 一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2> ...
随机推荐
- Linux环境基于CentOS7 搭建部署Docker容器
1.Docker容器概述 区分Docker容器技术和VM虚拟机技术: evernotecid://394EFE90-9CE0-4D65-A8CD-DFEC0DC8061E/appyinxiangcom ...
- Jackson 序列化和反序列化
博客地址:https://www.moonxy.com 一.前言 Jackson 功能很强大,既能满足简单的序列化和反序列化操作,也能实现复杂的.个性化的序列化和反序列化操作.到目前为止,Jackso ...
- 创建进程池与线程池concurrent.futures模块的使用
一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...
- 网络编程之socket模块
一.TCP协议 TCP是可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:电子邮件.文件传输程序. 二.基于TCP ...
- pyhon 浅copy
一般python的copy是没有用的, 但是让你熟悉浅copy给你举个清晰的例子 person = ["name",["money",100]] p1 = pe ...
- Java常识及数据类型
上次介绍完了JDK的下载,安装,以及配置了环境变量 .这次我们来讲讲Java的常识及Java的数据类型; 常见Java开发工具 编辑器: 1:UltraEdit; 2:EditPlus等; 集成开发环 ...
- redis实现网关限流(限制API调用次数1000次/分)
添加maven依赖,使用springboot2.x版本 <dependency> <groupId>org.springframework.boot</groupId&g ...
- .Net Core 添加 Swagger 支持
1. NuGet 中添加 Swashbuckle.AspNetCore 2.添加 Startup 信息 将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- asp.net core 使用Mysql和Dapper
序曲:学习编程最好的方式就是敲代码,没有比这个更好的方法,哪怕你看了上百G的视频,都不如你自己敲几行代码更为有效.还有要记得敲完代码然后写一篇随笔来记录一下你所学所想. 大家都知道,.netcore是 ...