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),切回前台的时候统一做一次同步。
此处评论已关闭