Scheduler类源代码不完全分析(分量足

本文详细分析了Cocos2d-x框架中的Scheduler类及其内部的Timer类,包括Timer的结构、抽象方法、子类实现以及Scheduler的两种调度模式——按帧调度和按时间间隔调度。通过双向链表和哈希表的数据结构,Scheduler实现了高效的定时器管理和事件触发。同时,文章介绍了如何注册、取消调度以及Scheduler的主要执行逻辑。
摘要由CSDN通过智能技术生成
一,Timer类
1,是Ref的子类,采用引用计数管理内存
2,主要方法update( )实现了一个定时器逻辑
3,抽象类,必须被继承使用
  virtual void trigger() = 0 ;//到时触发的方法
 virtual void cancel() = 0; //取消定时器
//两个为纯虚函数,需要在子类重载实现

protected :
   
    Scheduler* _scheduler; // weak ref 弱引用,在这个指针被赋值时并没有增加对 _scheduler的引用计数
    float _elapsed;   //度过的时间
    bool _runForever; //标记是否永久运行
    bool _useDelay;   //标记是否使用延迟
    unsigned int _timesExecuted; //纪录已经执行的次数
    unsigned int _repeat; //0 = once, 1 is 2  executed 定义执行的总次数(_repeat+1次)
    float _delay;     //延迟时间
    float _interval;  //时间间隔,隔 _interval调用一次

//初始化方法
    void setupTimerWithInterval( float seconds, unsigned int repeat, float delay);
{
_elapsed = - 1 ;  
_interval = seconds;
_delay = delay;
_useDelay = ( _delay > 0.0f ) ? true : false ;
_repeat = repeat;
_runForever = ( _repeat == CC_REPEAT_FOREVER ) ? true : false ;
//无限重复次数为一个unsignedint的最大值  #define CC_REPEAT_FOREVER (UINT_MAX - 1 )
}

4,Timer的子类 TimerTargetSelector(绑定Ref基类对象)
//初始化方法
   bool initWithSelector( Scheduler * scheduler, SEL_SCHEDULE selector, Ref * target, float seconds, unsigned int repeat, float delay);
// SEL_SCHEDULE是一个Ref函数指针定义

void TimerTargetSelector ::trigger()
{
   
if ( _target && _selector )
    {
        (
_target ->* _selector )( _elapsed );//调用初始化传进来的回调方法
    }
}

void TimerTargetSelector ::cancel()
{
   
_scheduler -> unschedule ( _selector , _target );
}

5, TimerTargetCallback(绑定任意对象)

bool TimerTargetCallback ::initWithCallback( Scheduler * scheduler, const ccSchedulerFunc & callback, void *target, const std :: string & key, float seconds, unsigned int repeat, float delay)
{
   
_scheduler = scheduler;
   
_target = target;
   
_callback = callback;
   
_key = key;
   
setupTimerWithInterval (seconds, repeat, delay);
   
return true ;
}

void TimerTargetCallback ::trigger()
{
   
if ( _callback )
    {
       
_callback ( _elapsed );
    }
}

void TimerTargetCallback ::cancel()
{
   
_scheduler -> unschedule ( _key , _target );
}

6. TimerScriptHandler与以上两个类似,有关脚本的



二,Scheduler类
巨多。。好难。。看不懂。。

首先,
Scheduler有两种调度模式:
1,按帧调度(被集成在Node类中)
 
数据结构:
typedef struct _listEntry //双向链表
{
   
struct _listEntry   *prev, *next;
   
ccSchedulerFunc     callback;
   
void                 *target;
   
int                 priority;
   
bool                 paused;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值