11.3 全景回顾与展望
走到这里,全卷 11 章 33 节就讲完了。这一节不做新知识,只做两件事:把散落在各章的线索收成一张图,以及告诉你接下来该往哪走。
回顾之前先明确这一卷到底改变了什么。卷一让你「会拆引擎」,卷二让你「会用引擎做产品」,卷三让你「懂引擎为什么这么设计」。三者不是替代关系——「懂」不意味着你不用再「会」,而是当「会」的手段失灵时,你多了一条往下挖的路。
所以这一节不是「总结知识点」——知识点分散在 33 节里,逐条复述既冗余又无趣。它要做的是建立结构:让你在合上书之后,脑子里留下的不是 33 个孤立的知识点,而是一张能随时调用的地图。
11.3.1 一张图收完整卷
把 11 章按依赖关系摆成一张全景图。从下往上是「越挖越深」,从上往下是「越看越广」:
┌──────────────────────────────────────────┐
│ 第 11 章 跨引擎对照 · 选型 · 迁移成本 │
└──────────────────────────────────────────┘
▲
┌──────────────────────────────────────────┐
│ 第 10 章 ECS · 模块化 · 工程规范 │
└──────────────────────────────────────────┘
▲
┌───────────────────┬───────────────────────┬───────────────────┐
│ 第 7 章 内存与性能 │ 第 8 章 原生与多线程 │ 第 9 章 引擎定制 │
└───────────────────┴───────────────────────┴───────────────────┘
▲
┌───────────────────┬───────────────────────┬───────────────────┐
│ 第 4 章 2D 光照 │ 第 5 章 物理内部 │ 第 6 章 动画深入 │
└───────────────────┴───────────────────────┴───────────────────┘
▲
┌───────────────────┬───────────────────────┬───────────────────┐
│ 第 1 章 引擎分层 │ 第 2 章 渲染管线 │ 第 3 章 Effect │
└───────────────────┴───────────────────────┴───────────────────┘
图的读法:最下面一层是「引擎长什么样」,中间一层是「子系统怎么跑」,上面一层是「怎么量、怎么改、怎么定制」,最上面两层是「怎么组织、怎么选」。任何一层出问题,都要往下找一层去定位——性能不达标(第 7 章)要往渲染(第 2、3 章)和子系统(第 5、6 章)里查,而不是停在上层空谈优化。
这张图还有一个隐含的用法:它标出了「依赖方向」。你不能跳过第 1 章的引擎分层直接读第 9 章的源码定制,因为定制的前提是知道源码在整张图里的位置;你也不该跳过第 7 章的量化直接做第 10 章的架构决策,因为没有度量就没有判断依据。顺着图自下而上读,是阻力最小的路径;逆着读则容易「知其然不知其所以然」。
把这张图存下来,它就是你日后遇到问题时「往哪一层查」的第一张索引。
11.3.2 四部分回顾
按全书四个部分,逐块回看每一部分解决的问题与留下的工具:
| 部分 | 章节 | 解决什么问题 | 留下的工具 |
|---|---|---|---|
| 引擎与渲染管线 | 1–3 | 引擎由哪些层组成、一次绘制怎么被组织 | cc.d.ts 版图、管线可插入点、Effect 写法 |
| 高级渲染与子系统 | 4–6 | 光照、物理、动画这些重子系统的内部 | 2D 光照方案、物理后端选择、动画性能诊断 |
| 性能、原生与定制 | 7–9 | 怎么量化性能、怎么互通原生、怎么改引擎 | 优化闭环、JSB 与 Worker、模块裁剪 |
| 架构与收官 | 10–11 | 怎么组织大工程、怎么选引擎 | ECS 与模块化判断、跨引擎对照与迁移估算 |
这四部分的顺序不是随意的。 前面讲「引擎怎么跑」,第 7 章把它变成「怎么量化」,后面才谈「怎么改」与「怎么组织」——因为量化是改动的前提,不改而谈优化是空谈,不动量化而谈架构是臆想。
逐部分再看一眼它们的「入口问题」:
- 第一部分(1–3)回答「引擎长什么样」。它给你的不是操作手册,而是一张地图——知道 API 背后有哪几个子系统、一次绘制经过哪些环节。没有这张地图,后面所有「往哪里挖」都是盲猜。
- 第二部分(4–6)回答「子系统怎么跑」。光照、物理、动画是三条最容易出性能问题的线,也是「表现和直觉不符」最集中的地方。理解了内部机制,你才能在调参时知道自己在动什么。
- 第三部分(7–9)回答「怎么量、怎么改」。这是从「读」到「动手」的转折——第 7 章教你度量,第 8、9 章教你伸手进引擎里改。它把前三部分的「理解」变成了「可操作」。
- 第四部分(10–11)回答「怎么组织、怎么选」。它站在更高的位置,把前面所有机制知识沉淀成工程判断:该不该上 ECS、模块怎么分、引擎怎么选。
如果你只有时间重读一部分,建议重读第三部分(7–9)。原因很实际:它既是前三部分知识的「变现出口」——所有对引擎的理解最终都要通过性能与定制体现价值;又是第四部分判断的「证据来源」——没有量化的数据,架构与选型决策就站不住脚。第 7 章之所以被反复称作全卷枢纽,正是因为它同时向前收束、向后供给。
11.3.3 从「会用」到「懂」:你拿到了什么
把卷三承诺的能力对回每一章,逐条检查你是否真的拿到了:
| 能力 | 对应章节 | 验收方式 |
|---|---|---|
读得懂 cc.d.ts | 1.3 | 拿到不确定的 API 会去类型声明里核对 |
| 说得清渲染为什么慢 | 2.3、7.3 | 能从 Draw Call、合批、材质切换定位 |
| 改得动引擎 | 3.2、9.2 | 能从源码构建、裁剪、改一段实现并评估代价 |
| 做得出架构判断 | 10.1、10.2 | 能判断该不该上 ECS、模块怎么分 |
| 选得对引擎 | 11.1、11.2 | 能按项目特征取舍并估算迁移成本 |
如果其中某一项你还答不上来,回去翻对应章节即可——这份表本身就是一份复习清单。
要提醒的是:这五项能力都不是「读过就会」,而是「用过才算」。读得懂 cc.d.ts 的标志,是你真的去核过一个不确定的 API;说得清渲染为什么慢的标志,是你真的用第 7 章的闭环定位过一次瓶颈。卷三每节都尽量给了可验证的代码或可核对的源码路径,就是希望你边读边试——只有试过,知识才会从「看过」变成「会」。
还有一个容易被忽略的验收维度:能不能把能力讲给别人听。如果你能用几句话向同事解释「为什么合批会打断」,说明你是真懂了;如果讲着讲着卡壳,那正是你还没吃透的地方。输出是最好的检验。
11.3.4 L1:把整卷要点建成可查询的能力矩阵(可跑)
复习最好的方式是能「查」。下面这段是纯 TypeScript,把 11 章的要点建成一个可查询的数据结构,不依赖任何引擎,可以直接单测。
// 全书能力矩阵:把 11 章要点建成可查询的数据结构(纯逻辑,可单测)
export interface Chapter {
readonly id: string;
readonly title: string;
readonly part: string;
readonly capability: string;
}
export const CHAPTERS: readonly Chapter[] = [
{ id: '1', title: '引擎架构总览', part: '引擎与渲染', capability: '读懂 cc.d.ts 与引擎分层' },
{ id: '2', title: '渲染管线', part: '引擎与渲染', capability: '定位 Draw Call 与合批问题' },
{ id: '3', title: '着色器与 Effect', part: '引擎与渲染', capability: '改写内置 Effect 与后处理' },
{ id: '4', title: '2D 光照与高级渲染', part: '高级渲染与子系统', capability: '做 2D 光照与 RenderTexture' },
{ id: '5', title: '物理引擎内部', part: '高级渲染与子系统', capability: '选物理后端并调优' },
{ id: '6', title: '动画系统深入', part: '高级渲染与子系统', capability: '诊断动画的性能与内存' },
{ id: '7', title: '内存与性能', part: '性能、原生与定制', capability: '建立优化闭环' },
{ id: '8', title: '原生与多线程', part: '性能、原生与定制', capability: '接 JSB 与 Worker' },
{ id: '9', title: '引擎定制与源码', part: '性能、原生与定制', capability: '裁剪与升级引擎' },
{ id: '10', title: '架构与工程化', part: '架构与收官', capability: '做 ECS 与模块化决策' },
{ id: '11', title: '收官', part: '架构与收官', capability: '跨引擎选型与迁移估算' },
];
export function byPart(part: string): readonly Chapter[] {
return CHAPTERS.filter((c) => c.part === part);
}
export function findByCapability(keyword: string): readonly Chapter[] {
return CHAPTERS.filter((c) => c.capability.includes(keyword));
}
用它的方式和用文档目录不同:你可以按「能力」而不是「章节」检索。比如手头遇到合批问题,findByCapability('合批') 直接命中第 2 章;要评估要不要换引擎,findByCapability('选型') 命中第 11 章。把知识组织成「问题 → 章节」的映射,比记章节顺序更贴近实际使用。
这也是一种值得养成的习惯:把读过的技术知识整理成可检索的结构,而不是留在记忆里。记忆会模糊、会遗忘,但一份结构化的清单不会。你可以把 CHAPTERS 换成你自己项目用到的 API、踩过的坑、验证过的参数——它就是一个只属于你的技术手册。
11.3.5 L2:一个把工具串起来的自检组件(可类型检查)
卷三反复用到两个东西:性能采样(第 7 章)与运行帧信息(第 1、2 章)。下面这个小组件把它们串起来,作为一个「随手打开的性能自检开关」——所有符号均可在 cc.d.ts(3.8.8)中核到。
import { _decorator, Component, profiler, director, game } from 'cc';
const { ccclass, menu } = _decorator;
@ccclass('BookSelfCheck')
@menu('BlockDash/Diagnostics/BookSelfCheck')
export class BookSelfCheck extends Component {
onEnable(): void {
// 打开引擎自带的性能面板(第 7 章的优化闭环会反复用到)
if (!profiler.isShowingStats()) {
profiler.showStats();
}
}
update(): void {
// 第 7 章的帧预算:60 FPS → 16.6 ms/帧
const budgetMs = game.frameTime * 1000;
const scene = director.getScene();
if (scene && budgetMs > 16.6) {
// 超预算,交给第 7 章的剖析流程定位
void scene;
}
}
onDisable(): void {
profiler.hideStats();
}
}
它本身不是完整工具,而是一个入口:把「看帧时间、看场景、开性能面板」这三件事收在一个组件里,调试时挂上、发布前移除。卷三里讲过的所有机制,最终都要能落到这样一个小而具体的动作上——懂引擎的标志,不是能背出多少概念,而是遇到问题时知道该打开哪个开关。
注意这个组件用到的符号——profiler、director、game——恰好对应卷三的三个层次:profiler 是第 7 章的性能工具,director 是第 1 章的引擎主干,game 是第 1、2 章的帧循环入口。一个二十行的组件,就能把三章的核心对象串在一起——这也是判断自己是否真读懂了的方法:能不能用最短的代码,把散落各章的东西连接起来。
11.3.6 三条贯穿全卷的暗线
回头数一数,有三条线索几乎每一章都在出现,值得单独点出来:
第一条:从「现象」到「机制」的追问。 卷三每讲一个现象,都会追问背后的机制——合批为什么被打断、GC 什么时候触发、骨骼动画为什么掉帧。这条线教会你的是一种提问方式:不要停在「它这样」,要问「它为什么这样」。
第二条:量化的习惯。 从第 2 章的 Draw Call 到第 7 章的帧预算,卷三反复强调「先测再说」。没有量化,优化就是玄学;有了量化,你才知道改动到底有没有用。这也是为什么第 7 章被放在全卷的枢纽位置。
第三条:代价意识。 裁剪引擎省了包体但可能砍掉功能,上 ECS 提升性能但增加复杂度,改源码解决问题但抬高升级成本。卷三从不给「银弹」,只给「取舍」——每一个收益背后都有代价,成熟的做法是把它算清楚再决定。
这三条暗线合起来,其实就是「工程思维」:追问机制、量化验证、权衡代价。它比任何具体 API 都更耐用,换到别的引擎、别的技术栈,依然成立。这也是为什么卷三把「跨引擎对照」放在最后一章——当你带着这套思维去看别的引擎时,你比较的就不再是功能,而是取舍。
如果说前面 10 章是「术」——具体怎么读、怎么改、怎么调;那么这一节想留下来的,是「道」——一套可以迁移到任何引擎上的思考方式。术会随版本失效,道不会。
11.3.7 继续深入的方向
卷三讲完了,但这条路远没到头。一个负责任的技术书,不应该在最后假装「你已经学完了」——它更应该告诉你「接下来还有哪些更深的水」。下面四条是最自然的延伸,站内大多已有对应专题:
| 方向 | 为什么值得继续 | 站内入口 |
|---|---|---|
| 引擎源码深读 | 卷三只标了源码路径,真正读进去才能改得准 | 引擎架构与渲染管线 |
| 图形学理论 | 卷三讲 Cocos 实现,底层原理要补图形学 | 图形学专题 |
| 自研引擎与商业引擎 | 从「用引擎」走到「造引擎」 | 游戏引擎专题 |
| 其他引擎的对照 | 11.1 只做了横向对照,深入要读各自的专题 | Godot · Phaser · Defold |
此外还有两条「跨卷」的方向:联机与网络(见卷四《Cocos 游戏联机实战》,客户端侧联机),以及类型系统与工程化(见TypeScript 专题 )。卷三在工程化上只到「怎么用工具把规范钉死」,类型系统的深度用法值得单独补。
选哪条继续,取决于你想解决什么问题:
- 想解决具体的性能 / 渲染问题:优先「引擎源码深读」与「图形学理论」,它们直接回答「为什么慢、怎么改」。
- 想拓宽技术视野:走「其他引擎的对照」,用 11.1 的坐标系去读 Godot、Phaser、Defold 的专题。
- 想换赛道:走「自研引擎与商业引擎」,那是从「用」到「造」的跨越,难度也最高。
- 想做完整产品:回到卷二与卷四,把「发布」与「联机」这两条产品线补齐。
没有哪条是「正确」的路线,只有「适合你现在目标」的路线。 这也是卷三反复强调的:技术选择要服务于目标,而不是反过来。
11.3.8 给不同读者的下一步
最后,按你的角色给一条具体的下一步:
| 你是谁 | 下一步建议 |
|---|---|
| 想把引擎用到极致的开发者 | 从第 9 章出发,真正拉一份 3.8.8 源码编译一遍 |
| 团队技术负责人 | 用 11.2 的方法,为你手上的项目做一次选型复盘 |
| 想转向引擎方向的人 | 顺着第 2、3 章把渲染管线读透,再补图形学 |
| 想发多端产品的独立开发者 | 回到卷二,把《方块冲刺》的发布流程走完整 |
这张表没有「最优读者」——它只是提醒你:同一个知识体系,对不同角色的用法是不同的。开发者关心「怎么改」,负责人关心「怎么选」,两条路径都从同一套机制理解出发,只是终点不同。
11.3.9 结语
回头看这 11 章,其实只做了一件事:把「黑盒」一点点变成「白盒」。引擎的每一层——渲染、物理、动画、内存、原生——卷三都至少给了一次「掀开看」的机会。掀开之后你会发现,引擎里没有魔法,只有一堆可以理解、可以量化、可以改动的取舍。
而「懂」的最大回报,是从容。当性能掉下来,你不再慌张地搜索「Cocos 卡顿怎么办」,而是知道该打开哪个面板、该往哪一层查;当有人推荐另一款引擎,你不再盲从或盲拒,而是能拿项目约束去比对;当引擎行为与直觉不符,你不再猜,而是去 cc.d.ts 和源码里找答案。
这种从容不是天生的,是「掀开黑盒」掀出来的。每一次追问机制、每一次量化验证、每一次权衡代价,都在往这个方向积累。卷三能做的,是把方法交给你;剩下的路,要靠你在自己的项目里走。
这份从容,就是《Cocos 游戏开发高级编程》想交给你的东西。四卷本到这里走完三卷,下一卷《Cocos 游戏联机实战》会把镜头转向客户端侧的联机——那是另一条同样深的线。
最后送一句话作为全卷的收尾:引擎是工具,理解是能力,而能力不会因为你换了工具就作废。今天你在 Cocos 里学到的分层思维、量化习惯与代价意识,明天无论你用哪款引擎、做哪类产品,都还是那套东西。真正会过时的从来不是引擎,而是不肯往深处走的人。
如果这一卷只让你记住一件事,希望是「先量化,再下判断」——它能省下的返工,比任何 API 技巧都多。
祝你在引擎里挖得开心,也挖得踏实。
阅读导航:上一节:11.2 选型方法与迁移成本 · 下一节:回到目录 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。