尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

UE5 C++ 游戏性能优化:大一也能学会的实战级优化指南 观众老爷们大家好 我是邪修KING欢迎来到我的TA-UE游戏引擎博客—入门篇C高门槛精选学习现在我们已经会用 C 写 UE 逻辑了优化是区分 “新手” 和 “准工程师” 的关键一步也是游戏运行流畅度的核心。接下来我会描述一套最实用、最容易落地、不搞玄学的 C 优化方法全部能直接用在你的立方体项目里而且完全贴合我们现在的知识水平C 基础 UE 入门。一、先记住一句话UE C 性能优化 少计算、少内存、少遍历、少阻塞不需要你懂底层汇编只需要改代码习惯 用对 UE 机制。二、最核心、最有效、立刻能用的 7 大优化全部是你现在就能用在项目里的1. 绝对不要在 Tick () 里做任何多余计算Tick 每帧执行是性能杀手第一名首先来看很多初学者都会出现的坏代码每帧都算、都找、都查voidTick(floatDeltaTime){// 每帧找玩家 → 巨卡AMyPlayer*PlayerGetPlayer();// 每帧计算距离 → 浪费floatDisFVector::Dist(GetActorLocation(),Player-GetActorLocation());}好代码// 只在 BeginPlay 获取一次voidBeginPlay(){Super::BeginPlay();PlayerGetPlayer();}voidTick(floatDeltaTime){// 只做必须每帧做的事if(Player){// 简单计算}}你的项目能立刻优化1.移动、旋转只在 Tick 里做2.找对象、获取组件、获取引用全部放到 BeginPlay2. 用 const 传递参数不要传值这是 C 基础但对游戏性能提升巨大。坏代码复制整个结构体慢voidTakeDamage(floatDamage,FVector HitLocation)好代码引用传递0 复制voidTakeDamage(floatDamage,constFVectorHitLocation)规则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.bCanEverTickfalse;我们的项目里门障碍物材质触发器等90%都可以关Tick6. 少创建、少销毁对象UE 创建 UObject / Actor 非常耗性能。坏代码Tick(){// 每帧创建 → 卡死UUserWidget*WCreateWidget(...);}好代码// 创建一次缓存起来voidBeginPlay(){MyWidgetCreateWidget(...);}7. 物理、碰撞优化你现在项目里有大量碰撞优化方法1.简单碰撞 → 用盒碰撞、球碰撞不要用复杂网格碰撞2.触发器只和指定通道检测3.不需要物理的物体把 Simulate Physics 关掉三、代码质量优化重点1. 把变量设为私有用函数访问private:floatCurrentHealth;public:floatGetHealth()const{returnCurrentHealth;}好处安全便于调试便于后续加逻辑2. 函数加 const不修改对象的函数一定要加 constfloatGetHealth()const3. 不要写超长函数一个函数只做一件事超过 20 行就拆分。四、内存优化游戏必学1. 不用的指针及时清空Playernullptr;2. 不要持有不用的 UObject 引用会导致 UE GC 无法回收内存越来越大。3. 优先用栈变量少用堆// 快FVector LocGetActorLocation();// 慢除非必要FVector*LocnewFVector();五、UE 专属最强优化组件化我们现在的项目可以直接升级成UE 标准工程架构把功能拆成组件1.移动组件2.血量组件3.碰撞组件4.UI 交互组件好处代码解耦可以关闭不需要的组件性能大幅提升六、我们现在的项目能优化哪里我们的立方体游戏1.玩家 Tick 只保留移动旋转2.障碍物、门、触发器全部关闭 Tick3.所有函数参数加 4.BeginPlay 获取所有引用5.关闭不必要的物理模拟6.碰撞体全部使用简单碰撞7.UI 只创建一次不重复创建
返回列表