《游戏引擎实现原理》卷一《引擎内核》全 61 篇,是一套以从零手写一个 3D 引擎内核为主线的书:从第 1 章定义「引擎的分层与模块边界」起,到第 18 章把前 17 章的零件装配成一个能跑的引擎,
helio会一路长大——一个带帧预算统计的固定步长主循环、一套依赖拓扑排序的子系统生命周期与 PAL 平台抽象层、一组线性 arena 与块分配器、一个让悬垂引用无处藏身的世代句柄系统、一套自研容器与游戏数学、一条从面向对象到数据导向的重构路径、一套基于稀疏集与 archetype 的 ECS 与查询调度、一个基于worker_threads与 work stealing 的 Job System、一套显式注册表的反射与序列化方案。每一节都写代码,每一节的代码都在本机真跑过,跑出来的结果就是这一节的结论。
本页是《引擎内核》的全书目录:按章节顺序列出全部 61 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的学习路径与周计划。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《游戏引擎实现原理》卷一《引擎内核》 |
| 篇数 | 61 篇(正文 18 章 54 节 + 目录篇 + 序 + 前言 + 附录 A–D) |
| 领域 | 3D 游戏引擎内核从零实现 |
| 贯穿项目 | 《微光岛》——一款低多边形 3D 收集冒险小游戏 |
| 从零引擎 | helio——纯 TypeScript、零运行时依赖、Node 26 直接运行 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按查漏场景跳读 |
| 实测环境 | Node 26.5.0、TypeScript 7.0.2、vitest 5.0.3 |
| 可运行性 | L1 内核代码全部本机实跑;基准数字附原始数据 |
全书目录
前置
| 篇目 | 核心内容 |
|---|---|
| 目录 | 本卷定位、阅读路径、贯穿项目与可运行性口径 |
| 序 | 为什么还要从零写一个引擎 |
| 前言 | 技术选型、可运行性口径与环境准备 |
第一部分:地基(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 引擎的分层与模块边界 | 五层划分与模块依赖方向 |
| 1.2 | 本书范围与站内分工 | 本卷讲什么、与站内既有文章的分工 |
| 1.3 | 一个引擎最少要有哪些零件 | 最小可运行引擎的零件清单与骨架 |
| 2.1 | 帧、时间与帧预算 | 帧预算构成与滑窗统计 |
| 2.2 | 固定步长、累加器与渲染插值 | 固定步长循环与死亡螺旋钳制 |
| 2.3 | 时间缩放、暂停与慢动作 | 缩放与未缩放时间轴 |
| 3.1 | 子系统注册、启动顺序与逆序关闭 | 依赖拓扑排序与循环依赖检测 |
| 3.2 | PAL 平台抽象层 | 时间、文件、线程、日志的平台抽象 |
| 3.3 | 断言、日志分级与配置系统 CVar | 断言语义、日志分级与类型化配置 |
第二部分:内存与句柄(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 为什么要自己管内存 | 分配节奏、布局可预测性与实测堆增量 |
| 4.2 | 线性 arena 与栈式分配器 | bump 分配、对齐与帧内临时内存 |
| 4.3 | 对齐、padding 与 TypedArray 上的真实布局 | 手工布局顶点结构的对齐陷阱 |
| 5.1 | 对象池与 freelist | 预分配与空闲链表,对照 new/GC |
| 5.2 | 块分配器与大小类 | 按 2 的幂分大小类与碎片统计 |
| 5.3 | 内存标签、预算与泄漏检测 | 按标签统计与分配计数泄漏检测 |
| 6.1 | 为什么指针会失效 | 悬垂引用在 TS 里的表现 |
| 6.2 | slot map 与世代句柄 | 索引 + 世代的句柄编码与失效检测 |
| 6.3 | 稀疏集、句柄回收与 ECS 的接缝 | 稀疏集 O(1) 增删查与紧凑遍历 |
第三部分:容器与数学(第 7–10 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 动态数组与开放寻址哈希 | 增长策略与开放寻址探测 |
| 7.2 | 位集合、环形缓冲与侵入式链表 | 位运算集合与零分配容器 |
| 7.3 | 字符串 intern、资源 GUID 与名字表 | 字符串驻留与句柄化标识 |
| 8.1 | 向量代数与 TypedArray 布局 | 向量运算与连续内存布局 |
| 8.2 | 矩阵、行/列主序与左/右手坐标系 | 主序、手性与转置陷阱 |
| 8.3 | 变换复合与逆变换 | 复合顺序与逆变换求法 |
| 9.1 | 欧拉角、万向节死锁与四元数 | 万向节死锁复现与四元数动机 |
| 9.2 | 四元数运算与最短弧插值 | 乘法、共轭与 slerp 最短弧 |
| 9.3 | 曲线、样条与缓动 | 贝塞尔、Catmull-Rom 与缓动 |
| 10.1 | 浮点确定性与跨端一致性 | 浮点不可复现性的来源 |
| 10.2 | 定点数:为确定性模拟准备 | 定点表示、运算与确定性 |
| 10.3 | 数值稳健:epsilon、饱和与除零 | 比较阈值与除零防护 |
第四部分:数据导向与 ECS(第 11–13 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 11.1 | 缓存层级与访存代价 | 缓存层级与连续/随机访存实测 |
| 11.2 | SoA / AoS / AoSoA 的真实差异 | 三种布局的速度与内存实测 |
| 11.3 | 从 OOP 到批处理的重构方法 | 把面向对象更新循环改造成批处理 |
| 12.1 | 从继承到组合到数据 | 三种组织方式与各自代价 |
| 12.2 | 组件存储:稀疏集与 archetype | 两种组件存储方案的实现与取舍 |
| 12.3 | 实体生命周期与句柄复用 | 实体创建销毁与句柄安全复用 |
| 13.1 | 查询匹配与缓存命中 | 组件集合匹配与查询结果缓存 |
| 13.2 | 迭代顺序、变更检测与脏标记 | 稳定迭代顺序与脏标记传播 |
| 13.3 | 系统依赖声明与并行调度 | 读写依赖声明与并行分组 |
第五部分:并发、反射与综合(第 14–18 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 14.1 | 为什么 JS 也需要 Job System | worker_threads 与主线程之外的计算 |
| 14.2 | 线程池、任务队列与 Atomics 同步 | 工作线程池与原子同步原语 |
| 14.3 | work stealing 队列的真实实现 | 双端队列与窃取策略 |
| 15.1 | 依赖 DAG 与拓扑执行 | 任务依赖图与拓扑执行 |
| 15.2 | 任务图构建与帧内调度 | 每帧构建任务图并调度 |
| 15.3 | 与主循环、渲染线程的同步 | 跨线程同步点与帧边界 |
| 16.1 | 引擎为什么需要反射 | 编辑器、序列化与脚本绑定的需求 |
| 16.2 | 类型注册与属性描述符 | 类型与属性描述符设计 |
| 16.3 | 显式注册表 + 代码生成扫描 | 不用装饰器元数据的反射方案 |
| 17.1 | 反射驱动的序列化:JSON 与二进制 | 由类型信息驱动的两种格式 |
| 17.2 | 引用、句柄与循环的处理 | 引用、句柄与循环引用策略 |
| 17.3 | 版本化与迁移 | schema 版本号与旧存档迁移 |
| 18.1 | 内核装配:把前 17 章拼成引擎 | 把全部零件组装成可运行引擎 |
| 18.2 | 《微光岛》第一个能走动的方块 | 用拼好的内核跑出确定性 demo |
| 18.3 | 回顾与路线:进入渲染卷 | 本卷小结与卷二衔接 |
附录
| 篇目 | 核心内容 |
|---|---|
| 附录 A helio 内核 API 与模块速查 | 全书模块、类型与关键 API 一览 |
| 附录 B 环境与复现速查 | Node 版本、依赖与各层代码跑通方法 |
| 附录 C 实测数据汇总 | 全书基准的原始数字与测量方法 |
| 附录 D 常见错误与 FAQ | 易错点、报错含义与排查清单 |
怎么用这份索引
- 系统学习:从目录篇 进入,按路径 A 顺序通读 18 章。
- 抓重点:直接跳到第二部分(内存与句柄)和第四部分(数据导向与 ECS),这两块是引擎最核心的部分。
- 查问题:用目录篇 末尾的「常见问题速查」表,或按上表标题跳读。
- 配代码:每篇正文的代码块都标了层级与来源文件,L1 的可以直接复制出来在 Node 26 上跑。