cocos2dx 3.10 事件机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2dx 3.10 事件机制相关的知识,希望对你有一定的参考价值。

参考技术A

cocos2dx的事件机制里存在三类: Event、EventListener、EventDispatcher
先理解一下它们之间的关系
当我们按下按钮时(Event),会触发一个特定的事件(EventListener相当于回调函数),而这个特定的事件又存储在EventDispatcher里,可能按下这个按钮会触发多个事件,而事件的先后就是靠EventDispatcher来决定的。

Event的相关类

当出现来自鼠标,键盘,触屏,摇杆等输入源的输入时,这个事实称之为事件

引擎无时无刻都在感受事件。

Event

可以看出Event主要包含三个变量,一个是事件类型_type(也就是定义的枚举类型:触摸、键盘等),isStopped判断事件是否停止,只要事件停止,其相关的Listener都要停止callback调用。

EventTouch
它对应于四种触摸操作,不同的EventCode可以告诉Listener来调用不同的callback。

EventCustom
它是用户自定义事件,userData记录用户自定义数据,另一个eventName是用户给事件取的别名

上面的源码都有英文注释,我就不多解释了,我只说一个最重要的_isRegistered,它判断事件有没有被注册,如果没有被注册就不会触发。(如何注册事件?将事件加入dispatcher)

在讲它之前,我们先了解一下它的一个重要变量。

sceneGraphListeners: 一个事件(比如说触摸事件),需要按照一定的响应序列,依次对这些Node进行事件响应,所以该类型的事件都会绑定一个与此相关联的node,并且 响应顺序是与node在scene下的zorder相关的 。该类型下的事件优先级统一为0。(与渲染树有关)

fixedListeners: 优先级根据 fixedPriority 的数值从小往大排序、

只要出现了删除,修改,添加监听器的时候,监听器列表需要重新排序,都需要设置相应的 DirtyFlag 操作。但是 Cocos-2dx v3.10 里面的 updateListeners 函数有删除监听器的操作,然而并没有设置相应的 DirtyFlag 操作。
会抛出下面的异常

Gt0Index() 方法其实就是获取到当前监听器中 fixedPriority == 0 的监听器在监听器向量中的位置,它 只有在给 Listener 排序的时候会设置,但是如果更新了对应 ListenerID 的向量(EventListenerVector),但是没有重新排序,就会出现 _gt0Index 未及时更新的情况 ,导致抛出这个异常。

引用:
Cocos2dx游戏引擎(3.x)----新的事件分发机制
cocos2dx之event事件(一)
cocos2dx之event事件(三):事件分发器EventDispatcher
Cocos2dx-v3.10 事件分发机制源码解析

Linux 内核 内存管理RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )



文章目录



一、RCU 机制适用场景



在上一篇博客 ​​【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )​​ 中 , 分析了 RCU 机制的优势与弊端 ;

优势 : RCU 的优势是 " 读者 " ( 读取共享数据的线程 ) 不需要承担同步开销 ,

同步开销指的是 : ① 获取 " 锁 " , ② 执行 " 原子指令 " , ③ 执行 " 内存屏障 " ;



弊端 : 与此相对的 RCU 机制也有一定弊端 , " 写者 " ( 修改共享数据的线程 ) 需要 承担很大的同步开销 , 其需要

① 延迟对象释放 ,

② 读取 并 复制 共享数据 ,

③ 必须使用 互斥锁 机制 ;

④ 使用复杂 , 比其它互斥锁要复杂 ;



RCU 机制 适用于 " 读者 " ( 读取共享数据的线程 ) 性能要求高的场景 ;



二、RCU 机制特点



RCU 机制 只能 保护 " 动态分配 “ 的 ” 共享数据结构 " , 该 共享数据 必须 通过指针访问 ,

这里的 动态分配 指的是 使用 ​​malloc​​​ , ​​calloc​​ 等内存申请函数 , 申请的数据结构 , 不是栈内存数据结构 ;

RCU 机制保护的 " 临界区 " ( 函数代码块 ) 中 , 不能执行耗时操作 , 尤其是 不能有 ​​sleep​​ 休眠操作 ;



读写不对称 : RCU 机制 读写不对称 , " 写者 “ ( 修改共享数据的线程 ) 性能不作要求 , 可以高也可以低 , 但是 ” 读者 " ( 读取共享数据的线程 ) 性能要求很高 ;



三、使用 RCU 机制保护链表



RCU 机制 除了保护 普通指针 指向的数据 之外 , 还可以用于 保护 " 链表 " 数据结构 ;



Linux 内核中 , 提供了 一系列的 标准函数 , 可以 使用 " RCU 机制 " 保护 " 双链表 " ;



标准链表元素 : 使用 RCU 机制 保护 的 链表 , 链表中的 标准 元素 , 仍然可以使用 ;

标准函数 RCU 变体 : 遍历 , 修改 , 删除 链表元素 时 , 需要调用 标准函数的 RCU 变体 ;



以上是关于cocos2dx 3.10 事件机制的主要内容,如果未能解决你的问题,请参考以下文章

DOM事件机制

Spring事件监听机制源码解析

事件驱动机制是啥?

Android 事件分发事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )

事件传递和响应机制

深入理解Spring的容器内事件发布监听机制