为了强化小游戏的运行能力,推出iOS高性能模式,游戏方通过一些适配之后,就可以得到更好的游戏体验。
除了普通的js运行环境以外,仅高性能模式支持以下特性:
高性能模式下,本质上对游戏的内存有一定的要求,需要游戏方对内存做好相关限制。 6s/7/8等 2G RAM 机型的内存限制为1G,7P/8P/iPhoneX/XSAMX/11等3G以上内存机型的内存限制为1.4G,因此开发者务必保证内存峰值不超过该数值。 如果没有做好内存优化,则不建议开启使用,可能会在iOS低端机器上出现内存异常退出的情况。
QQ版本要求: QQ版本 >= 8.8.17, 直接更新最新版本即可,低版本不支持。 系统要求: iOS下,需要针对iOS14系统>=14的系统开启,低版本的iOS无法支持。 截止至2024年5月,满足QQ版本要求和系统要求的QQ用户比例已经**>=92.5%**。
开通高性能模式的方法分为以下两种情况:
Unity游戏按正常的配置,默认在iOS使用高性能模式运行,无需额外配置,unity游戏不支持普通模式运行。
通过配置game.json的supportJIT为true,即可开启高性能模式,去掉此标识可以回退到普通模式,方便对比两个模式的效果。
正常来说,Unity游戏是不需要适配的,但是经过前期的一些反馈,我们发现以下场景是可能需要适配的。
可以使用如下的方式判断QQ小游戏处于高性能模式:
var isJITMode = false;
if (qq.getPerformanceConfigSync) {
var config = qq.getPerformanceConfigSync();
isJITMode = config.isJITMode; // isJITMode为true的时候,则为高性能模式
}
由于一些历史原因,暂时不支持使用GameGlobal.isIOSHighPerformanceMode判断高性能模式。
业务代码的JS需要开启严格模式,一般游戏引擎都会默认开启。
这里iOS高性能模式和ide的模式类似,暂不支持对window的重写,如果有类似Attempted to assign to readonly property的报错,可以检查是否有如下代码:
// 原始代码:
if (typeof __devtoolssubcontext === 'undefined' && platform === 'devtools') {
for (const key in _window) {
const descriptor = Object.getOwnPropertyDescriptor(global, key)
if (!descriptor || descriptor.configurable === true) {
Object.defineProperty(window, key, {
value: _window[key]
})
}
}
for (const _key in _window.document) {
const _descriptor = Object.getOwnPropertyDescriptor(global.document, _key)
if (!_descriptor || _descriptor.configurable === true) {
Object.defineProperty(global.document, _key, {
value: _window.document[_key]
})
}
}
window.parent = window
} else {
for (const _key2 in _window) {
global[_key2] = _window[_key2]
}
global.window = _window
window = global
window.top = window.parent = window
}
上面的代码本质上是需要修改第一个判断条件,可以将上述代码简化看成如下代码:
if (typeof __devtoolssubcontext === 'undefined' && platform === 'devtools') {
/// code block
} else {
/// code block
}
修改第一个判断条件如下,最后代码类似:
var isDevtools = typeof __devtoolssubcontext === 'undefined' && platform === 'devtools';
var isJITMode = false;
if (qq.getPerformanceConfigSync) {
var config = qq.getPerformanceConfigSync();
isJITMode = config.isJITMode
}
if (isDevtools || isJITMode) {
/// code block
} else {
/// code block
}
原因是代码里赋值了这个信息,建议不要给devicePixelRatio赋值。
window.devicePixelRatio = 1.5