EventDispatch机制

libevent源代码分析——event_dispatch() (二) 在上篇文章中介绍关于event_dispatch的大体框架,这里对其中的几个重要的函数解释说明 1、timeout_correct(base,&tv) static void 889 timeout_correct(struct event_base *base, struct timeval *tv) 890 { 891 struct event **pev; 892 阅读详情

cocos2dx 3.x中的事件机制原理:

通过访问Node的全局Zorder来排列优先级。

            _globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node);


_globalZOrderNodeMap 作为迭代的容器,最后处理根节点排序的结果(会清理掉当前存放的节点),真正有效的数据时排列好的:_nodePriorityMap。

首先遍历Scene下的所有子Layer(Node*),把子节点中比当前Layer优先级数值小的存放在_nodePriorityMap,接着清除子Layer中比当前Layer优先级小的节点,然后把当前节点放入_globalZOrderNodeMap 。

每个Node都有一个sortChildren操作,排列出来的就是根据Zorder,只要先处理比当前Layer深度优先的(Zorder),再处理当前layer,和小于或等于的Children——整个原理就跟二叉树中序遍历比较类似,判定条件是Zorder。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. oid EventDispatcher::visitTarget(Node* node, bool isRootNode)  
  2. {      
  3.     int i = 0;  
  4.     auto& children = node->getChildren();  
  5.       
  6.     auto childrenCount = children.size();  
  7.       
  8.     if(childrenCount > 0)  
  9.     {  
  10.         Node* child = nullptr;  
  11.         // visit children zOrder < 0  
  12.         for( ; i < childrenCount; i++ )  
  13.         {  
  14.             child = children.at(i);  
  15.               
  16.             if ( child && child->getLocalZOrder() < 0 )  
  17.                 visitTarget(child, false);  
  18.             else  
  19.                 break;  
  20.         }  
  21.           
  22.         if (_nodeListenersMap.find(node) != _nodeListenersMap.end())  
  23.         {  
  24.             _globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node);  
  25.         }  
  26.           
  27.         for( ; i < childrenCount; i++ )  
  28.         {  
  29.             child = children.at(i);  
  30.             if (child)  
  31.                 visitTarget(child, false);  
  32.         }  
  33.     }  
  34.     else  
  35.     {  
  36.         if (_nodeListenersMap.find(node) != _nodeListenersMap.end())  
  37.         {  
  38.             _globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node);  
  39.         }  
  40.     }  
  41.     //递归的所有过程中只有根节点进入(Scene),事件的派发级是依据<span style="font-family: Arial, Helvetica, sans-serif;">_nodePriorityMap中的结果去派发</span>  
  42.   
  43.     if (isRootNode)  
  44.     {  
  45.         std::vector<float> globalZOrders;  
  46.         globalZOrders.reserve(_globalZOrderNodeMap.size());  
  47.           
  48.         for (const auto& e : _globalZOrderNodeMap)  
  49.         {  
  50.             globalZOrders.push_back(e.first);  
  51.         }  
  52.           
  53.         std::sort(globalZOrders.begin(), globalZOrders.end(), [](const float a, const float b){  
  54.             return a < b;  
  55.         });  
  56.           
  57.         for (const auto& globalZ : globalZOrders)  
  58.         {  
  59.             for (const auto& n : _globalZOrderNodeMap[globalZ])  
  60.             {  
  61.                 _nodePriorityMap[n] = ++_nodePriorityIndex;  
  62.             }  
  63.         }  
  64.           
  65.         _globalZOrderNodeMap.clear();  
  66.     }  
  67. }  


_nodePriorityIndex 为SceneGraphPriority控制量,最后组合成从0到N不重复的数字队列,去标示每个Node,所有的Node具有不同的优先级。

来源:http://blog.youkuaiyun.com/jingzhewangzi/article/details/40644955

cocos eventDispatcher 事件分发机制 简介 cocos的事件分发机制,先创建事件,然后注册到事件管理中心_eventDispatcher,通过发布事件得到响应进行回调,完成事件流。 _eventDispatcher是Node的属性,通过它管理当前节点(场景、层、精灵等)的所有事件的分发。但它本身是一个单例模式值的引用,在Node的构造函数中,通过Director::getInstance()->getEventDispatch... 阅读详情

相关推荐

eventpy —— Python 事件派发和回调代码库

我(wqking)开发,支持Python 3和Cython。 eventpy是一个 Python 事件库,它提供的工具允许应用程序组件通过调度事件并监听它们来相互通信。使用eventpy,您可以非常轻松地实现信号/插槽机制或观察者模式。 GitHub:https://github.com/wqking/eventpy 特性 支持同步事件调度和异步事件队列。 可配置和可扩展的策略。 支持嵌套事件...

kbasm的专栏 907

libevent源代码分析--event_dispatch() (一)

event_dispatch这个函数是以上所有处理都结束以后,最后的一个借口调用,其实和这个函数类似的函数有好几个,接下来一一分析。 int 405 event_dispatch(void) 406 { 407 return (event_loop(0)); 408 } 可以返现event_dispatch只有一个调用event_loop(), 但是event_loop函数的调

鱼思故渊的专栏 7470

Android开发中各类组件样式用法详解与实战

在Android中,每一个可交互或需编程控制的组件都应具备唯一的ID,以便在Java/Kotlin代码中通过或ViewBinding等方式获取其实例引用。ID的定义遵循以下语法:这里的@+id/表示向R.java资源类注册一个新的ID常量。一旦声明,系统会在生成对应的int值。后续若其他组件需要引用此ID(如设置约束目标),则使用(不带号),表示仅引用已有资源。例如,在ConstraintLayout中设置两个组件间的约束关系:<Button此处。

weixin_35899324的博客 983

UE4 蓝图事件调度器Event Dispatcher

UE4 蓝图事件调度器Event Dispatcher1.事件调度器的含义2.蓝图中事件调度器的位置3.如何使用事件调度器Event Dispatcher1.灯的创建:2. 创建一个灯的开关Toggle和事件调度器3.编写开关灯的逻辑4绑定上**事件调度器**5.在Toggle里调用Dispatcher_ToggleLight4.运行测试5.取消绑定时间调度器6.结构图7.应用 1.事件调度器的含义 事件调度器是蓝图中按照观察者模式(订阅)而添加的。观察者模式较常用的一种设计模式!他具有高效低耦合的特性!

qq_40669895的博客 3646

YOLO11实战 第001期-基于yolo11的CrowdHuman密集行人目标检测实战文档(yolo格式数据免费获取)

1.数据阶段在拥挤/遮挡场景下,使用crowdhuman数据集重训练后的yolo11,效果表现较好。crowdhuman数据集标签如下,有Head BBox、Visible BBox、Full BBox。如下图显示:数据集介绍CrowdHuman数据集是旷世发布的用于行人检测的数据集,图片数据大多来自于google搜索。CrowdHuman数据集数据量比较大,15000张,5000张,验证集4370张。训练集和验证集中共有470K个实例,约每张图片包含23个人,同时存在各种各样的遮挡。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 2161

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 418

事件分发(EventDispatcher)模式

该模式实际上是监听模式的一种扩展。由事件(Event)驱动,每当有事件产生的时候,由事件分发器分发给特定的事件处理器处理该事件。类图:核心类:EventDispatcher——事件分发中心,每个来的事件都由该类分发到特定的处理者                Event——事件接口,不同的事件类型都要实现该接口                Handler——处理器接口,不同的处理器都要实现改接口

THEONE10211024的专栏 1万+

在WPS/Office中免费使用AI,快速提升办公效率!​

《免费解锁WPS/Office AI办公神器教程》摘要: 本教程详解如何通过第三方插件OfficeAI免费实现WPS/Office智能办公,突破官方付费限制。从安全设置到安装配置,手把手教学,涵盖文档生成、PPT美化、Excel图表等核心功能。关键优势包括零成本、全场景支持及云端/本地双模式切换,并附常见问题解决方案。注意需使用WPS 2024+版本,安装时需临时关闭杀毒软件。教程强调工具来源合法性,建议商用购买正版授权。(149字)

杜哥无敌的博客 2303

事件触发器---dispatchEvent

转载自:http://blog.youkuaiyun.com/magic__man/article/details/51831227 dispatchEvent是作为高级浏览器(如chrome、Firfox等)的事件触发器来使用的,那么什么是事件触发器?就是触发事件的东西。可能有人觉得有点莫名其妙,触发事件不是在交互中被触发的吗?的确,通常情况下,事件的触发都是由用户的行为如点击、刷新等操作实现,但是,其实

aaa333qwe的博客 2264

在Qt中使用EtherCAT-SOEM的初始化中,状态机卡在PreOp->Save-Op过程中,出现State=0x12, Error=0x001e错误的解决办法

1.在调试EtherCAT软件过程中,一直出现配置从站进不了Save_op状态,通过下函数检查从站状态: //使用的从站编号为1 只有1个从站 ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(1); //设置到安全模式 ec_statecheck(1, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); printf("Slave %d State=0x%2.2x StatusCode=0x%4

zeal_for_rov的博客 6828

万字详解 PostgreSQL 的详细安装方式(Linux、Windows、macOS、Docker 全平台覆盖)

本文详细介绍了PostgreSQL在四大主流环境下的安装方法: Linux系统:针对Ubuntu/Debian和CentOS/RHEL系,分别提供APT/YUM仓库安装步骤,包括初始化配置和服务管理 Windows系统:通过图形化安装程序指导完成安装,包含组件选择、密码设置和pgAdmin配置 macOS系统:推荐使用Homebrew一键安装,支持Apple Silicon和Intel芯片 Docker容器:提供容器化部署方案(文中未展开) 文章强调安装前的版本选择、权限管理和存储规划,并针对各平台给出验证

数据知道的博客 4498

cocos2dx Eventdispatch事件监听

现在的项目中 基本上都有用到事件派发机制 简单理解就是在某一处设置监听,当触发某一事件时,派发这个监听,这样就能在监听处做出对应处理 大体逻辑即为 一个缓存cacheList 监听函数(类型,回调函数) 移除监听函数(类型,回调函数) 派发事件 cacheListener( eventType, callback ) registerEventListener( eventType,

GavinFly的专栏 1705

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

机器学习深度学习业余选手 1001

201710042130->事件派发eventdispatch

目的:分发各种事件到已经注册好事件的对象上边 关键点: 1.利用string,delegate的字典缓存好事件 2.搜索key值返回的delegate value去执行所有注册在委托下的事件 3.事件字典具备增删查功能 详细代码: public delegate void ObjectParamDelegate(object obj);     public class Base

qq_28902031的博客 538

教程: 将 SolidWorks 设计导出为 ROS 的 URDF

请按照以下步骤应用自定义徽标纹理:创建徽标材质文件:techniquepass材质名称:测试/材质颜色属性:环境、漫反射、镜面和发射都设置为白色(1 1 1 1),这意味着该材质看起来完全是白色的。纹理 在表面应用纹理图像 logo.png。将材质文件复制到 gazebo matrial:复制徽标图像:将 “徽标 ”替换为机器人上徽标所在位置的适当参考值。按照以上步骤,您就可以在 Gazebo 中为机器人添加自定义材质和纹理,包括徽标。

机器人控制与仿真应用 2457

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2460

事件分发机制

什么是事件分发机制 EventDispatch是响应用户事件的一种机制。 基本概念: 事件监听器封装了事件处理的代码;事件调度器通知用户事件的监听器;事件对象包含了关于事件的信息。 事件监听器的5种类型 EventListenerTouch - 响应触摸事件 EventListenerKeyboard - 响应键盘事件 EventListenerAccel

u014797209的博客 412

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android Event分发机制

Android event dispatch mechanism总的来说,Android的事件分发都是针对View的,但是要知道,直接继承自View的类分为两类,一类是诸如TextView、SurfaceView的“单一”View,说是单一是因为这些view不可以嵌套其他view,另一类就是ViewGroup,可以嵌套其他的view,常用的Linearlayout、Framelayout、Adapt

Ethan的博客 544

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

200307&react组件通信

react组件通信 梗概 1.相关概念 2.涉及场景 3.参考 4.行动清单 进入主题.. 1. 相关概念 1.1 props 1.2 EventDispatch 1.3 路由传参 1.4 onRef 1.5 对比 2 涉及场景 2.1 父子组件/嵌套组件 2.2 兄弟组件/无嵌套组件 1.1 props 原理:子组件里面利用 props 获取父组件方法直接调用,从而改变父组件的值 /...

向阳小宇宙的专栏 193

学习笔记13:玩法系统基础

一般来说,对于多线程共享数据,需要使用mutex来同步,这样共享数据才不至于发生不可预测的修改/读取,然而,mutex的使用也带来了额外的系统开销,ring buffer/queue 的引入,就是为了有效地解决这个问题,因其特殊的结构及算法,可以用于2个线程中共享数据的同步,而且必须遵循1个线程push in,另一线程pull out的原则。但是回调函数使用不当会出现严重的bug,例如:在游戏对象死亡后,扣血的回调函数困难还会被调用,可以删除这个回调函数,但是困难会造成错误。回调函数通常用于事件处理、

qq_68066520的博客 192

c#基础知识3:事件

今天在想unity的start upate等等这种是怎么实现的时候,发现了unity的sendmessage机制,然后sendmessage机制,又有人说有性能问题,有人在网上用c#自带的event机制重写了这个message机制,类似于flash的event机制。于是去搜索c#自带的event机制,自己写了个小demo来实现eventDispather。 c#的event定义, 首先

sshong的专栏 964

设计模式之观察者模式

一、观察者模式介绍 二、模式引用之Lua中的事件分发 LuaEvent.lua:封装了一个具体的事件相关的内容,一个LuaEvent是一个发布者,它包含了一系列订阅者,以及发布-订阅等方法; local LuaEvent={} function LuaEvent:New(eventId) local tb={} tb.eventId=eventId tb.obse...

mozhi 427

前端事件系统(四)

事件派发 首先来看看jQuery.event的dispatch方法 dispatch: function( event ) { // 对event对象进行修正 event = jQuery.event.fix( event ); var i, j, ret, matched, handleObj, handlerQueue = [], ...

207

Kubernetes Python 客户端 V1Scheduling 模型深度解析:RuntimeClass 调度约束的建模、序列化与实战

本文以官方 Kubernetes Python 客户端(当前仓库对应 Kubernetes API release-1.37 的 OpenAPI 规范)中 `kubernetes.aio.client.models.v1_scheduling` 模块为核心,系统讲解异步客户端模型 `V1Scheduling` 的字段语义、嵌套模型、序列化机制与构造方式,并给出可直接运行的代码示例。读完本文,你将掌

gitblog_00607的博客 725

EventDispatcher.js 使用教程

EventDispatcher.js 使用教程 项目介绍 EventDispatcher.js 是一个轻量级的 JavaScript 事件调度库,由 mrdoob 开发并维护。该库允许开发者在其应用程序中实现自定义事件的监听和触发机制,从而提高代码的模块化和可维护性。EventDispatcher.js 主要特点包括: 轻量级:库体积小,对项目影响小。 易用性:API 简单直观,易于上手。 灵活...

gitblog_00343的博客 652
上一篇: cocos2d-x 3.3 RC 个人升级总结 Director的主线解析
下一篇: 实现iOS应用内付费(In-App Purchase)全教程
devttq
博客等级 码龄12年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值