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 定时器都会失效,不过 setTimeout 和 setInterval 可以正常使用。
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/帧率 (类似于 Update 和 fixedUpdate 的区别),前台运行和后台运行,一段时间后可能会出现偏差。
目前我没有想到很好的解决办法,针对我当前的项目来讲,我想到了两种方法,给大家提供一下思路:
- 用固定时间间隔的定时器替换掉 Update,这样前后台切换可以不受影响。
- 适当增加后台运行时定时器的时间间隔(略慢于前台运行的 Update,因为后台运行快于前台的话,项目显示会有bug),切回前台的时候统一做一次同步。


此处评论已关闭