加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我所理解的Cocos2d-x 实时更新游戏对象

发布时间:2020-12-14 17:08:24 所属栏目:百科 来源:网络整理
导读:帧率 我们可以通过 Director::setAnimationInterval() 方法来设置帧频,只不过它的参数是帧率的倒数,即每两帧之间的间隔。 Application的实现很简单:在执行一次循环后,如果距离下一次更新还有空闲时间,则休眠,直至下一次循环更新的时间。 Scheduler 除

帧率

我们可以通过Director::setAnimationInterval()方法来设置帧频,只不过它的参数是帧率的倒数,即每两帧之间的间隔。
Application的实现很简单:在执行一次循环后,如果距离下一次更新还有空闲时间,则休眠,直至下一次循环更新的时间。

Scheduler

除了游戏自身的各个子系统,游戏引擎还必须提供某种机制更新程序员自定义的各种游戏对象。
Cocos2d-x使用一种更灵活的机制来实现游戏对象的状态更新,开发者通过向Scheduler注册一个回调函数来更新逻辑。

  1. 第一种类型与游戏循环的帧率保持一致,通过scheduleUpdate()方法注册。使用这种方法Scheduler会按照priority值从小到大的顺序进行更新回调。
  2. 第二种类型是通过schedule()方法注册自定义的更新回调。

第二种方法在实现上,每个自定义的更新回调需要使用一个Timer类来计时,而这将花费更多的内存及计算时间,且不能指定更新的优先级。所以在编写程序时应该尽量使用前者。

时间线

通常情况下,我们按真实的时间线处理游戏更新。但在某些情况下,我们需要使用一种相对时间线,如快进、减慢甚至回退。

timeScale的值会影响所有使用向Scheduler注册的更新回调,包括2.5.4节即将讲述的ActionManager及物理碰撞检测。

逻辑更新优先级

Node基类提供了更方便的方法来注册更新回调:Node::scheduleUpdate()Node::scheduleUpdateWithPriority(int priority)

然而,这种按游戏对象来划分逻辑更新优先级的方式并不是一种合理的方式,尤其是当多个对象之间有交叉的状态读取时,各个对象状态的优先级则往往很难排列,这导致一个非常糟糕的结果,就是一个对象中会包含大量的逻辑(程序员需要记住大量无意义的游戏对象的优先级)。
在游戏设计中,对逻辑而不是游戏对象设计优先级往往更有意义。

性能问题

  1. 避免每帧查找。
  2. 对一些非频繁更新的状态进行缓存。
  3. 与UI元素绘制无关、即时性不强的算法应该减少其update()方法调用的频率。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读