Skip to content

引擎分离

1. 背景

随着小游戏平台(如微信小游戏、字节小游戏等)的发展,对包体大小、启动速度及运行性能提出了更高要求。传统的打包方式通常将引擎代码与业务代码打包在一起,会带来以下问题:

  • 包体体积较大,不利于用户下载
  • 引擎代码重复加载,影响加载效率
  • 更新成本高,引擎升级需重新发版整个游戏

因此,引入 引擎分离 方案,将引擎与游戏业务解耦,成为优化的重要手段。

2. 什么是引擎分离

引擎分离是指将 Cocos 引擎代码从游戏主包中剥离,作为独立资源或子包进行加载,而主包仅保留业务代码与必要资源。

整体结构如下:

text
传统结构:
├── main.js
├── cocos-engine.js
├── assets/
└── ...

引擎分离后:
├── main.js(业务代码)
├── subpackages/
│   └── engine(引擎子包)
│       └── cocos-engine.js
├── assets/
└── ...

3. 核心优势

3.1 减小主包体积

引擎代码从主包剥离后,主包体积显著下降,更容易满足小游戏平台限制(如 4MB / 8MB)。

3.2 提升加载性能

  • 引擎可缓存
  • 多个游戏可复用同一引擎资源
  • 首次加载后后续启动更快

3.3 提高更新效率

  • 引擎升级与业务代码解耦
  • 可单独更新业务逻辑,减少发版成本

3.4 更灵活的资源管理

  • 支持按需加载引擎模块
  • 支持不同场景加载不同能力

4. 架构设计

引擎分离后整体架构如下:

启动流程:

  1. 启动 main.js
  2. 加载引擎子包(engine)
  3. 初始化 Cocos 引擎
  4. 加载游戏资源
  5. 启动游戏逻辑

4.1 模块划分

模块说明
主包(Main Package)包含业务逻辑、配置文件及首屏资源
引擎包(Engine Package)包含 Cocos 引擎核心代码
资源包(Assets)包含图片、音频、Prefab 等资源

4.2 加载时序

  1. 平台加载主包
  2. 主包触发引擎子包加载
  3. 引擎加载完成后执行初始化
  4. 进入游戏主逻辑

5. 实现方式

5.1 构建配置

在 Cocos 构建发布时,需要开启引擎分离相关配置:

  • 开启“引擎分离”选项
  • 配置子包路径(如 engine
  • 确保引擎文件输出至子包目录

5.2 代码调整

在入口文件中,增加对子包加载的逻辑

5.3 引擎初始化

引擎加载完成后,需手动触发初始化流程:

  • 创建渲染上下文
  • 初始化场景
  • 加载首屏资源

6. 注意事项

6.1 子包大小限制

不同平台对子包大小有不同限制,需要合理拆分:

  • 避免引擎包过大
  • 必要时进一步拆分模块

6.2 加载时机

  • 引擎会在游戏包处理时完成加载

6.3 缓存策略

  • 合理利用缓存机制
  • 避免频繁重复加载引擎

7. 适用场景

引擎分离特别适用于以下场景:

  • 包体接近平台限制的项目
  • 多小游戏共用同一引擎版本
  • 需要频繁更新业务逻辑的项目
  • 对启动速度有较高要求的游戏

8. 总结

引擎分离是一种有效的优化方案,通过将引擎与业务解耦,可以显著提升性能与开发效率。

其核心价值在于:

  • 降低包体体积
  • 提升加载效率
  • 优化更新流程
  • 提高架构灵活性