目录
欢迎来到《Cocos 游戏开发高级编程》。卷一《入门》是「把引擎拆开看」,卷二《实战》是「把零件装回一台能出货的机器」,这一卷回过头去把引擎本身当研究对象:它内部怎么工作、为什么这么设计、出了问题该往哪里挖。
到这里,你已经能用 Cocos Creator 3.8 交付一个能发布、能回滚、能热更的产品。但「会用」和「懂」之间还有一层:当性能不达预期、当某段表现和直觉不符、当你要裁剪引擎体积或改一段渲染逻辑时,只靠 API 文档是走不通的。你需要知道引擎在背后做了什么——渲染管线怎么组织、合批为什么会被打断、cc.d.ts 里那些导出是怎么映射到源码的、内存里到底住着谁。
本页给出全书的阅读路线。你可以从第 1 章 1.1 开始顺序通读,也可以先看下面的三条路径,挑一条最合你胃口的走法。
这一卷写给谁
| 读者 | 现状 | 读完能拿到什么 |
|---|---|---|
| 读完卷一、卷二、想真正吃透引擎的人 | 会写组件、能发布产品,但机制层面仍是黑盒 | 从引擎分层、渲染管线到内存与原生的一整套内部视角 |
| 有 Unity / 自研引擎背景、转 Cocos | 熟悉引擎内部概念,需要落到 Cocos 的实现 | Cocos 的 Effect 体系、合批机制、源码结构与定制路径 |
| 需要做深度优化的开发者 | 知道要优化,但不知道瓶颈在引擎的哪一层 | 定位到具体子系统(渲染 / 物理 / 动画 / 内存)的分析方法 |
| 技术负责人 / 引擎维护者 | 要决定是否裁剪引擎、改源码、升级版本 | 引擎定制与升级的完整决策链与代价评估 |
前置知识:读完卷一与卷二,或已具备等价基础(看得懂 TypeScript 组件脚本、走过一次完整发布流程)。建议本机安装 Cocos Creator 3.8——本卷有大量工程文件与编辑器配置片段,命令行无法复现;但引擎源码引用与组件脚本部分(L2)可以独立验证。
本卷与前后卷的分工
四卷本里,卷三处在「会用」与「懂」之间。三卷各回答一个问题:
| 卷 | 回答的问题 | 主要战场 | 交付物 |
|---|---|---|---|
| 卷一《入门》 | 引擎里的每件事怎么工作? | 手写 mini2d,从零实现帧循环、渲染、物理、存档 | 一个能跑、能测、能截图的 2D 运行时骨架 |
| 卷二《实战》 | 怎么用引擎做出并发布一个产品? | Cocos Creator 编辑器与工程体系 | 一个发布到 H5 / 微信 / 原生的《方块冲刺》 |
| 卷三《高级编程》 | 引擎为什么这么设计、问题往哪里挖? | 引擎内部机制、源码与定制 | 一套能定位瓶颈、能改引擎、能评估升级的分析能力 |
所以卷三不重做游戏。 它把卷二那个产品当素材:性能数字沿用卷二 13.3 定的帧预算,工程设定沿用卷二那套,区别只在于——卷二告诉你「这样写」,卷三告诉你「引擎为什么这样跑、什么时候该往下挖一层」。
如果你只读过卷一,卷三照样能读:第 1–3 章不依赖卷二的具体工程细节。但第 7 章之后的优化与定制话题会频繁引用卷二的产品形态,建议至少先扫一遍卷二的目录页 。
动手前的环境准备
本卷的验证分三层(详见下面的「可验证口径」),环境要求按层不同:
| 要做的事 | 需要装什么 | 说明 |
|---|---|---|
| 类型检查 L2 组件脚本 | Node 26 + @cocos/creator-types@3.8.8 + TypeScript | 不需要编辑器,tsc --noEmit 即可 |
| 真跑 L1 纯逻辑 | Node 26 + vitest | 与引擎无关,可独立单测 |
| 打开 L3 工程文件 | Cocos Creator 3.8.8 编辑器 | .effect / .mtl / 场景与构建配置必须在编辑器里查看 |
| 核对 L0 源码 | 联网访问 cocos/cocos-engine 仓库 | 源码引用都标了路径与 3.8.8 版本 |
没有编辑器也能读大部分内容:第 1 章、第 7 章的 L1 部分、第 10–11 章基本不依赖编辑器。但第 3–6、8–9 章涉及大量工程文件与原生工程,装一个 3.8.8 编辑器会顺畅得多。
三条阅读路径
路径 A:完整通读(约 8 周)
最完整的一条。从引擎分层讲到跨引擎对照,每章都在回答「这一层为什么这么设计」。
第 1–3 章(架构与渲染)→ 第 4–6 章(高级渲染与子系统)
→ 第 7–9 章(性能、原生与定制)→ 第 10–11 章(架构与收官)
适合想把 Cocos 用到底、或者未来要做引擎相关工作的读者。第 7 章(内存与性能)是全卷的枢纽,前面几章讲清机制,第 7 章把「怎么量化、怎么定位、怎么闭环」串起来。
路径 B:按主题跳读(约 4 周)
已经有明确目标的话,按下面的分组跳读:
渲染方向:1 → 2 → 3 → 4
子系统方向:5 → 6
性能与原生方向:7 → 8 → 9
架构方向:10 → 11
每组内部是递进的,组之间可以独立看。渲染方向建议从第 1 章读起——不先理解引擎分层与 cc.d.ts 的映射关系,后面看 Effect 与管线容易云里雾里。
路径 C:按问题查(随时)
不打算通读,只在遇到具体问题时翻对应章节。下节「常见问题速查」就是为这条路准备的。
贯穿项目:《方块冲刺》(深化形态)
卷三沿用卷二那套工程设定,不得前后矛盾:工程名 block-dash、包名 com.example.blockdash、设计分辨率 960 × 540(fitHeight + SHOW_ALL)、目标平台 H5 / 微信小游戏 / 原生、分包 bundle-levels、存档键 blockdash.save.v1。
卷三在这套设定上加深,新增的关注点固定为:
| 项 | 卷三里的取值 |
|---|---|
| 引擎版本 | Cocos Creator 3.8.8(全书锁定;源码引用须标 cocos/cocos-engine tag 3.8.8) |
| 引擎源码 | GitHub cocos/cocos-engine,cocos/ 下按 2d/ 3d/ animation/ physics/ audio/ rendering/ 分层 |
| Effect 文件 | assets/effects/*.effect,材质 assets/materials/*.mtl |
| 原生工程 | native/engine/{android,ios}/,JSB 绑定在 native/engine/common/ |
| 构建配置 | settings/v2/packages/builder.json、engine.json(模块裁剪) |
| 性能基线 | 沿用卷二 13.3 定的帧预算:60 FPS → 16.6 ms/帧;中低端机 30 FPS → 33.3 ms/帧 |
全书共用这一套设定,不得前后矛盾。 卷三尤其要守住版本口径:凡是引用源码的地方,都按 3.8.8 这个 tag 核对。
可验证口径(与卷二不同,重要)
卷二说清「主要战场在编辑器里」;卷三在此之上多了一层——引擎源码引用。所以三层的边界要划得更细:
| 层 | 卷三里的内容 | 能否验证 | 怎么验证 |
|---|---|---|---|
| L2 | Cocos 组件脚本(import { X } from 'cc') | 能真做类型检查 | tsc --noEmit 对 @cocos/creator-types@3.8.8 检查 |
| L3 | 工程文件(.effect / .mtl / .scene / 构建配置) | 不能命令行复现 | 结构校验;正文每处都显式标注「需 Cocos Creator 3.8 编辑器打开」 |
| L1 | 纯逻辑代码(内存模型、缓存淘汰、采样统计等) | 能真跑 | Node + vitest 单测,这部分与引擎无关 |
| L0 | 引擎源码片段(cocos/cocos-engine 3.8.8 的 .ts / .cpp) | 可核对来源 | 每处都标文件路径与版本;核不到的一律不写 |
这意味着什么? 本卷里凡 .effect、.mtl、构建配置这类片段,你没法复制粘贴就跑起来——它们必须由编辑器导入或引擎编译器处理。凡写「引擎里 XXX 是这样实现的」,都会给出文件路径 + 版本;本书宁可只写 cc.d.ts 能证明的 API 行为,也不凭记忆编造源码。凡是能写成组件脚本(L2)或纯逻辑(L1)的地方,就写成能验证的形式。这样每一段代码都至少有一层可验证性。
版本与技术口径
| 项 | 版本 | 说明 |
|---|---|---|
| Cocos Creator | 3.8.8 | 全书锁定,对应 @cocos/creator-types@3.8.8 |
| 引擎源码 | cocos/cocos-engine tag 3.8.8 | 源码引用一律以此为准 |
| Node.js | 26.5.0 | 只做 TypeScript 类型剥离,因此脚本限可擦除语法 |
| TypeScript | 7.0.2 | 组件脚本使用;禁 enum / namespace / 构造函数参数属性 |
| 原生工具链 | Android SDK / Xcode 当前稳定版 | 原生构建与 JSB 章节会说明版本要求 |
关于「可擦除语法」:Cocos 的脚本编译链只剥离类型,所以 enum、namespace、构造函数参数属性这类「需要生成运行时代码」的写法不要用。本书一律用 const 对象 + as const 代替 enum。
全书结构
全书 11 章分四个部分,每章 3 节。此外有 1 篇目录(本页)。序与前言见卷一。
第一部分:引擎与渲染管线(第 1–3 章)
先把引擎的骨架看清楚,再进入渲染这条最粗的主线。
| 节 | 标题 | 一句话 |
|---|---|---|
| 1.1 | 引擎分层与源码结构 | 引擎由哪些层组成、各自职责 |
| 1.2 | 启动流程与主循环 | 从 main 到每帧 update 的路径 |
| 1.3 | 从 cc.d.ts 读引擎 API 版图 | 用类型声明反推引擎能力边界 |
| 2.1 | 渲染管线与自定义管线 | 引擎默认管线与可插入点 |
| 2.2 | 材质与 Effect 体系 | 材质、Effect、Pass 的关系 |
| 2.3 | 渲染批次与合批机制 | 合批为什么会被打断 |
| 3.1 | Cocos Effect 语法与编译 | CCEffect / CCProgram 的写法 |
| 3.2 | 改造内置着色器 | 从内置 Effect 改出你要的效果 |
| 3.3 | 后处理与全屏特效 | 全屏 Pass 与渲染纹理的用法 |
第二部分:高级渲染与子系统(第 4–6 章)
渲染的进阶话题,以及物理与动画这两个重子系统的内部。
| 节 | 标题 | 一句话 |
|---|---|---|
| 4.1 | 2D 光照与法线 | 2D 光照的法线与贴图准备 |
| 4.2 | 阴影与光照贴图 | 阴影投射与光照贴图的取舍 |
| 4.3 | 自定义装配与渲染纹理 | 用 RenderTexture 做装配与镜像 |
| 5.1 | 内置物理与 Box2D 后端 | 物理后端选择与差异 |
| 5.2 | 物理调试与性能 | 调试绘制与物理开销定位 |
| 5.3 | 自定义碰撞与查询 | 射线、点查与自定义碰撞逻辑 |
| 6.1 | 动画系统内部与求值 | 关键帧怎么求值成当前姿态 |
| 6.2 | 骨骼动画与蒙皮 | 骨骼、蒙皮与批处理的关系 |
| 6.3 | 动画性能与内存 | 动画的 CPU 与内存代价 |
第三部分:性能、原生与定制(第 7–9 章)
把机制变成可量化的优化,再走到原生与引擎定制。
| 节 | 标题 | 一句话 |
|---|---|---|
| 7.1 | 内存模型与 GC | 谁在占内存、GC 什么时候跑 |
| 7.2 | 纹理、显存与资源预算 | 纹理格式、显存与预算表 |
| 7.3 | 性能剖析与优化闭环 | 从采样到定位到验证的闭环 |
| 8.1 | 原生平台与 JSB | JS 与原生互通的机制 |
| 8.2 | 原生插件与三方 SDK 接入 | 把三方 SDK 接进引擎 |
| 8.3 | 多线程与 Worker | 把重活挪出主线程 |
| 9.1 | 拉取与编译引擎源码 | 从源码构建一份引擎 |
| 9.2 | 自定义引擎与模块裁剪 | 裁掉用不到的功能、改一段实现 |
| 9.3 | 引擎升级策略 | 版本升级的评估与迁移 |
第四部分:架构与收官(第 10–11 章)
把机制沉淀成架构,再横向看整个引擎生态。
| 节 | 标题 | 一句话 |
|---|---|---|
| 10.1 | ECS 与数据驱动架构 | 数据驱动的组织方式与适用边界 |
| 10.2 | 大型项目模块化 | 大工程怎么分模块、控依赖 |
| 10.3 | 工程规范与静态检查 | 用工具把规范钉死 |
| 11.1 | 跨引擎对照:Cocos / Godot / Phaser / Defold | 四款引擎的核心差异 |
| 11.2 | 选型方法与迁移成本 | 按项目特征选引擎 |
| 11.3 | 全景回顾与展望 | 回顾与后续方向 |
八周学习计划
按路径 A 走,一个参考排期:
| 周次 | 章节 | 产出 |
|---|---|---|
| 第 1 周 | 第 1 章 | 看清引擎分层、主循环与 cc.d.ts 版图 |
| 第 2 周 | 第 2–3 章 | 理解渲染管线与 Effect 体系,会改着色器 |
| 第 3 周 | 第 4 章 | 2D 光照、阴影与 RenderTexture |
| 第 4 周 | 第 5–6 章 | 物理与动画子系统的内部与调优 |
| 第 5 周 | 第 7 章 | 内存与性能的量化与闭环 |
| 第 6 周 | 第 8–9 章 | 原生互通与引擎定制裁剪 |
| 第 7 周 | 第 10 章 | 架构与工程规范落地 |
| 第 8 周 | 第 11 章 | 跨引擎对照与选型判断 |
常见问题速查
| 你遇到的问题 | 去看 |
|---|---|
| 不知道某个 API 到底存不存在 | 1.3 从 cc.d.ts 读引擎 API 版图 |
| 想知道每帧引擎都干了什么 | 1.2 启动流程与主循环 |
| Draw Call 降不下来、合批总被打断 | 2.3 渲染批次与合批机制 |
| 想改内置材质但不知从哪下手 | 3.2 改造内置着色器 |
| 想加全屏滤镜 / 后处理 | 3.3 后处理与全屏特效 |
| 2D 光照效果不对 | 4.1 2D 光照与法线 |
| 物理碰撞表现和预期不符 | 5.1 内置物理与 Box2D 后端 |
| 要做射线检测或区域查询 | 5.3 自定义碰撞与查询 |
| 骨骼动画一多就掉帧 | 6.3 动画性能与内存 |
| 内存一直涨、GC 卡顿 | 7.1 内存模型与 GC |
| 显存吃紧、纹理太大 | 7.2 纹理、显存与资源预算 |
| 掉帧但不知道瓶颈在哪 | 7.3 性能剖析与优化闭环 |
| 要接一个原生三方 SDK | 8.2 原生插件与三方 SDK 接入 |
| 主线程被重计算卡住 | 8.3 多线程与 Worker |
| 包体太大想裁剪引擎 | 9.2 自定义引擎与模块裁剪 |
| 想升级引擎版本但怕踩坑 | 9.3 引擎升级策略 |
| 在几款引擎之间做选型 | 11.2 选型方法与迁移成本 |
学完之后你能做什么
走完全书,你应该具备这几项能力——它们也是本卷隐含的验收标准:
- 读得懂
cc.d.ts:拿到一个不确定的 API,知道去类型声明里核对,而不是靠猜或搜二手博客。 - 说得清渲染为什么慢:能从 Draw Call、合批打断、材质切换、后处理开销几个角度定位,而不是笼统地说「渲染慢」。
- 改得动引擎:知道怎么从源码构建一份引擎、怎么裁剪模块、怎么在可控范围内改一段实现并评估代价。
- 做得出架构判断:面对一个新项目,能判断该不该上 ECS、模块怎么分、依赖怎么控。
- 选得对引擎:能按项目特征在 Cocos / Godot / Phaser / Defold 之间做有依据的取舍,并估算迁移成本。
这些能力无法只靠读获得,本卷的每一节都尽量给出可验证的代码或可核对的源码路径,方便你边读边试。
相关阅读
- 游戏开发专题 — 站内游戏开发的专题文章总入口
- 游戏引擎专题 — 引擎架构与渲染管线的专题讨论
- 图形学专题 — 渲染管线、着色器与图形 API 的系统文章
- TypeScript 专题 — 类型系统与工程实践
- 书稿专题 — 全部在线电子书与创作手记
准备好了就翻开第 1 章 1.1 引擎分层与源码结构 开始。若还没读卷二,建议先看《Cocos 游戏开发实战》目录 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。