# 实现游戏启动加速

#### 业务流程

1.  用户启动游戏。
    
2.  游戏在onCreate生命周期中调用setSupportedProcessCache接口，设置游戏支持缓存后快速启动。
    
    部分机型不支持设置进程资源的缓存，因此在调用setSupportedProcessCache接口时需加try catch捕获异常。
    
3.  用户上划退出游戏。
    
4.  在onWindowStageWillDestroy生命周期中，游戏调用isLaunchMirrorEnabled接口向游戏启动加速服务查询游戏内存镜像功能是否开启。若已开启，ArkTS侧通知游戏引擎将当前场景切换至登录页，引擎完成场景切换后将结果回传ArkTS侧。若场景切换失败或超时，则调用setSupportedProcessCache接口，取消游戏对缓存后快速启动的支持。
    
    建议开发者切换场景时，将场景切换至游戏登录界面并设置最大超时时间5s。
    
5.  在onDestroy生命周期中，游戏再次调用isLaunchMirrorEnabled接口确认内存镜像功能状态。若未开启，则执行引擎析构流程，游戏进程随即退出。
    
6.  用户重新启动游戏。
    
7.  游戏根据是否存在内存镜像决定启动方式：若存在内存镜像，系统将此前换出至磁盘的游戏对象重新换入到内存，实现秒级启动；若不存在内存镜像，则按正常流程启动游戏。
    
    根据上架审核规则，建议游戏秒级启动时增加游戏健康公告闪屏，然后再进入内存镜像界面，详细操作可参考Codelab示例工程。
    

#### 生命周期

*   游戏冷启动场景
    
    游戏进程会依次创建AbilityStage、UIAbility以及WindowStage，完成应用与界面的初始化。
    
*   游戏秒级启动场景
    
    当秒级启动能力开启后，用户上划移除游戏时，系统会依次销毁WindowStage和UIAbility对象，随后对游戏进程进行深度冻结。在此过程中，系统会将游戏进程中的大部分对象换出至磁盘，仅保留少量关键对象驻留在内存中，以降低内存占用。
    
    在触发游戏秒级启动时，系统会将此前换出到磁盘的游戏对象重新换入内存，同时游戏进程会重新创建UIAbility和WindowStage对象，从而实现快速恢复与启动。
    

#### 接口说明

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

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

#### 开发步骤

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

1.  导入Graphics Accelerate Kit模块。
    
    ```
    import { launchAcceleration } from '@kit.GraphicsAccelerateKit';
    ```
    
2.  游戏启动时，在onCreate生命周期中调用setSupportedProcessCache接口，设置游戏支持缓存后快速启动。
    
    ```
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
      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) {
          // 若未使能，才进行游戏引擎的销毁
        }
      }
    }
    ```