在这里插入图片描述

观众老爷们大家好 我是邪修KING
欢迎来到我的TA->UE游戏引擎博客—入门篇!
C++!高门槛!精选学习!

现在我们已经会用 C++ 写 UE 逻辑了,优化是区分 “新手” 和 “准工程师” 的关键一步,也是游戏运行流畅度的核心。
接下来我会描述一套最实用、最容易落地、不搞玄学的 C++ 优化方法,全部能直接用在你的立方体项目里,而且完全贴合我们现在的知识水平(C++ 基础 + UE 入门)。

一、先记住一句话

UE C++ 性能优化 = 少计算、少内存、少遍历、少阻塞
不需要你懂底层汇编,只需要改代码习惯 + 用对 UE 机制

二、最核心、最有效、立刻能用的 7 大优化

(全部是你现在就能用在项目里的)

1. 绝对不要在 Tick () 里做任何多余计算

Tick 每帧执行,是性能杀手第一名!
首先来看很多初学者都会出现的坏代码(每帧都算、都找、都查)

void Tick(float DeltaTime)
{
    // 每帧找玩家 → 巨卡
    AMyPlayer* Player = GetPlayer();
    
    // 每帧计算距离 → 浪费
    float Dis = FVector::Dist(GetActorLocation(), Player->GetActorLocation());
}

好代码!

// 只在 BeginPlay 获取一次
void BeginPlay()
{
    Super::BeginPlay();
    Player = GetPlayer();
}

void Tick(float DeltaTime)
{
    // 只做必须每帧做的事
    if (Player)
    {
        // 简单计算
    }
}

你的项目能立刻优化:
1.移动、旋转只在 Tick 里做
2.找对象、获取组件、获取引用全部放到 BeginPlay

2. 用 const & 传递参数,不要传值

这是 C++ 基础,但对游戏性能提升巨大。
坏代码(复制整个结构体,慢)

void TakeDamage(float Damage, FVector HitLocation)

好代码(引用传递,0 复制)

void TakeDamage(float Damage, const FVector& HitLocation)

规则:
1.FVector / FRotator / FString / UObject* 全部用 const &
2.只有 int/bool/float 可以直接传

3. 少用 GetAllActorsOfClass ()

这个函数全场景遍历所有物体,场景越大越卡。
注意!千万别在 Tick 里用

UGameplayStatics::GetAllActorsOfClass(...); // 巨卡

替代方案
1.用 委托 / 事件分发器
2.用 TArray 缓存管理对象
3.用 Actor 标记 + 组件查询

4. 智能使用 TArray,不要频繁增删

游戏里大量用 TArray,频繁删除插入 = 性能爆炸
优化技巧
1.能用 Add() 不用 Insert()
2.能预分配内存就预分配

MyArray.Reserve(100); // 提前开 100 个空间

不立即删除,用 标记删除,最后统一清理

if (!Actor->IsPendingKill())

5. 关闭不需要的 Tick

很多 Actor 根本不需要每帧更新!
关闭方法

PrimaryActorTick.bCanEverTick = false;

我们的项目里:门,障碍物,材质,触发器等90%都可以关Tick

6. 少创建、少销毁对象

UE 创建 UObject / Actor 非常耗性能。
坏代码:

Tick()
{
    // 每帧创建 → 卡死
    UUserWidget* W = CreateWidget(...);
}

好代码:

// 创建一次缓存起来
void BeginPlay()
{
    MyWidget = CreateWidget(...);
}

7. 物理、碰撞优化

你现在项目里有大量碰撞:
优化方法:
1.简单碰撞 → 用 盒碰撞、球碰撞,不要用复杂网格碰撞
2.触发器只和指定通道检测
3.不需要物理的物体,把 Simulate Physics 关掉

三、代码质量优化(重点!!!)

1. 把变量设为私有,用函数访问

private:
    float CurrentHealth;

public:
    float GetHealth() const { return CurrentHealth; }

好处:安全,便于调试,便于后续加逻辑

2. 函数加 const

不修改对象的函数一定要加 const

float GetHealth() const

3. 不要写超长函数

一个函数只做一件事,超过 20 行就拆分。

四、内存优化(游戏必学)

1. 不用的指针及时清空

Player = nullptr;

2. 不要持有不用的 UObject 引用

会导致 UE GC 无法回收,内存越来越大。

3. 优先用栈变量,少用堆

// 快
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 只创建一次,不重复创建

更多推荐