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

相关推荐
雪度娃娃7 小时前
结构型设计模式——桥接模式
c++·设计模式·桥接模式
翎沣7 小时前
C++11异常处理机制
java·c++·算法
云深麋鹿7 小时前
C++ | AVLTree
开发语言·c++
Qt程序员7 小时前
从协议到实战:HTTP 反向代理
linux·c++·websocket·nginx·http·反向代理·正向代理
Hua-Jay7 小时前
OpenCV联合C++/Qt 学习笔记(十六)----图像细化、轮廓检测、轮廓信息统计及轮廓外接多边形
c++·笔记·qt·opencv·学习·计算机视觉
无限进步_7 小时前
【C++】深入底层:自己动手实现一个哈希表
开发语言·数据结构·c++·算法·链表·散列表·visual studio
paeamecium8 小时前
【PAT甲级真题】- General Palindromic Number(20)
数据结构·c++·算法·pat考试·pat
minji...8 小时前
Linux 网络基础之UDP协议(四)传输层协议 UDP,再谈端口号,UDP 特点
linux·服务器·开发语言·网络·c++·tcp/ip·udp
艾莉丝努力练剑8 小时前
【Linux网络】Linux 网络编程:应用层自定义协议与序列化(1)初识
linux·运维·服务器·网络·c++·udp·tcp
南境十里·墨染春水8 小时前
C++ 日志 4—— 多线程安全与异步日志优化
数据库·c++·安全