Cocos Creator 前后台切换事件监听代码如下

 onLoad: function () {
     cc.game.on(cc.game.EVENT_HIDE, this.onHide, this);
     cc.game.on(cc.game.EVENT_SHOW, this.onShow, this);
 },
 
 onHide() {
     console.log("游戏进入后台");
 }
 
 onShow() {
     console.log("游戏进入前台");
 }

程序在切换到后台后,整个渲染和事件循环就暂停掉了,一些需要在后台仍正常处理的事件逻辑,要么移到服务器端来处理,要么在后台启动一个定时器来处理。

经测试,切到后台后,update 函数和 schedule 定时器都会失效,不过 setTimeoutsetInterval 可以正常使用。

setTimeout

作用:设置一个定时器,在指定时间(毫秒)后触发,调用传入的回调函数。

参数类型:(function/code, delayTime, args…)

  • function: 回调函数
  • code: 字符串形式的代码,会使用 eval() 执行,因此不推荐使用
  • delayTime: (可选) 延迟的时间(毫秒),默认0,尽快执行。
  • args: (可选) 不定长参数列表,会传递给回调函数

setInterval

作用:设置一个定时器,每隔一段时间触发一次,调用传入的回调函数。

参数类型:(function/code, delayTime, args…) 和 setTimeout 一致,区别是 setInterval 会一直执行回调函数,但setTimeout仅执行一次。 delayTime就是每次间隔的时间。

我们可以使用 setInterval 定时器来实现 update 的效果。

 public m_timer;
 
 onHide() {
     console.log("游戏进入后台");
     //时间间隔设定为 1/帧率
     let dt = 1/cc.game.getFrameRate();
     //启动定时器,每帧调用一次 update 函数
     this.m_timer = setInterval(this.update, dt*1000, dt);
 }
 
 onShow() {
     console.log("游戏进入前台");
     //删除定时器
     clearInterval(this.m_timer);
 }

有一个小问题是,update 函数执行的时间间隔 dt 并非固定的 1/帧率 (类似于 UpdatefixedUpdate 的区别),前台运行和后台运行,一段时间后可能会出现偏差。

目前我没有想到很好的解决办法,针对我当前的项目来讲,我想到了两种方法,给大家提供一下思路:

  1. 用固定时间间隔的定时器替换掉 Update,这样前后台切换可以不受影响。
  2. 适当增加后台运行时定时器的时间间隔(略慢于前台运行的 Update ,因为后台运行快于前台的话,项目显示会有bug),切回前台的时候统一做一次同步。
最后修改:2021 年 11 月 11 日 09 : 27 AM
如果觉得我的文章对你有用,请随意赞赏