蓝图性能与优化

自动关联目录:蓝图性能与优化

1. 定位

蓝图比 C++ 慢,但慢在哪里要有准确认识——否则要么过度恐慌(全改 C++),要么完全不在意(最后救不回来)。

一句话定位:蓝图的开销主要是"每节点调用开销 + 无法内联",不是"语言本身很慢"。所以"节点数 × 调用频率"才是成本公式。

2. 开销来源

来源说明
虚拟机解释/调用开销每个节点一次
无法内联小函数在 C++ 里会被内联,蓝图不会
反射调用蓝图调 C++ 走反射(见 蓝图与 C++ 互调)
Tick蓝图 Tick 每帧跑整张图
Cast / 查找GetAllActorsOfClass 这类很贵
大量字符串/容器操作与 C++ 同理但更慢

成本 ≈ 节点数 × 调用频率。因此:

  • 每帧跑的图 → 节点数要少,或下沉 C++
  • 事件驱动的图 → 节点多一点无所谓

3. 优化手段

手段说明
减少 Tick改用事件/定时器/委托(见 Actor 生命周期)
缓存引用不要每帧 Cast 或 GetAllActorsOfClass
热路径下沉 C++每帧跑的、成规模的
拆分大图但拆太碎也会增加调用开销
用 Timer 代替每帧检查降低频率
数据结构用 C++大量容器运算
避免蓝图里的深递归—

最常见的一条:蓝图里每帧 GetAllActorsOfClass 或 Cast —— 应改为启动时缓存引用。

4. 常见误解

误解事实
"蓝图一定很慢"事件驱动的低频蓝图开销可忽略
"全改 C++ 就好"迭代成本上升,且不一定解决真正的瓶颈
"节点越少越好"拆太碎也会增加调用开销,要平衡
"蓝图编译后就和 C++ 一样快"不会被内联,仍有调用开销

5. 代价与权衡

设计收益代价什么时候不该用
蓝图 Tick简单直观每帧成本能事件驱动就不要 Tick
每帧 Cast—明显浪费必须缓存
热路径下沉 C++性能迭代变慢稳定的热路径才值得
拆分成小函数可复用调用开销增加热路径不要过度拆
缓存引用大幅省要管理生命周期(用弱引用)—

6. 踩坑与排查

坑现象怎么验证
蓝图 Tick 做重活Game 线程高stat game;改用事件驱动
每帧 Cast / 查找慢缓存引用
蓝图里大容器运算慢下沉 C++
大量蓝图同时 Tick帧率掉减少 Tick;按 Significance 降频
以为改 C++ 就能解决瓶颈不在蓝图先 stat unit 定位
缓存了裸指针对象销毁后崩溃用弱引用(见 GC)

7. 排查顺序

1. stat unit → Game 高才可能是蓝图问题
2. 找每帧跑的蓝图(Tick / 定时器)
3. 检查其中的 Cast 与查找 → 缓存
4. 节点规模大 → 下沉 C++
5. 大量实例 → 降频或 Significance

参考