目录

实现秒级启动

业务流程

如果开发者使用的是团结引擎1.8.1及以上版本,启动加速能力已内置到引擎中,无需按本章流程手动调用ArkTS接口。请参考团结引擎启动加速能力文档完成集成。

注意:团结引擎1.8.1~1.9.0版本在Tablet设备上存在未捕获异常的问题,详细信息请参见本文FAQ。

  1. 用户启动游戏。

  2. 游戏在onCreate生命周期中调用setSupportedProcessCache接口,设置游戏支持缓存后快速启动。

    部分机型不支持设置进程资源的缓存,因此在调用setSupportedProcessCache接口时需加try catch捕获异常。

  3. 用户上划退出游戏。

  4. 在onWindowStageWillDestroy生命周期中,游戏调用isLaunchMirrorEnabled接口向游戏启动加速服务查询游戏内存镜像功能是否开启。若已开启,ArkTS侧通知游戏引擎将当前场景切换至登录页,引擎完成场景切换后将结果回传ArkTS侧。若场景切换失败或超时,则调用setSupportedProcessCache接口,取消游戏对缓存后快速启动的支持。

    建议开发者切换场景时,将场景切换至游戏登录界面并设置最大超时时间5s。

  5. 在onDestroy生命周期中,游戏再次调用isLaunchMirrorEnabled接口确认内存镜像功能状态。若未开启,则执行引擎析构流程,游戏进程随即退出。

  6. 用户重新启动游戏。

  7. 游戏根据是否存在内存镜像决定启动方式:若存在内存镜像,系统将此前换出至磁盘的游戏对象重新换入到内存,实现秒级启动;若不存在内存镜像,则按正常流程启动游戏。

    根据上架审核规则,建议游戏秒级启动时增加游戏健康公告闪屏,然后再进入内存镜像界面,详细操作可参考Codelab示例工程。

生命周期

接口说明

具体API说明请详见接口文档。

接口名 描述
isLaunchMirrorEnabled(): boolean 查询游戏的内存镜像功能是否开启。

开发步骤

本节主要介绍秒级启动的核心流程,完整的开发步骤和注意事项请参见Codelab开发指导。

  1. 导入Graphics Accelerate Kit模块。

    import { launchAcceleration } from '@kit.GraphicsAccelerateKit';
  2. 游戏启动时,在onCreate生命周期中调用setSupportedProcessCache接口,设置游戏支持缓存后快速启动。

    if (canIUse("SystemCapability.GraphicsGame.LaunchAcceleration")) { // 兼容性:通过canIUse()校验设备是否支持启动加速服务
      try {
        this.context.getApplicationContext().setSupportedProcessCache(true);
      } catch (error) {
        let code = (error as BusinessError).code;
        let message = (error as BusinessError).message;
        console.error(`setSupportedProcessCache fail, code: ${code}, msg: ${message}`);
      }
    }
  3. 游戏退出时,调用isLaunchMirrorEnabled接口,查询游戏内存镜像功能是否开启。若已开启,游戏先切换场景,游戏需在onWindowStageWillDestroy生命周期中进行场景切换,建议开发者将场景切换至游戏登录界面,并在onDestroy生命周期中取消游戏引擎的销毁步骤,系统在退出游戏前自动制作内存镜像,制作内存镜像大概需要4s。

    • 游戏启动加速服务制作游戏内存镜像需要4s,若在4s内再次进入游戏,则秒级启动不生效,启动方式为正常冷启动。

    • 游戏本次基于内存镜像启动加速,若在10s内上划退出,下一次启动不会加速,因为系统DFR(Design for Reliability,可靠性设计)保护机制,防止游戏快启后无法使用。

    • 系统将结合当前设备的游戏热度、内存镜像数、当日磁盘换出量综合判定是否开启内存镜像功能。

    onWindowStageWillDestroy(): void {
      if (canIUse("SystemCapability.GraphicsGame.LaunchAcceleration")) { // 兼容性:通过canIUse()校验设备是否支持启动加速服务
        let enable = launchAcceleration.isLaunchMirrorEnabled()
        if (enable) {
          // 切换场景的代码逻辑
          // ...
        }
      }
    }
    
    onDestroy(): void {
      if (canIUse("SystemCapability.GraphicsGame.LaunchAcceleration")) { // 兼容性:通过canIUse()校验设备是否支持启动加速服务
        let enable = launchAcceleration.isLaunchMirrorEnabled()
        if (!enable) {
          // 若未使能,才进行游戏引擎的销毁
        }
      }
      // ...
    }