f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
inherent
cocos2dx调度器的类图路上所示,调度器继承自Ref类,该类实现了内存的自动管理机制。
我们先看一下官方文档的介绍,一下是引用官方文档,到-----线为止。

原理介绍

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()也就是默认调度器的实现是基于update方法,该方法是虚方法定义在Node类中,在cocos2dx框架中。会在每次绘制一帧之前调用update方法,但是默认情况下,这个方法是不启用的。
也许你也有这个疑问,为什么update方法可以实现调度。可以实现游戏逻辑的判断。这就需要对游戏有一个认识,游戏都是由一帧一帧绘制而成,在一定范围内的不同时刻,对应的会是不同的游戏画面。回想一下,你学过的微积分
,如果我们把游戏的看成是微积分,那么这每一帧就是微分。所以帧率越高,游戏越逼真,越流程,体验度越高。我们也可以借助这一思想来理解,为什官方框架中会对update做出下面这句解释。
该调度器是使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。绿色这句话是引用自官方,可能你会不理解
为什么说每帧之间间隔较短,所以每一帧刷新以此足够完成部分游戏逻辑的判断。
由官方文档我们知道一下代码的执行顺序,下面用伪代码表示
{
       1:
         update();执行update方法
         drawOneFrame();绘制一帧
        go 1;
}
由上面的伪代码我们知道其想表达的意思是说,由于帧率比较高,能模拟出更真实的效果。而update方法敲好是在两帧之间调用,所以update的执行时间一般来说是和帧率相互挂钩。
也就是说update里面的所有变量其实是无限趋近于drawOneFrame()的。所以我们可以再update中书写一些游戏逻辑。简而言之,在update里面可以做的事等效于给每一帧里面各个对象的做逻辑判断。


接下来分析下自定义调度器,先看官方文档解说。

自定义调度器(scheduler)

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

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

同样,取消该调度器可以用unschedule(SEL_SCHEDULE selector, float delay)。
我的理解:
其实读完这个解说你应该更清楚了我前面理论的正确性,如果你定义的间隔时间比两帧短,也就是说,将在同一帧类不断的重复回调selector指向的方法。但这是不需要的所以官方会说将
两帧内的多次调用会被合并成一次调用。
自定义时间应该在0.1秒以上,帧率就是10.也就是你定义的定时器的频率应该小于10,或者说间隔时间应该大于0.1。


当然cocos2dx框架还提供单次调度器具体看官方文档,这个就很好理解了,不解释和分析。
2015/4/6上午1:03:59

posted on 2015-04-06 00:57 swp 阅读(2499) 评论(0)  编辑 收藏 引用 所属分类: cocos2dx

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理