# 性能

# iOS高性能模式

# 简介

为了强化小游戏的运行能力,推出iOS高性能模式,游戏方通过一些适配之后,就可以得到更好的游戏体验。

# 能力支持

除了普通的js运行环境以外,仅高性能模式支持以下特性:

# 准备工作

# 1、特别提示

高性能模式下,本质上对游戏的内存有一定的要求,需要游戏方对内存做好相关限制。 6s/7/8等 2G RAM 机型的内存限制为1G,7P/8P/iPhoneX/XSAMX/11等3G以上内存机型的内存限制为1.4G,因此开发者务必保证内存峰值不超过该数值。 如果没有做好内存优化,则不建议开启使用,可能会在iOS低端机器上出现内存异常退出的情况。

# 2、运行环境要求

QQ版本要求: QQ版本 >= 8.8.17, 直接更新最新版本即可,低版本不支持。 系统要求: iOS下,需要针对iOS14系统>=14的系统开启,低版本的iOS无法支持。 截止至2024年5月,满足QQ版本要求和系统要求的QQ用户比例已经**>=92.5%**。

# 3、开通高性能模式开关

开通高性能模式的方法分为以下两种情况:

# Unity游戏:

Unity游戏按正常的配置,默认在iOS使用高性能模式运行,无需额外配置,unity游戏不支持普通模式运行。

# 非Unity游戏:

通过配置game.json的supportJIT为true,即可开启高性能模式,去掉此标识可以回退到普通模式,方便对比两个模式的效果。

# 游戏适配

正常来说,Unity游戏是不需要适配的,但是经过前期的一些反馈,我们发现以下场景是可能需要适配的。

# 1、特别提示

可以使用如下的方式判断QQ小游戏处于高性能模式:

var isJITMode = false;
if (qq.getPerformanceConfigSync) {
  var config = qq.getPerformanceConfigSync();
  isJITMode = config.isJITMode;  // isJITMode为true的时候,则为高性能模式
} 
1
2
3
4
5

由于一些历史原因,暂时不支持使用GameGlobal.isIOSHighPerformanceMode判断高性能模式。

# 2、严格模式

业务代码的JS需要开启严格模式,一般游戏引擎都会默认开启。

# 3、代码适配

# weapp-adapter适配,如果有引入则需要。

这里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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

上面的代码本质上是需要修改第一个判断条件,可以将上述代码简化看成如下代码:

if (typeof __devtoolssubcontext === 'undefined' && platform === 'devtools') {
  /// code block 
} else {
  /// code block
}
1
2
3
4
5

修改第一个判断条件如下,最后代码类似:

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
}
1
2
3
4
5
6
7
8
9
10
11
12
# windows.devicePixelRatio赋值异常,白屏问题适配

原因是代码里赋值了这个信息,建议不要给devicePixelRatio赋值。

window.devicePixelRatio = 1.5
1