本轮修订与验证范围
2026-10-14 补齐 10.2 宿主对照输入和 11.2 弹窗测试,修正重复 DOM 标识;与卷一附录 A 的完整 pack.mjs 一起验证 Node 和浏览器脚本作用域。宿主是本地合成脚本,不代替真实平台登录/支付/广告/审核;全卷其他文件依赖仍需按阶段复核。
这是《小游戏开发实战》三卷本的第二卷。卷一回答了「做什么、给谁做、怎么算账」,这一卷回答「怎么把它做出来,并且做得手感对、跑得动」。它不讲 3D 渲染、不讲原生发行、不讲引擎 API,它讲的是在平台的包体、加载、内存与 API 约束下,一款小游戏的工程骨架、逻辑内核与体验打磨怎么落地,并且每一处都对应一个能跑出来的产物。
卷二《引擎、实现与体验打磨》回答三个问题:用什么引擎、工程怎么搭(第 1–4 章),逻辑内核怎么跑起来(第 5–10 章),体验与质量怎么打磨(第 11–16 章)。贯穿全书的仍是虚构的轻度小游戏 《合成小岛》(merge-island:合成 + 放置 + 关卡 + 装扮)与工具链 pebble(config/ + sim/ Python + core/ TypeScript + web/ 单文件 HTML)。卷一目录
给了市场与设计,卷三《上线变现与长线运营》接着把它推上线。
这套书与站内既有内容的分工
站内已经有不少相邻内容,写清楚分工比重复写一遍更有价值。这三处的边界是本卷最容易混淆的,务必分清:
- 小游戏创作平台专题(game-engine) 共 24 篇,讲的是做小游戏创作平台——编辑器、素材市场、BP 与融资,是 SaaS 创业口径。本卷是「在平台上做一款游戏」,是单款产品的工程口径,两者不重叠。
- 小程序小游戏开发综述 是一篇 96 行的单篇综述,覆盖引擎选型、性能、变现三块。本卷是成体系、可运行的 16 章,第 1 章给它一张逐项对照表。
- 引擎内核系列
讲的是从零实现引擎内核(helio,TS + WebGPU:渲染管线、图元、着色器)。本卷的
core/只做「配置驱动逻辑 + 平台 API 抽象层 + mock 宿主 + 最小渲染抽象」,不碰渲染管线内核,也不写引擎 API 教程。 - Cocos 游戏开发系列 是引擎 API 教程(Creator 组件、生命周期、渲染管线)。本卷不重复这些,只在选型章里横向引用。
一句话:本卷做的是「一款小游戏怎么被工程化地实现与打磨」,不是「做一个引擎」或「做一个平台」,也不是「某引擎 API 手册」。
明确不在本卷范围内
为了让边界清楚,下面这些这一卷不讲:
- 3D 渲染与美术管线(模型、骨骼、shader、美术生产流程)。
- Cocos / Godot / Defold 等引擎的 API 教程(站内已有专书)。
- 服务端架构(房间服、匹配、跨服;站内已有《MMO 服务器开发》四卷本 )。
- 做「小游戏平台 / 创作工具」本身(站内已有 game-engine 专题)。
- 真实平台后台数据、真机帧率与审核结果(X,需真实业务环境,命令行不可复现)。
可运行性口径
本卷与卷一用同一套六档标注,代码块头部注释里写着它属于哪一档:
| 层 | 含义 | 怎么验证 |
|---|---|---|
| S 仿真层 | Python 数值仿真:选型评分、分包预算、图集体积、引导漏斗、冷启动、帧预算 | /opt/homebrew/bin/python3 sim/<name>.py --config config/ --out out/,产出 JSON + CSV + SVG |
| P 内核层 | TypeScript 配置驱动逻辑内核 + 平台 API 抽象层 + mock 宿主 | node --test 'core/test/*.test.ts' |
| W 网页层 | 单文件 HTML 可玩原型:同一份 core/ 逻辑内联进一个 HTML,浏览器打开就能玩 | NODE_PATH=/opt/homebrew/lib/node_modules node web/verify.mjs web/dist/index.html |
| D 静态层 | 平台能力矩阵、包体预算表、兼容矩阵、数据表 schema、检查清单 | 仅 schema / lint 校验 |
| X 不可复现 | 真实平台后台数据、真机帧率、真实审核结果 | 正文每处显式标注「需真实业务环境,命令行不可复现」 |
| B 基准 | 选型评分稳定性、帧预算、内存漂移、手感容差 | 产出 JSON,软告警不硬失败 |
本卷延续卷一的两条核心主张:一份 config,三种消费(Python 仿真、TS 内核、浏览器原型读同一份数字,故 config/ 里禁浮点、TS 侧幂运算用 BigInt、除法一律整数地板除);一份逻辑,两种宿主(逻辑只依赖 Host 抽象,mock 宿主与真机宿主逐帧一致,故 core/ 里禁用 Math.random(),随机数一律可播种)。两条纪律同样适用:不编造平台后台数字,所有仿真数字来自本机实跑、只作「同机相对量级」。
卷二结构总览(16 章)
| 章 | 主题 | 可运行性层级 |
|---|---|---|
| 1 | 引擎与框架选型 | S + B |
| 2 | 工程骨架与构建管线 | P + S |
| 3 | 渲染与适配 | P + W |
| 4 | 资源与素材管线 | S + P |
| 5 | 游戏循环与状态机 | P(本卷核心) |
| 6 | 输入与交互实现 | P + W |
| 7 | 物理与碰撞 | P + S + W |
| 8 | 数据、存档与反作弊 | P + S |
| 9 | 对象池与内存管理 | P + S + B |
| 10 | 平台能力适配层 | P(本套核心主张) |
| 11 | UI 系统与界面实现 | P + W + B |
| 12 | 动效与手感打磨 | P + W |
| 13 | 新手引导实现 | P + W + S |
| 14 | 性能优化 | S + B |
| 15 | 测试与质量保障 | P + W |
| 16 | 工程化与协作 | P + D |
全书目录
前置
| 篇目 | 核心内容 |
|---|---|
| 目录 | 本页:定位、三处分工、可运行性口径与全书结构 |
| 附录 C:全书代码、配置与数据集索引 | pebble/ 全部文件索引、环境与六层复现命令 |
第一部分:引擎、工程与资源(第 1–4 章)
第 1 章 引擎与框架选型——本卷的 S + B 起点
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 引擎格局与能力对比 | 主流小游戏引擎的能力横向对比 |
| 1.2 | 选型加权评分与敏感度 | 可运行的加权评分与敏感度扫描(S+B) |
| 1.3 | 自研 vs 引擎的取舍 | 自研内核与用引擎的边界与成本 |
第 2 章 工程骨架与构建管线——把工程搭起来
| 节 | 文章 | 核心内容 |
|---|---|---|
| 2.1 | 项目结构与模块边界 | 目录结构、模块边界与依赖方向 |
| 2.2 | 分包与资源加载管线 | 首包 / 分包划分与加载顺序(P+S) |
| 2.3 | 构建产物与包体预算 | 构建产物清单与包体预算校验(S) |
第 3 章 渲染与适配——在无 DOM 环境里画出来
| 节 | 文章 | 核心内容 |
|---|---|---|
| 3.1 | 无 DOM 的 Canvas / WebGL 渲染环境 | 小游戏没有 DOM,怎么建立渲染环境 |
| 3.2 | 多分辨率与安全区适配 | 不同分辨率、刘海屏与安全区适配 |
| 3.3 | 渲染批处理与性能 | 合批、状态切换与绘制调用控制 |
第 4 章 资源与素材管线——图、音、版本
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 图集打包与纹理压缩 | 图集打包与纹理压缩格式的体积账(S+P) |
| 4.2 | 音频格式与体积 | 音频格式选择与体积控制 |
| 4.3 | 资源热更新与版本管理 | 资源热更新与版本一致性 |
第二部分:逻辑内核(第 5–10 章)
第 5 章 游戏循环与状态机——本卷核心
| 节 | 文章 | 核心内容 |
|---|---|---|
| 5.1 | 固定步长循环与确定性 | 固定步长、可播种随机与确定性回放(P) |
| 5.2 | 场景与游戏状态机 | 场景切换与游戏状态机 |
| 5.3 | 暂停、切后台与恢复 | 暂停、切后台与时间跳变的恢复 |
第 6 章 输入与交互实现——把手指变成操作
| 节 | 文章 | 核心内容 |
|---|---|---|
| 6.1 | 触控输入与手势抽象 | 触控事件的抽象与手势识别(P+W) |
| 6.2 | 拖拽与滑动手感 | 拖拽、滑动的手感参数与调参(W) |
| 6.3 | 平台输入差异 | 各平台输入事件与坐标差异 |
第 7 章 物理与碰撞——够用就好
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 物理需求分级 | 什么时候需要物理、需要到哪一级 |
| 7.2 | 轻量碰撞与空间划分 | 轻量碰撞检测与空间划分(P+S) |
| 7.3 | 物理手感调参 | 重力、弹性与手感调参(W) |
第 8 章 数据、存档与反作弊——数据不能丢
| 节 | 文章 | 核心内容 |
|---|---|---|
| 8.1 | 存储与云存档抽象 | 本地存储与云存档的统一抽象(P) |
| 8.2 | 存档结构与版本迁移 | 存档结构演进与版本迁移(P+S) |
| 8.3 | 客户端校验与反作弊 | 客户端可做的校验与反作弊边界 |
第 9 章 对象池与内存管理——别让 GC 卡住帧
| 节 | 文章 | 核心内容 |
|---|---|---|
| 9.1 | 对象池 | 对象池的复用与生命周期(P) |
| 9.2 | 内存与 GC 压力 | 内存占用与 GC 压力剖析(P+S) |
| 9.3 | 弱机降级 | 弱机识别与画质 / 逻辑降级(B) |
第 10 章 平台能力适配层——本套核心主张
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 平台 API 抽象层 | 把平台 API 收敛到一个抽象层(P) |
| 10.2 | 一份逻辑两种宿主 | mock 宿主与真机宿主共用同一段逻辑(P) |
| 10.3 | 平台兼容矩阵 | 平台能力差异的兼容矩阵 |
第三部分:体验打磨与质量(第 11–16 章)
第 11 章 UI 系统与界面实现——让界面不卡
| 节 | 文章 | 核心内容 |
|---|---|---|
| 11.1 | 布局、层级与滚动 | UI 布局、层级管理与滚动列表(P+W) |
| 11.2 | 弹窗与提示反馈 | 弹窗、Toast 与反馈的层级管理 |
| 11.3 | UI 合批与性能 | UI 合批与渲染性能(B) |
第 12 章 动效与手感打磨——让操作「有感觉」
| 节 | 文章 | 核心内容 |
|---|---|---|
| 12.1 | 缓动与时间轴 | 缓动函数与时间轴编排(P+W) |
| 12.2 | 打击感与粒子反馈 | 打击感、粒子与瞬时反馈(W) |
| 12.3 | 音效与震动反馈 | 音效与震动反馈的触发与降级 |
第 13 章 新手引导实现——把玩家教会
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | 引导状态机 | 用状态机实现新手引导(P) |
| 13.2 | 引导漏斗仿真 | 引导漏斗与流失点仿真(S) |
| 13.3 | 渐进教学与容错 | 渐进教学与误操作的容错(W) |
第 14 章 性能优化——首包、帧率、内存
| 节 | 文章 | 核心内容 |
|---|---|---|
| 14.1 | 首包与冷启动优化 | 首包体积与冷启动时间优化(S) |
| 14.2 | 帧率与卡顿剖析 | 帧率与卡顿的定位与剖析(S+B) |
| 14.3 | 内存与包体优化 | 内存占用与包体优化 |
第 15 章 测试与质量保障——让改动敢发
| 节 | 文章 | 核心内容 |
|---|---|---|
| 15.1 | 逻辑单元测试 | 逻辑内核的单元测试(P) |
| 15.2 | 端到端回放自动化 | 端到端回放与无头验收(P+W) |
| 15.3 | 兼容性与机型矩阵测试 | 兼容性与机型矩阵测试(W) |
第 16 章 工程化与协作——把工程收口
| 节 | 文章 | 核心内容 |
|---|---|---|
| 16.1 | 代码组织与类型安全 | 代码组织与类型安全约定(P) |
| 16.2 | 配置驱动数据表 | 配置驱动的数据表与校验(P) |
| 16.3 | CI 与发布管线 | 持续集成与发布管线(D) |
附录
| 篇目 | 核心内容 |
|---|---|
| 附录 C:全书代码、配置与数据集索引 | pebble/ 文件索引、e<章号>_ 命名约定、六层复现命令 |
三条阅读路径
路径 A:工程与引擎课(第 1–4 章顺序读)
从引擎选型评分开始,经工程骨架、渲染适配,到资源与素材管线。这条路径回答「用什么、怎么搭、包体够不够」。读完你能用一张加权评分表解释引擎选择,并跑出分包与图集的体积账。
路径 B:内核实现课(第 5–10 章顺序读)
从固定步长循环与确定性开始,经输入交互、物理碰撞、存档反作弊、对象池内存,到平台能力适配层。这条路径回答「逻辑内核怎么跑起来、怎么跨宿主一致」。读完你能让同一段逻辑在 mock 宿主与浏览器里逐帧一致地跑。
路径 C:体验与质量课(第 11–16 章顺序读)
从 UI 与动效开始,经新手引导、性能优化、测试保障,到工程化协作。这条路径回答「怎么做得好玩、跑得顺、改得放心」。读完你能产出一个可玩 HTML 原型,并用无头验收证明它没坏。
常见问题速查
| 你想解决的问题 | 看哪节 |
|---|---|
| 该选哪个引擎? | 1.1 、1.2 |
| 该不该自研内核? | 1.3 |
| 工程目录怎么分、模块边界在哪? | 2.1 |
| 首包放不下怎么分包? | 2.2 、2.3 |
| 小游戏没有 DOM 怎么渲染? | 3.1 |
| 刘海屏、异形屏怎么适配? | 3.2 |
| 图集怎么压、压多少合适? | 4.1 |
| 音频太大怎么办? | 4.2 |
| 热更新怎么保证版本一致? | 4.3 |
| 怎么保证确定性回放? | 5.1 |
| 切后台回来时间跳了怎么办? | 5.3 |
| 拖拽手感怎么调? | 6.2 |
| 碰撞怎么做到「够用」? | 7.2 |
| 存档怎么升级不出错? | 8.2 |
| 客户端能做哪些反作弊? | 8.3 |
| 掉帧卡顿怎么定位? | 9.2 、14.2 |
| 怎么做到一份逻辑两种宿主? | 10.2 |
| 平台 API 差异怎么屏蔽? | 10.1 、10.3 |
| 长列表滚动卡怎么办? | 11.1 、11.3 |
| 打击感怎么加? | 12.2 |
| 新手引导怎么实现、怎么测? | 13.1 、13.2 |
| 冷启动太慢怎么办? | 14.1 |
| 怎么给逻辑内核写测试? | 15.1 、15.2 |
| 数据表怎么配置与校验? | 16.2 |
| 怎么搭 CI 与发布管线? | 16.3 |
环境准备
本卷的代码块都在 pebble/ 工作区里可以复现,环境前提与卷一完全相同:Python 3.14.6(/opt/homebrew/bin/python3,带 numpy / pandas / PIL)与 Node 26(原生跑 TypeScript,不需要 tsc / npm install / package.json)。图表不用 matplotlib(本机未安装),SVG 是纯 Python 用 xml.etree 画出来的。下面这段 S 层脚本会替你把运行时确认一遍:
# file: sim/ch00_env_check.py
# tier: S
# verify: /opt/homebrew/bin/python3 sim/ch00_env_check.py
"""环境自检:确认《小游戏开发实战》三卷需要的运行时都在,并打印 pebble 的能力阶梯。
本机有两个 python3,不要混:
/opt/homebrew/bin/python3 = 3.14.6(带 numpy / pandas / PIL),S 层仿真一律用它;
/usr/bin/python3 = 3.9.6(系统自带,无 numpy/pandas),只能跑最朴素的脚本。
"""
from __future__ import annotations
import os
import shutil
import subprocess
import sys
EXPECT_PY = "/opt/homebrew/bin/python3"
def main() -> int:
ok = True
# /opt/homebrew/bin/python3 是符号链接,比较时解析到真实二进制再判断
real = os.path.realpath(sys.executable)
print(f"python {sys.version.split()[0]} ({real})")
if real != os.path.realpath(EXPECT_PY):
print(f" 注意:正文脚本一律用 {EXPECT_PY},当前解释器不同")
try:
import numpy
import pandas
print(f"numpy {numpy.__version__}")
print(f"pandas {pandas.__version__}")
except ImportError as e: # noqa: BLE001
ok = False
print(f"FAIL 缺依赖:{e}(S 层需要 numpy 与 pandas)")
node = shutil.which("node")
if not node:
ok = False
print("FAIL node 未安装(P 层需要 Node 26 或更高)")
else:
ver = subprocess.run([node, "-v"], capture_output=True, text=True).stdout.strip()
major = int(ver.lstrip("v").split(".")[0])
note = "" if major >= 26 else " (低于 26,原生 TypeScript 不可用)"
print(f"node {ver}{note}")
ok = ok and major >= 26
print("pebble 能力阶梯:S 仿真 / P 内核 / W 网页 / D 静态 / X 不可复现 / B 基准")
print("OK 环境就绪" if ok else "FAIL 环境不满足")
return 0 if ok else 1
if __name__ == "__main__":
raise SystemExit(main())
注意卷二工具链的命名约定:本卷所有 pebble/ 文件一律用 e<章号>_ 前缀(如 config/e04_atlas.json、sim/e04_atlas.py、core/src/e04/、core/test/e04_*.test.ts、web/build_e04.mjs),因为卷一的 ch01–ch15 前缀已被占用。这样 node --test 'core/test/e04_*.test.ts' 不会误匹配卷一的 ch*.test.ts。完整索引、逐层复现命令与排错顺序见附录 C
。
本页是卷二目录。可以从第 1 章 1.1 引擎格局与能力对比 开始顺序读,也可以先回卷一的目录 确认设计前提。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。