-
引擎版本:3.8.3
-
问题描述:
await async
语法在网页、微信小游戏中运行是基于具体方法的运行耗时,当逻辑简单时基本约等于无延迟;但在Android平台上,却固定存在延迟,大概等于对应帧的所有逻辑耗时,这个要如何解决?
翻阅3.8.3源码,只找到了
promise.min.js
和不同平台的v8-promise.h
头文件;前者貌似改动了原生平台无法生效,不确定是不是我的改法错误:t._immediateFn = typeof setImmediate === 'function' && function (e) { setImmediate(e); } || function (e) { c(e, 0); }
在
promise.min.js
中找到了上述语句,其中c
方法是setTimeout
;据此猜测是原生平台不存在setImmediate
方法导致执行了setTimeout
语句延迟一帧执行,因此修改为:t._immediateFn = function (e) { e(); }
但是打包之后,Android平台依然存在明显延迟。
- 测试代码:
private async test() {
let startTime = Date.now();
await this.test1();
let endTime = Date.now();
console.log(`test time: ${endTime - startTime}, frame time: ${game.frameTime}`);
}
private async test1() {
let startTime = Date.now();
await this.test2();
let endTime = Date.now();
console.log("test1 time: ", endTime - startTime);
}
private async test2() {
console.log("test2");
}
-
网页预览运行结果:
-
微信开发者工具运行结果:
-
Mumu模拟器Android包运行结果:
注:游戏帧率设置为60帧。网页预览、微信开发者工具、微信小游戏预览版都稳定在0~1ms之间;Mumu模拟器及真机运行Android包波动范围较大,大约在5~17ms之间。