Tick:游戏线程的第一开销
stat tick 打开你会看到一个分类账:角色Tick、动画 Tick、物理 Tick、粒子 Tick、各种组件 Tick……对多数项目,Tick 占游戏线程的一半以上。
Tick 的三档治理
| 档位 | 手段 | 说明 |
|---|---|---|
| 不需要 | 关闭 Tick | 静态装饰、只受击的物件、纯数据 Actor |
| 低频即可 | 改 Tick 间隔 | 0.1~0.5 秒一次(UI 刷新、巡逻判断) |
| 必须每帧 | 保留,但优化函数体 | 让函数本身便宜 |
关闭 Tick 的对象清单:门 / 箱子 / 拾取物 / 灯具 / 静态 NPC / 大多数背景元素。它们用事件驱动(Overlap、交互输入)就够了。蓝图组件的 PrimaryComponentTick 可以在构造里 SetTickEnabled(false)。
Tick 间隔的正确用法
设置间隔时注意:
- UE 的 Tick 间隔是"最小间隔",不是"精确间隔"——实际执行时间点取决于调度;
- 不同 Actor 用不同的间隔值(0.1 / 0.2 / 0.33 / 0.5),错峰执行,避免同一帧所有低频 Tick 撞车;
- 间隔化的逻辑对"瞬移式检测"要小心:0.5 秒检测一次意味着敌人可能"穿过"快速移动的玩家——检测用连续物理(Overlap 事件),决策用低频 Tick。
Tick 里的写法优化
| 反模式 | 改进 |
|---|---|
| Tick 里 FindActor / GetAllActors 每帧搜索 | 缓存结果 / 用管理器注册 |
| Tick 里复杂数学用蓝图节点串联 | 热点函数下沉 C++ |
| Tick 里设置其他组件属性(引发级联) | 批量更新 / 事件通知 |
| Tick 里做字符串拼接 | 移到构造 / 状态变化时 |
