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 脏标记的更多相关文章

  1. Cocos2d-x 学习笔记(15.2) EventDispatcher 事件分发机制 dispatchEvent(event)

    1. 事件分发方法 EventDispatcher::dispatchEvent(Event* event) 首先通过_isEnabled标志判断事件分发是否启用. 执行 updateDirtyFla ...

  2. ‎Cocos2d-x 学习笔记(15.1) EventDispatcher

    EventDispatcher对监听器进行管理,围绕着监听器工作.可以添加.删除.暂停/恢复监听器.分发事件到监听器. 1. 一些成员 /** 把ListenerID和同ID监听器的容器对应 */ s ...

  3. ‎Cocos2d-x 学习笔记(15.4) EventDispatcher 事件分发具体逻辑 dispatchEventToListeners函数

    dispatchEvent(Event* event)方法在对事件对应的监听器进行重新排序后,进行事件分发操作.具体操作由dispatchEventToListeners方法执行. 该方法声明: vo ...

  4. Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法

    Ext.Net学习笔记15:Ext.Net GridPanel 汇总(Summary)用法 Summary的用法和Group一样简单,分为两步: 启用Summary功能 在Feature标签内,添加如 ...

  5. SQL反模式学习笔记15 分组

    目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. ...

  6. 并发编程学习笔记(15)----Executor框架的使用

    Executor执行已提交的 Runnable 任务的对象.此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节.调度等)分离开来的方法.通常使用 Executor 而不是显式地创建 ...

  7. R语言可视化学习笔记之添加p-value和显著性标记

    R语言可视化学习笔记之添加p-value和显著性标记 http://www.jianshu.com/p/b7274afff14f?from=timeline   上篇文章中提了一下如何通过ggpubr ...

  8. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Beego 学习笔记15:布局页面

    页面布局 1>     一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2>     ...

随机推荐

  1. Apache Hadoop集群安装(NameNode HA + SPARK + 机架感知)

    1.主机规划 序号 主机名 IP地址 角色 1 nn-1 192.168.9.21 NameNode.mr-jobhistory.zookeeper.JournalNode 2 nn-2 ).HA的集 ...

  2. java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200.

    报错信息 java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200. Please ...

  3. Mysql高手系列 - 第14篇:详解事务

    这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...

  4. Nginx反向代理之动静分离

    我们已经知道了什么是正向代理与反向代理,这次我们就讲一下Nginx的动静分离的案例,其实质运用的就是反向代理,专门用一台服务器代理服务器上的图片资源. 想使用代理必然要配置代理,配置反向代理,必须要用 ...

  5. swagger2的简单使用

    swagger2的简单使用 优点: 可以生成文档形式的API并提供给不同的团队使用 便于自己单测 无需过多冗余的word文档,这一点很重要,因为我在工作中就遇到这么一个情况,由于开发使用的文档和最新文 ...

  6. 美化H标签

    美化H标签 .article-content h2{ font-size:18px; font-weight:bold; background-color: #CEEEFA; border-botto ...

  7. gcc编译命令总结

    一步到位编译:gcc hello.c -o hello 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o 预处理 gcc -E hello.c -o hello.i -E:仅 ...

  8. springboot系列之01-产生的背景及其优势

    未经允许,不得转载 原作者:字母哥博客 本文完整系列出自:springboot深入浅出系列 一.前置说明 本节大纲 spring boot 诞生的背景 Spring boot 改变了什么 Spring ...

  9. javascript中数组常用的方法和属性

    前言 在javascript中,数组是一种非常重要的数据类型,我们时常会和它打交道,最近在开发项目中频繁的使用到数组,但是自己对数组的众多方法已经是非常模糊了,为了方便自己以后能够更好的使用数组中的属 ...

  10. Creating a Store Locator with PHP, MySQL & Google Maps(保存地图坐标 经纬度方法 google mysql)

    Google Geo APIs Team August 2009 This tutorial is intended for developers who are familiar with PHP/ ...