《Cocos 游戏开发高级编程》2.1 渲染管线与自定义管线
第 1 章把引擎拆成分层,这一节往下钻一层:一帧画面在 Cocos Creator 3.8 里由谁驱动。我们从 Camera 组件切入,顺出 RenderPipeline、RenderFlow、RenderStage 的三层结构,用 cc.d.ts 与 cocos-engine 3.8.8 源码逐层核实,再讲 PipelineEventType 可插入点,最后界定自定义管线的边界与代价。
category
第 1 章把引擎拆成分层,这一节往下钻一层:一帧画面在 Cocos Creator 3.8 里由谁驱动。我们从 Camera 组件切入,顺出 RenderPipeline、RenderFlow、RenderStage 的三层结构,用 cc.d.ts 与 cocos-engine 3.8.8 源码逐层核实,再讲 PipelineEventType 可插入点,最后界定自定义管线的边界与代价。
把 cc.d.ts 当权威字典用:讲清 declare module "cc" 的顶层骨架、617 条导出按形态的分布,给出可复现的 grep 查法,并用一段纯 TS 的导出扫描器把这套查法写成可单测的代码,最后演示如何从枚举反推引擎的能力边界。
沿着 pal/pacer 到 Game、Director.tick、Root.frameMove 这条链,逐段核对 Cocos Creator 3.8.8 一帧里的七个阶段与组件回调位置,并用一段可单测的纯 TS 主循环复刻这套执行顺序,最后给出在组件里监听帧事件的正确写法与常见误区。
把 Cocos Creator 3.8.8 拆成引擎核心、渲染后端、平台适配与 JSB 绑定四层,将 cocos/cocos-engine 的源码目录逐层映射到各自职责,给出用 sys 与构建配置判断当前运行层的可验证方法,并说明遇到问题时该往哪一层下潜排查。
手写关卡写到第三十关就会枯竭。本节让程序按难度曲线生成关卡:用 mulberry32 做可复现的种子随机,把「难」拆成速度、间距、危险占比三条曲线,再用由跳跃初速度与重力推出的最大跳跃距离约束沟宽,最后用 LevelBuilder 把生成结果实例化到 Cocos 场景里。
8.1 定了 levels.json 的结构,但表是人写的,人一定会写错。本节写加载与校验两层:用 assetManager.loadBundle 与 JsonAsset 从 bundle-levels 读表并做缓存与释放,再用一份纯 TS 校验器把漏字段、y 越界、goalX 早于最后障碍等错误在加载时就变成清晰报错,配 vitest 用例与失败兜底。
本节用弹窗栈管理暂停、结算、设置三个面板的压栈出栈与遮罩点击拦截,给出带进出动画的 PopupBase 基类与可直接单测的栈逻辑,并按 sys.languageCode 切换中英文文案表,说明中英文字长差异导致的换行、溢出与字号不一致该如何取舍。
本节拆解 Cocos Creator 3.8 的 ScrollView 节点结构与属性面板取值,用 Layout 与 Prefab 搭出关卡选择列表,用 NodePool 复用列表项控制 Draw Call,并给出滚动结束事件驱动的分页与吸顶实现,以及可在命令行单测的可见项区间算法。
远程与热更是资源管线的最后一环。本节区分远程 Bundle 与原生热更两条路:讲清 isRemoteBundle 与构建面板远程地址怎么配、loadRemote 加载包外单文件、native.AssetsManager 的 checkUpdate/update 事件流与 manifest 结构,并给出按 sys.isNative 与 sys.Platform 分流的多端策略与发布清单。
一张 PNG 拖进 assets/ 之后发生了什么:讲清 .meta 文件的结构与 uuid 身份、图片与音频的导入设置、为什么 .meta 必须提交又绝不能手改、复制粘贴导致的 uuid 冲突怎么排查,并写出用 resources 按 sub-asset 路径加载 SpriteFrame 的组件代码。
属性面板显示哪些字段、值怎么存进 .prefab:讲清 @property 的几种写法(类型、数组、选项对象),为什么改字段名会让编辑器里绑好的引用变空、formerlySerializedAs 怎么救,serializable:false 与 editorOnly 用在哪,并打开预制体看自定义组件的序列化结果。
卷二最后一节,做一次收尾与交接:盘点《方块冲刺》从 demo 到产品的完整轨迹与三个贯穿全卷的关键决策,划清卷二刻意没讲的部分,交代高级卷要回答的「为什么」类问题,给出从「会用」到「会查 cc.d.ts」的实证方法与常见误区澄清,并列出继续做这款游戏的三个方向。
本节把《方块冲刺》全卷真正踩过的坑收敛成一份复盘:平台判断用字符串比较、.meta 丢失致引用断裂、动态加载路径带扩展名与大小写、常驻节点忘了移除、资源不释放、分包名与目录名不一致、三端存档差异、构建缓存带进旧代码,每条都给出症状、根因与修法,并汇总成一张速查表。
本节把《方块冲刺》真正推上线:先回看第 1.1 节定下的功能需求 FR-01 到 FR-08、非功能需求 NFR-01 到 NFR-06、用例 UC-01 到 UC-05,再把它们逐条翻译成功能、非功能、用例、三端构建、合规五个维度的可勾选检查项,给出构建配置实际取值与发布单模板,让「发布」从感觉变成清单。
CI 里的冒烟能挡住白屏,却挡不住真实用户那边偶发的崩溃与卡死。本节把线上问题变得「看得见」:用 window 事件与引擎事件捕获异常、用纯逻辑模块定义埋点结构与批量编码、用 sys.platform 采集环境上下文,并讲清三端差异、本地队列、上报时机与隐私边界。
类型对、单测过,不代表跑起来不白屏。本节把「冷启动 → 主菜单 → 跳一下」这条主路径写成 Playwright 冒烟用例,用 Cocos CLI 构建 H5 产物、用截图比对守住首屏外观,并给出 CI 里的构建命令、产物归档与失败判定——让每次提交都自动「打开游戏看一眼」。
启动耗时优化完了,怎么保证下次改动不会让它悄悄退回去?答案是把验证交给机器。本节把项目脚本分成「纯逻辑 core」与「引擎 game」两层,对前者用 vitest 跑单测,对后者用 @cocos/creator-types@3.8.8 做 tsc --noEmit 类型门禁,并给出这两道门禁在 CI 里的落点、命令、产物与失败判定。
变现的另一条腿是内购,而内购比广告更麻烦:它牵涉订单、验签、发货,还牵涉实名、防沉迷、消费限额这些合规红线。本节给出「服务端下单、平台支付、服务端验签发货」的完整时序,写一个防重复购买的 IapService,再逐条列出上架前必须过的合规清单。
激励视频是《方块冲刺》最主要的变现方式,也是体验最容易翻车的地方。本节先规划广告位,再给出「创建一次、加载、展示、onClose 结算」的完整时序,写一个带状态机与并发锁的 AdManager,保证奖励只发一次,最后处理无广告填充时的降级策略与激励弹窗预制体。
从这一章起游戏要真正调用平台 SDK。本节把登录拆成游客、微信小游戏、自有账号三种形态,给出以 wx.login 换 code、服务端换 openid 的完整时序,再把分享分成主动与被动两条路径,并强调微信不回调分享结果、所以「分享发奖」必须走服务端校验。