【UE4C++-ActionRougelike-28】封装、性能、打磨
一、打包
1、指定地图列表
指定在打包构建时要包含的地图列表,在Project Setting->Packaging中设置要包含的地图列表。
2、打包
3、运行游戏
二、优化
何时进行优化?
尽可能早的优化,避免堵塞工作流程
优化太早:
- 代码的可读性/灵活性降低
- 优化之后仍会多次修改功能
- 在可能废弃的内容或永远不会影响性能瓶颈的功能上花费时间
优化太晚:
- 由于加载时间长、编译时间长和帧率低降低了项目的迭代速度
- 直到流程后期才知道工作流问题
简单的优化方法
1、避免对Actors/Components进行频繁的Tick操作
- 大部分逻辑可以通过事件或较低的频率使用定时器Timer来处理
2、碰撞设置
- 当不需要碰撞时,设置bGenerateOverlapEvents为false
- 对于碰撞配置文件,只针对必要的通道作出反应,在小型/无法到达的对象上完全禁用碰撞
- 除非要进行物理模拟,否则
Collision Enable
设置为Query Only
3、尽量避免对其他内容的强引用
C++和蓝图的性能比较
1、蓝图不仅仅用于原型设计
2、将耗时的函数转移到C++中
- 例如,大型循环、数学密集操作等(在C++中更容易维护)
3、蓝图本地化
- 会增加打包大小,并且可能存在错误。对于复杂的操作,手动编写C++代码通常更好
1、Stat Commands
stat命令是一组用于性能分析和统计的命令,可以通过控制台在游戏进行中使用。以下是一些常见的stat命令及其说明:
stat命令用于显示标记代码段的CPU开销。
- 使用方法:stat
- 使用方法:stat
可以添加自定义的stat命令,以便监视代码的特定部分。
stat命令示例:
stat game:显示游戏相关的统计信息。
stat unit 或 stat unitgraph:显示CPU和GPU性能的时间分布图。
stat slate:显示与Slate UI框架相关的统计信息。
stat UObject:显示与UObject系统相关的统计信息。
1.1 Stat命令
1.2 自定义Stat命令
// ActionRougelike.h
// 使用DECLARE_STATS_GROUP宏声明了一个名为"STANFORD_Game"的统计组。
// 这个统计组用于将相关的性能统计信息进行分组,并在性能分析中进行组织和显示
// 参数如下:
// TEXT("STANFORD_Game"):指定统计组的名称,用TEXT宏将字符串转换为FText类型。
// STATGROUP_STANFORD:指定统计组的名称标识符,用于在代码中引用该统计组。
// STATCAT_Advanced:指定统计组的分类,用于在性能分析工具中进行分类显示。
DECLARE_STATS_GROUP(TEXT("STANFORD_Game"), STATGROUP_STANFORD, STATCAT_Advanced);
// MyActionComponent.cpp
// 声明名为"StartActionByName"的循环统计,用于跟踪"StartActionByName"函数的性能
DECLARE_CYCLE_STAT(TEXT("StartActionByName"), STAT_StartActionByName, STATGROUP_STANFORD);
bool UMyActionComponent::StartActionByName(AActor* Instigator, FName ActionName)
{
// 创建一个循环计数器,用于在作用域内跟踪代码执行的性能
SCOPE_CYCLE_COUNTER(STAT_StartActionByName);
//...
}
2、Unreal Insights
Unreal Insights是虚幻引擎提供的一款强大的性能分析工具,用于帮助开发者深入分析和优化游戏的性能表现。它提供了可视化的界面和丰富的性能数据,让开发者能够更好地理解游戏的运行状况并进行针对性的优化。以下是Unreal Insights主要关注的几个方面:
- CPU性能:Unreal Insights提供了CPU性能分析功能,可以帮助您找到游戏中的瓶颈和性能瓶颈。它提供了时间轴视图和函数调用图,帮助您识别高耗时函数和代码路径。
- 网络性能:Unreal Insights还提供了网络性能分析工具,可帮助您识别和调试与网络通信相关的问题。您可以查看网络事件、带宽使用情况、延迟等指标,以便优化网络性能。
- 内存:Unreal Insights提供了内存分析工具,用于识别内存使用情况、泄漏和内存相关的问题。您可以查看对象和资源的内存使用情况,以及内存分配和释放的模式。
- 加载时间:Unreal Insights还提供了加载时间分析功能,用于识别加载时间长的资源和过程。您可以查看资源加载时间、关卡加载时间和加载过程中的性能瓶颈。
三、修复日志警告和错误
1、除0问题
在几个除0的蓝图中,先判断值是否为0来决定是否向后执行逻辑
2、EndPlay
将Effect_Burning的Duration设置为0后,AI死亡后会报错提示:
Blueprint Runtime Error: "Attempted to access ActionComp via property CallFunc_GetOwningComponent_ReturnValue, but ActionComp is pending kill". Blueprint: Effect_Burning Function: Execute Ubergraph Effect Burning Graph: EventGraph Node: Apply Damage
原因是:尝试访问一个已经处于”pending kill”状态的对象的问题。这个问题发生在一个名为”Effect_Burning”的函数的”EventGraph”中的”Apply Damage”节点上。
因为AI已经死亡,组件销毁后,却没有停止Action。在MyActionComponent中添加EndPlay方法。使得组件销毁时,停止所有Action
// 组件被销毁时,停止所有正在运行的动作
void UMyActionComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
// Stop all
TArray<UMyAction*> ActionsCopy = Actions;
for (UMyAction* Action : ActionsCopy)
{
if (Action && Action->IsRunning())
{
Action->StopAction(GetOwner());
}
}
Super::EndPlay(EndPlayReason);
}