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。
最新文章
- jquery tab 插件
- 三元表达式、逻辑表达式 与 &;&;、||的妙用
- Kali linux渗透测试的艺术 思维导图
- 2的N次方 【转】
- c语言指针说解
- rhel5.8安装mysql测试
- TypeConverter的使用
- Linux目录结构介绍-http://yangrong.blog.51cto.com/6945369/1288072
- python+matplotlib+绘制不同图标类型
- jmeter将上一个接口返回值作为下一个接口的请求参数
- hive metastore &;&; hiveserver2 . jvm 配置调整优化
- SQLSERVER数据库调优
- Centos7.2中安装pip
- Annoy 近邻算法
- [contest 781] 9.6
- linux令普通用户拥有root权限
- PerformEraseBackground 擦除背景(ThemeServices)
- PHP 使用非对称加密算法(RSA)
- 为什么使用this构造器
- ElasticSearch5.3安装head插件及连接ElasticSearch
热门文章
- OPC—— KepServer.ServerState返回值为3和OPCConfig.exe配置文件的根目录
- sql server 2014 的安装
- TestNG(五) 5-7 套件测试
- charles 结构体
- SQLServer之MAX() 函数
- 47 (OC)* OC反射机制
- LayUI 上传IE11上传格式错误之后, layer.load(1)的动画一直在,没有关闭(仅限IE11)
- Postman 之 HTTP Multipart/form-data 调试
- jmeter 分布式疑难杂症 待完善
- 微项目:一步一步带你使用SpringBoot入门(二)