【UE4C++-ActionRougelike-28】封装、性能、打磨


【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 game:显示游戏相关的统计信息。

    • stat unit 或 stat unitgraph:显示CPU和GPU性能的时间分布图。

    • stat slate:显示与Slate UI框架相关的统计信息。

    • stat UObject:显示与UObject系统相关的统计信息。

1.1 Stat命令
stat commands界面
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);
    //...
}

自定义stat命令

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);
}

文章作者: Woilin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Woilin !
评论
  目录