cocos2d调度器(定时执行某函数)

调度器(scheduler)

继承关系

原理介绍

Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:

  1. 每当Node不再可见或已从场景中移除时,调度器会停止。
  2. Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
  3. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。

基础用法

游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测。为了解决以上问题,我们引入了调度器,这使得游戏能够更好的处理动态事件。Cocos2d-x提供了多种调度机制,在开发中我们通常会用到3种调度器:

  1. 默认调度器:schedulerUpdate()
  2. 自定义调度器:schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
  3. 单次调度器:scheduleOnce(SEL_SCHEDULE selector, float delay)

以下我们来对这3种调度器做简单的介绍。

默认调度器(schedulerUpdate)

该调度器是使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。

Cocos2d-x中Node默认是没有启用update事件的,因此你需要重载update方法来执行自己的逻辑代码。

通过执行schedulerUpdate()调度器每帧执行 update方法,如果需要停止这个调度器,可以使用unschedulerUpdate()方法。

以下代码用来测试该调度器:


1

2

3

HelloWorldScene.h

void update(float dt) override;(这是第一步,重载update函数)


1

2

3

4

5

6

7

8

9

10

11

12

13

HelloWorldScene.cpp

bool HelloWorld::init()

{

    ...

    scheduleUpdate();(这是第二步,在类的初始化函数中调用shecduleUpdate())

    return true;

}

void HelloWorld::update(float dt)(这是第三步,定义重载的update函数)

{

    log("update");

}

你会看到控制台不停输出如下信息


1

2

3

4

cocos2d: update

cocos2d: update

cocos2d: update

cocos2d: update

自定义调度器(scheduler)

游戏开发中,在某些情况下我们可能不需要频繁的进行逻辑检测,这样可以提高游戏性能。所以Cocos2d-x还提供了自定义调度器,可以实现以一定的时间间隔连续调用某个函数。

由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上。

同样,取消该调度器可以用unschedule(SEL_SCHEDULE selector, float delay)

以下代码用来测试该调度器:


1

2

3

HelloWorldScene.h

void updateCustom(float dt);


1

2

3

4

5

6

7

8

9

10

11

12

13

HelloWorldScene.cpp

bool HelloWorld::init()

{

    ...

    schedule(schedule_selector(HelloWorld::updateCustom), 1.0f, kRepeatForever, 0);

    return true;

}

void HelloWorld::updateCustom(float dt)

{

    log("Custom");

}

在控制台你会看到每隔1秒输出以下信息


1

2

3

4

5

cocos2d: Custom

cocos2d: Custom

cocos2d: Custom

cocos2d: Custom

cocos2d: Custom

我们来看下scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:

  1. 第一个参数selector即为你要添加的事件函数
  2. 第二个参数interval为事件触发时间间隔
  3. 第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
  4. 第四个参数delay表示第一次触发之前的延时

单次调度器(schedulerOnce)

游戏中某些场合,你只想进行一次逻辑检测,Cocos2d-x同样提供了单次调度器。

该调度器只会触发一次,用unschedule(SEL_SCHEDULE selector, float delay)来取消该触发器。

以下代码用来测试该调度器:


1

2

3

HelloWorldScene.h

void updateOnce(float dt);


1

2

3

4

5

6

7

8

9

10

11

12

13

HelloWorldScene.cpp

bool HelloWorld::init()

{

    ...

    scheduleOnce(schedule_selector(HelloWorld::updateOnce), 0.1f);

    return true;

}

void HelloWorld::updateOnce(float dt)

{

    log("Once");

}

这次在控制台你只会看到一次输出


1

cocos2d: Once

时间: 2024-08-08 22:05:37

cocos2d调度器(定时执行某函数)的相关文章

Linux编程定时执行某函数

 前言: linux中信号提供了软中断的作用.提供了一种处理异步时间的方法 ,  可以通过信号合理的安排异步任务. linux定义了以下主要的系统信号: 名称                        默认动作                        说明 SIGHUP                   终止进程                        终端线路挂断 SIGINT                   终止进程                        中

Chromium网页渲染调度器(Scheduler)实现分析

在采用线程化渲染方式渲染网页时,Chromium依赖一个调度器协调Main线程和Compositor线程的执行,同时也通过这个调度器决定它们什么时候该执行什么操作.调度器将Main线程和Compositor线程的当前状态记录在一个状态机中,然后通过这个状态机决定下一个要执行的操作.这个操作在满足当前设置条件下是最优的,因此可以使网页渲染更快更流畅.本文接下来就分析Chromium网页调度器的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 调度器实现

linux调度器源码分析 - 初始化(二)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明调度器在系统启动初始化阶段是如何初始化和工作的.通过上期文章我们知道,在多核CPU和SMP系统中,每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq.在初始化时就是对这三个结构进行初始化. init_tas

Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872594 日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 我们前面提到linux有两种方法激活调度器:核心调度器和 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内

一定间隔时间下重复执行一个函数的几个方法

如果有个操作,我们需要过一会儿再做,或者每隔一段时间就要做一次.可以有很多种做法. 独立线程 是的,对.NET Framework本身一知半解的程序员才会使用这种方案.不过,现实中这个方案其实并不少见. public static void Repeat(this Action action, TimeSpan interval) { new Thread(new ThreadStart(() => { while(true) { Thread.Sleep(interval); action()

Hadoop Yarn调度器的选择和使用

一.引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色.在讨论其构造器之前先简单了解一下Yarn的架构.上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负责整个集群中包括内存.CPU等资源的管理:ApplicationMaster负责应用程序在整个生命周期的任务调度:NodeManager负责本节点上资源的供给和隔离:Container可以抽象的看成是运行任务的一个容器.本文讨论的调度器是在ResourceManager组建中进行调度的,接

(14)Reactor调度器与线程模型——响应式Spring的道法术器

本系列文章索引<响应式Spring的道法术器>前情提要 Spring WebFlux快速上手 | Spring WebFlux性能测试前情提要:Reactor 3快速上手 | 响应式流规范 | 自定义数据流本文测试源码 2.4 调度器与线程模型 在1.3.2节简单介绍了不同类型的调度器Scheduler,以及如何使用publishOn和subscribeOn切换不同的线程执行环境. 下边使用一个简单的例子再回忆一下: @Test public void testScheduling() { F

hadoop调度器的原理和应用场景解析

前置篇: 为从根本上解决旧 MapReduce 框架的性能瓶颈,促进 Hadoop 框架的更长远发展,从 0.23.0 版本开始,Hadoop 的 计算框架完全重构,发生了根本的变化.新的 Hadoop MapReduce 框架命名为 Yarn,重构根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是计算资源管理和任务调度 / 监控.ResourceManager全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协

k8s调度器优先级和抢占机制

优先级(Priority)和抢占(Preemption)机制 优先级和抢占机制,解决的是Pod调度失败时该怎么办的问题 正常情况下,当一个Pod调度失败后,它就会被暂时“搁置”起来,直到Pod被更新,或者集群状态发生变化,调度器才会对这个Pod进行重新调度 特殊要求的场景: 当一个高优先级的Pod调度失败后,该Pod并不会被“搁置”,而是会“挤走”某个Node上的一些低优先级的Pod.这样就保证这个高优先级Pod的调度成功 优先级的实现 需要在Kubernetes里提交一个PriorityCla