
观众老爷们大家好 我是邪修KING 欢迎来到我的TA->UE游戏引擎博客---入门篇! C++!高门槛!精选学习! 现在我们已经会用 C++ 写 UE 逻辑了,优化是区分 "新手" 和 "准工程师" 的关键一步 ,也是游戏运行流畅度的核心。
接下来我会描述一套最实用、最容易落地、不搞玄学的 C++ 优化方法,全部能直接用在你的立方体项目里,而且完全贴合我们现在的知识水平(C++ 基础 + UE 入门)。
一、先记住一句话
UE C++ 性能优化 = 少计算、少内存、少遍历、少阻塞
不需要你懂底层汇编,只需要改代码习惯 + 用对 UE 机制。
二、最核心、最有效、立刻能用的 7 大优化
(全部是你现在就能用在项目里的)
1. 绝对不要在 Tick () 里做任何多余计算
Tick 每帧执行,是性能杀手第一名!
首先来看很多初学者都会出现的坏代码(每帧都算、都找、都查)
cpp
void Tick(float DeltaTime)
{
// 每帧找玩家 → 巨卡
AMyPlayer* Player = GetPlayer();
// 每帧计算距离 → 浪费
float Dis = FVector::Dist(GetActorLocation(), Player->GetActorLocation());
}
好代码!
cpp
// 只在 BeginPlay 获取一次
void BeginPlay()
{
Super::BeginPlay();
Player = GetPlayer();
}
void Tick(float DeltaTime)
{
// 只做必须每帧做的事
if (Player)
{
// 简单计算
}
}
你的项目能立刻优化:
1.移动、旋转只在 Tick 里做
2.找对象、获取组件、获取引用全部放到 BeginPlay
2. 用 const & 传递参数,不要传值
这是 C++ 基础,但对游戏性能提升巨大。
坏代码(复制整个结构体,慢)
cpp
void TakeDamage(float Damage, FVector HitLocation)
好代码(引用传递,0 复制)
cpp
void TakeDamage(float Damage, const FVector& HitLocation)
规则:
1.FVector / FRotator / FString / UObject* 全部用 const &
2.只有 int/bool/float 可以直接传
3. 少用 GetAllActorsOfClass ()
这个函数全场景遍历所有物体 ,场景越大越卡。
注意!千万别在 Tick 里用
cpp
UGameplayStatics::GetAllActorsOfClass(...); // 巨卡
替代方案
1.用 委托 / 事件分发器
2.用 TArray 缓存管理对象
3.用 Actor 标记 + 组件查询
4. 智能使用 TArray,不要频繁增删
游戏里大量用 TArray,频繁删除插入 = 性能爆炸
优化技巧
1.能用 Add() 不用 Insert()
2.能预分配内存就预分配
cpp
MyArray.Reserve(100); // 提前开 100 个空间
不立即删除,用 标记删除,最后统一清理
cpp
if (!Actor->IsPendingKill())
5. 关闭不需要的 Tick
很多 Actor 根本不需要每帧更新!
关闭方法
cpp
PrimaryActorTick.bCanEverTick = false;
我们的项目里:门,障碍物,材质,触发器等90%都可以关Tick
6. 少创建、少销毁对象
UE 创建 UObject / Actor 非常耗性能。
坏代码:
cpp
Tick()
{
// 每帧创建 → 卡死
UUserWidget* W = CreateWidget(...);
}
好代码:
cpp
// 创建一次缓存起来
void BeginPlay()
{
MyWidget = CreateWidget(...);
}
7. 物理、碰撞优化
你现在项目里有大量碰撞:
优化方法:
1.简单碰撞 → 用 盒碰撞、球碰撞 ,不要用复杂网格碰撞
2.触发器只和指定通道检测
3.不需要物理的物体,把 Simulate Physics 关掉
三、代码质量优化(重点!!!)
1. 把变量设为私有,用函数访问
cpp
private:
float CurrentHealth;
public:
float GetHealth() const { return CurrentHealth; }
好处:安全,便于调试,便于后续加逻辑
2. 函数加 const
不修改对象的函数一定要加 const
cpp
float GetHealth() const
3. 不要写超长函数
一个函数只做一件事,超过 20 行就拆分。
四、内存优化(游戏必学)
1. 不用的指针及时清空
cpp
Player = nullptr;
2. 不要持有不用的 UObject 引用
会导致 UE GC 无法回收,内存越来越大。
3. 优先用栈变量,少用堆
cpp
// 快
FVector Loc = GetActorLocation();
// 慢(除非必要)
FVector* Loc = new FVector();
五、UE 专属最强优化:组件化
我们现在的项目可以直接升级成 UE 标准工程架构
把功能拆成组件:
1.移动组件
2.血量组件
3.碰撞组件
4.UI 交互组件
好处:代码解耦,可以关闭不需要的组件,性能大幅提升
六、我们现在的项目能优化哪里?
我们的立方体游戏:
1.玩家 Tick 只保留移动旋转
2.障碍物、门、触发器全部关闭 Tick
3.所有函数参数加 &
4.BeginPlay 获取所有引用
5.关闭不必要的物理模拟
6.碰撞体全部使用简单碰撞
7.UI 只创建一次,不重复创建