官方文档

关键词

帧率脚本定时器浏览器初始化全局对象重新运行加载顺序加载子节点浏览器控制台

帧率

image.png
我们再来强调一下帧率的概念,帧率缩写就是 FPS 也就是 frames per second 的简称。一秒钟有多少帧的意思。在电影和动画片里边也有帧率的概念,但是有点不同。因为对电影和动画来说,比如说一秒钟 25 帧,那就意味着一秒钟要重绘 25 次,因为每一幅画面都是不一样的。

对于游戏来说,默认情况下是 60 帧每秒,这个 60 帧每秒其实是说 update 的调用频率,那如果你在 update 里面什么也没有写,这个游戏画面没有任何变化,那这时候游戏画面是不会重绘的。
image.png

dt(delta time)

我们来看一下这个帧率。我们在写动态效果的时候,我们要重写update方法。那么update方法传入了一个参数dt,含义是 delta time ,指的是上一帧的时间间隔。比如现在默认FPS 是60,那么每一帧的间隔大概是 0.06 秒了。当你运行一个画面的时候,如果把这个 show FPS 打开,那这里面可以看到FPS 的显示并不是一个精确的数值,它是不断变化的。
image.png
我们可以把dt的值打印一下,佩奇下边下挂了 pixscript 脚本,把 pixscript 在 VSCode 里面打开,在这个 update 方法里把这个dt打印一下。

  1. update(dt){
  2. cc.log('delta time' + dt);
  3. if(this.node.x >= 200) rerurn;
  4. this.node.x += 5; //将节点移动5像素
  5. }

重新运行一下游戏,可以看到在开发者工具控制台里边暂停一下,可以看到这个 dt 的值大概是 0.06 秒,但是它并不是一个准确的数值,用软件来实现这种定时效果的话,那肯定中间是有误差的,甚至有可能被阻碍。所以这个时间仅仅是一个参考的时间,它并不是一个准确的说一定每一帧之间是 0.067 毫秒。没有这么样的一个精确定时器,这也是软件开发里边的一个常识。

cc.game.setFrameRate(30)

image.png
一般来说,如果帧率越高,操作系统的负载也就越大,使用这个方法就可以来把这个帧率调低一点,比如说调成30。

  1. cc.game.setFrameRate(30);

这一句代码在哪里边设置,帧率它是一个全局性的东西,不但对当前脚本有效,对其他的任何组件下的任何脚本也都是有效的。因为cc.game 是一个全局变量,全局对象。所以一般情况下,需要放在一个全局的初始化脚本里边

项目里边新建一个脚本叫 GameInitScript ,把它挂在 canvas 这个根节点下边,在系统加载的时候,会优先加载canvas 这个节点,它是按照先加载根节点,再加载子节点,从上往下这样的一个顺序,把所有的节点加载出来,所以GameInitScript 这个脚本放在canvas下面的时候,这个脚本会被优先运行,GameInitScript会优先于 pigscript 来运行。image.png

  1. onLoad(){
  2. cc.log('Game Init Script : onLoad()');
  3. cc.game.setFrameRate(30);
  4. }

所以我们可以把所有的全局性的设置放在 GameInitScript 里边,然后再把脚本挂在根节点下边。我们可以在onload 方法里边来设置一下帧率,把它设置为 30 帧每秒。重新运行项目,显示的 FPS 变成了 30 帧每秒,只能说是大概的数值,如果你的运算特别多,特别卡的话,有可能这个间隔会降低。

节点的加载顺序

在这个操作里边,我们学到了一个新东西,那就是节点的加载顺序。如果你想做一个全局初始化的话,你可以写一个脚本,把所有的初始化放在这个脚本里边。这个脚本可以挂在第一个节点下边,也就是我们的根节点 canvas 下边。按照加载顺序就是先加载根节点,然后再加载子节点这样的一个顺序。