Skip to content

destroy

销毁小游戏运行环境

destroy() 是整个生命周期的终点。它用于彻底关闭游戏引擎,回收所有占用的系统资源(包括 JS 虚拟机内存、纹理资源、线程池以及 View 句柄)。调用此方法后,小游戏实例将回归到初始的不可用状态。


方法声明

java
/**
 * 销毁小游戏运行环境。
 * 操作成功后小游戏实例进入 `UNAVAILABLE` 状态。
 * 调用后,当前 handle 绑定的所有资源将被释放,View 将失效。
 */
void destroy();

运行行为与状态迁移

1. 前提条件

  • 可以在 WAITINGRUNNINGPLAYING 任何状态下调用。
  • 建议在调用前先执行 stop() 以确保游戏逻辑已经优雅地触发了 onHide

2. 执行过程

  • 引擎卸载:关停内置的 JS 引擎(V8/JSC),清空所有脚本上下文。
  • 内存释放:销毁 WebGL/Canvas 渲染表面,释放显存中的图片和模型数据。
  • 监听解绑:自动解绑之前设置的各类状态和自定义指令监听器。

3. 结果

  • 成功后,状态变为 GAME_STATE_UNAVAILABLE
  • 此时 getGameView() 返回的 View 及其内容将被销毁,不可再次添加到 UI 树中。

代码示例

java
@Override
protected void onDestroy() {
    if (gameHandle != null) {
        // 1. 停止运行(可选,取决于是否需要触发游戏内部存档逻辑)
        gameHandle.stop("{}");
        
        // 2. 彻底销毁环境
        gameHandle.destroy();
        
        // 3. 将句柄置空,防止后续误用
        gameHandle = null;
    }
    super.onDestroy();
}

注意事项

  • 不可逆性:一旦执行 destroy(),该 gameHandle 实例就完成了使命。如果需要再次玩游戏,必须重新从 setGameStartOptionscreate() 开始完整流程。
  • 内存泄漏预防:在 Activity 销毁时,务必调用此方法。如果不销毁,JS 引擎和渲染表面可能会导致严重的内存泄漏。
  • 线程安全destroy() 是一个重量级同步操作,建议在确认不再需要游戏画面时(如退出 Activity 的瞬间)立即执行。