帧率
我们可以通过Director::setAnimationInterval()
方法来设置帧频,只不过它的参数是帧率的倒数,即每两帧之间的间隔。
Application的实现很简单:在执行一次循环后,如果距离下一次更新还有空闲时间,则休眠,直至下一次循环更新的时间。
Scheduler
除了游戏自身的各个子系统,游戏引擎还必须提供某种机制更新程序员自定义的各种游戏对象。
Cocos2d-x使用一种更灵活的机制来实现游戏对象的状态更新,开发者通过向Scheduler注册一个回调函数来更新逻辑。
- 第一种类型与游戏循环的帧率保持一致,通过
scheduleUpdate()
方法注册。使用这种方法Scheduler会按照priority值从小到大的顺序进行更新回调。 - 第二种类型是通过
schedule()
方法注册自定义的更新回调。
第二种方法在实现上,每个自定义的更新回调需要使用一个Timer类来计时,而这将花费更多的内存及计算时间,且不能指定更新的优先级。所以在编写程序时应该尽量使用前者。
时间线
通常情况下,我们按真实的时间线处理游戏更新。但在某些情况下,我们需要使用一种相对时间线,如快进、减慢甚至回退。
timeScale的值会影响所有使用向Scheduler注册的更新回调,包括2.5.4节即将讲述的ActionManager及物理碰撞检测。
逻辑更新优先级
Node基类提供了更方便的方法来注册更新回调:Node::scheduleUpdate()
和Node::scheduleUpdateWithPriority(int priority)
。
然而,这种按游戏对象来划分逻辑更新优先级的方式并不是一种合理的方式,尤其是当多个对象之间有交叉的状态读取时,各个对象状态的优先级则往往很难排列,这导致一个非常糟糕的结果,就是一个对象中会包含大量的逻辑(程序员需要记住大量无意义的游戏对象的优先级)。
在游戏设计中,对逻辑而不是游戏对象设计优先级往往更有意义。