BlueRoseNote/03-UnrealEngine/Gameplay/Code/[FestEurope2019] 蓝图深入探讨Blueprints In-depth——学习笔记.md
2023-06-29 11:55:02 +08:00

6.2 KiB
Raw Permalink Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
打包项目的Debug方法 2020-07-07 13:49:28

蓝图深入探讨Blueprints In-depth学习笔记

就如大钊所说的,这个视频不管程序还是美术都值得学习一下。

蓝图开销

蓝图主要开销影响:

  1. 蓝图的节点数是一个较为影响性能的因素而不是节点所执行的逻辑影响。所以在蓝图中执行循环操作会非常影响性能执行节点本身的逻辑本质上还是c++
  2. 执行遍历ActorGet All Actor Of Class也比较消耗资源。避免总是在蓝图中使用可以提前把对象的引用保存下来。
  3. tick

90%的蓝图是不需要开启tick的你可以在项目设置中关闭Can Blueprint Tick By Default。定时器与事件几乎可以解决所有问题。

检测蓝图tick中性能消耗最大的因素将这个因素放入计时器中。但是视觉效果的更新就不适合了所以这部分可能还是使用c++比较好。(例如海洋系统)

使用材质来实现一些简单动画可以节约CPU资源效率会高一些。尽量将一些效果写进材质中这样可以简化蓝图提高效率。

蓝图debuger与可视化日志

蓝图debug(可以获取断点中的变量数据) 你需要在需要监视的节点变量每个节点上的引脚上右键选择监视这个变量之后就可以在断点触发后在蓝图debuger中查看变量数据。

可视化日志你需要在关卡开始时运行Enable Vislog Recording,之后就可以通过使用可视化日志指令Vislog Text、Vislog Box Shape、Vislog Location、Vislog Segment。 之后再启动游戏,可视化日志就会自动记录。

作者建议使用这个东西来记录AI运行情况。

查看所有使用tick的actor

console中输入dumpticks指令。

内存与Asset载入

不要在蓝图进行多重蓝图或者引用巨量资源防止引擎在加载该蓝图时加载太多的Asset。

这里作者给出的建议是:

  1. 使用C++定义关键逻辑的基类。
  2. 创建一个继承该基类的蓝图类作为蓝图父类。
  3. 创建另一个蓝图类继承上一个蓝图父类。相关的Asset会在这个层级的蓝图子类中引用

PS.这样的架构还有一个好处那就是你可以随时将蓝图中的逻辑移植到c++。

如果你调用了蓝图函数库中任意一个函数那么整合蓝图库都会被加载如果蓝图库还引用了其他资源那么很可能整个游戏资源都被加载。所以一个正确的方法就是不要创建用于专门加载某一Asset函数来加载函数而是使用通用函数配合变量的方式来进行指定资源的加载。

PS.使用GameMode来区分菜单操作逻辑与游戏操作逻辑一个好处就是不用来回引用。GameMode_Game与GameMode_Menu

对于资源强引用,可以使用异步加载。此时资源引用器就会将其显示为粉色,意为弱引用。

你可以在设置将bRecompileOnLoad设置为false蓝图、关卡蓝图、动画蓝图以提高打开编辑器的速度。

当然有资源加载就有资源回收当物体量多时回收资源会出现卡顿此时你可以在项目设置中修改资源回收时间Time Between puring Pending Kill Objects这对于制作电影项目非游戏项目会比较好。对于巨量物体你可以在蓝图中勾选群集功能Can Be in Cluster当然最好的方法还是使用c++。

蓝图编译时间

  1. 蓝图中的蓝图节点数
  2. 蓝图中的类型转换以及其他类型引用
  3. 循环引用

如果类型转换的对象有这复杂的循环引用(比如各个蓝图类互相引用各自的函数),那么一个类型转换将会载入所有与之关联的蓝图类。这可以说是相当恐怖的。

想要加快速度可以使用:

  1. 将逻辑封装到蓝图函数中,可以减少编译时间。
  2. 将逻辑按照功能进行分类再使用蓝图或者c++将其分离成各种Actor、子Actor、Component。
  3. 对于类型转换需要进行合理的管理。比如将带有转换的逻辑使用c++封装成函数、使用蓝图接口、GameplayTag等

蓝图接口

使用流程:

  1. 创建蓝图接口Asset并设置接口参数。
  2. 在需要编写逻辑的蓝图中绑定接口,并且实现接口逻辑。
  3. 在需要调用的蓝图中调用这个接口就行了。

使用蓝图接口的好处就在于你不需要将对象进行类型转换。你可以使用Dose Implement Interface节点来判断是否实现某个蓝图接口。

使用GameplayTag的意义

使用标签可以直接对标签进行判断,避免对象类型转化。

比如给Actor物体绑定一个CanPickup标签在之后直接判断出来。

Show 3D Widget

蓝图中一些变量可以开启Show 3D Widget方便调节数值。

自动测试框架

使用蓝图进行测试

在蓝图使用自动测试框架其测试用的蓝图类需要继承Functional Test类。

Prepare Test事件用于在测试前生成所需要的Actor与数据。 Start Test事件开始进行测试。

使用c++进行测试

c++自动测试的视频我就找到了:https://www.bilibili.com/video/av79617236 以下是学习该视频的笔记:

想要编写自己的测试类可以继承FAutomationTestBase类并重写RunTest函数之后系统会自动向自动测试框架注册。使用IMPLEMENT_SIMPLE_AUTOMATION_TEST宏标记为简单测试类型。以下是一段案例代码 image

使用IMPLEMENT_COMPLEX_AUTOMATION_TEST宏标记为复杂测试类型。以下是一段案例代码 image 看得出可以通过这个方法添加子测试。

启动自动调试: 可以使用Ue4的Session Frontend也可以使用TeamCity作者的团队也编写了一个测试工具进行工作。

地图测试

11:30处作者展示一个小案例。大致步骤为使用GetTest遍历地图文件夹下所有level。之后分别对各个level进行相关测试。比如模拟玩家操作等。

项目经验

2300左右作者开始介绍项目经验这个流程较为复杂推荐大团队使用这个直接去看视频吧。