UE5 C++ 游戏性能优化:大一也能学会的实战级优化指南


观众老爷们大家好 我是邪修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 只创建一次,不重复创建

相关推荐
Aloys_Code6 小时前
逆向一个被遗忘的DVD游戏格式:从DES加密到Rust模拟器
游戏·模拟器·retroarch·复古游戏·native32·sunplus·赤刃·钢铁风暴
金銀銅鐵10 小时前
用 Python 实现 Take-Away 游戏
python·游戏
金銀銅鐵1 天前
用 Pygame 实现 15 puzzle
python·数学·游戏
clint4562 天前
C++进阶(1)——前景提要
c++
夜悊2 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴2 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0013 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾3 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you3 天前
constexpr函数
c++
凡人叶枫3 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++