章节摘要:本章的线索是一秒钟内发生的事——游戏跑起来的每一秒,主循环转几十圈,每圈采集输入、推进物理、跑脚本、提交渲染;同时成百上千个对象在创建与销毁,引用计数默默记账。看懂这两件事,"游戏为什么卡"、"对象为什么没了"这类问题就有了推理的起点。
想象你把游戏慢放一万倍,盯着一帧的画面看:这一帧里,引擎先收下键盘与手柄的状态,再让物理服务器把世界推进一步,然后挨个调用场景树上万节点的处理函数,最后把绘制指令打包交给渲染服务器。下一帧,一切重来。本章沿这条时间线走两站:第一站拆主循环本身——帧的节拍、两类处理回调的分工、以及引擎把渲染物理音频拆成若干"服务器"的分层智慧;第二站离开时间轴,看空间维度的另一场戏——对象如何在引用计数下生老病死、资源如何被缓存复用、内存泄漏与悬空调用从何而来。
两节的分工可以这样记:2.1 管"什么时候",2.2 管"活多久"。它们是同一台机器的时间轴与空间轴,合在一起才构成完整的内核地图。
章内还有两处交叉引用值得留意:帧次序是理解排队销毁的前提(拆除被推迟到帧末的安全时点),引用计数是理解信号自动清理的前提(弱引用机制)。机理与机理之间彼此咬合,这也是把它们放进同一章的理由。
本章的认知转折在于:把引擎从"黑箱"翻成"流水线"。帧不是瞬间,是一段有严格次序的工序;对象不是凭空消失,而是引用归零即拆。两个结论值得带走——写逻辑时永远问自己"这段代码跑在帧的哪个阶段";删对象时永远问"这一帧还有谁会碰到它"。养成这两个反射,一半的"玄学故障"会自动现形。
给急于上手的人一句安心话:本章两节都偏机理,不背下来也不影响你照着第 5 章把游戏做出来。但等你遇到"速度随帧率漂移"、"对象莫名被释放"这类问题时,一定要回来重读——那两类问题的完整解释都在本章,而且是能从头推导出来的解释,不是玄学。学习引擎内核的正确节奏是:先用,再疑,再回来验证机理。
对照自查用:一帧内五道工序的先后与三条推论;固定物理步长与可变渲染帧的分工依据;帧间隔系数在增量计算中的角色;服务器家族的成员名单与 RID 间接引用的三样收益;引用计数的记账规则与常见持有人清单;节点类为何是计数制的例外;排队销毁与立即销毁的时机差异;孤儿节点的产生条件与防治;资源共享语义带来的"改一处动全身"现象;缓存导致的"重载同名同份"行为。每一条都能在两节正文里找到推导过程,不是孤立结论。
机器的节拍与生死规则清楚了,第 3 章回到我们真正天天打交道的层面:节点、场景与信号——把第 1 章的哲学变成上手的操作。