网页版
https://yekdniwunrealengine.blogspot.com/2019/06/blueprints-in-depth-part-1.html
Unreal 官方公布了两个有关blueprint的深度介绍的影片
Blueprints In-depth - Part 1 | Unreal Fest Europe 2019 | Unreal Engine
https://www.youtube.com/watch?v=j6mskTgL7kU
Blueprints In-depth - Part 2 | Unreal Fest Europe 2019 | Unreal Engine
https://www.youtube.com/watch?v=0YMS2wnykbc
投影片
https://epicgames.ent.box.com/s/hdv4bye3dezabp4duq8pttsha8kjjlde
这篇文章算是摘录Part 1的一些重点出来~
Author
作者说他自己是artist designer,不是程式出身,所以内容可能有一些是身为程式本来
就知道的事情
https://youtu.be/j6mskTgL7kU?t=88
Introduction
Blueprint(BP)是Unreal Engine很重要核心的功能
学习BP是很容易,就像画流程图一样。
BP的UI接口其实跟程式的.h以及.cpp是很类似的,所以也容易理解。
使用BP很简单,但是重点在于如何"正确"使用
Feature
https://youtu.be/j6mskTgL7kU?t=409
Feature就是介绍BP跟各种功能/资料类型/类别的关系与说明
The Big picture
基本上写程式想法差不多
如何让BP尽可能的简洁
如果有人要接手我的工作,怎么样才好理解我写的BP
在作BP的时候有没有一并考虑内存以及效能相关的问题
有没有考虑到这个BP未来如果会扩张的情况
https://youtu.be/j6mskTgL7kU?t=752
以一个门作为范例
首先一开始一定都是很简单一个靠近就会开门的BP
之后随着需求增加了好几个门的BP,每个功能都有些微的不同。
然后把有相同的部分往上抽了底层,base BP class BP_EnvironmentObject。
随着复杂度提升,还继续往C++层抽,把复杂的功能放进C++。
但是可能玩家会去开门,所以玩家会跟门有关,开门的时候会跟动作有关,所以玩家的动
画BP也会跟门有关。
为了提示门可以开,所以HUD也来跟门参一脚了
可能有开门相关的奖杯,所以奖杯也来搅和。
枪可能可以把门打穿,所以....
以上就是一个从一个简单的BP到整个复杂专案的情况。
Run Time Performance
接下来谈到执行的效能部分
https://youtu.be/j6mskTgL7kU?t=1088
BP比C++慢,但有的时候效能问题的主因不一定是BP造成的
有很多BP转C++的目的不一定是为了改善效能
不过错误的使用BP有可能造成严重的效能问题
BP比C++慢10倍,不过实际上还是要根据不同的情况才能算数。
BP效能不好的几个原因
https://youtu.be/j6mskTgL7kU?t=1133
1. 太多的节点互相连接
2. 数学运算或是复杂的逻辑运算作在BP是昂贵的。
3. 在BP使用循环是昂贵的
4. 在BP巡访大量的actors/classes是昂贵的
5. 在BP处理Tick的行为是昂贵的,也是BP造成效能不好的主因之一
BP的效能根据不同的执行方式:
编辑器执行(Play In Editor)、Development、Shipping
是有很大的差异的
https://youtu.be/j6mskTgL7kU?t=1303
Tick
https://youtu.be/j6mskTgL7kU?t=1412
造成BP效能问题的主因之一就是Tick
这里的Tick指的是广泛的Tick,例如BP里面的Tick,AnimBP的UpdateAnimation,UMG里面
的binding
大部分的情况你不需要使用Tick,甚至于可以关掉Tick。
例如使用Timer,使用事件控制,或是只在某些条件成立的时候才执行Tick,或是距离近/
玩家面向此Actor的时候才Tick等等
有些时候也可以透过material来处理BP要做的事情,
Profiling and Debugging
https://youtu.be/j6mskTgL7kU?t=1869
BP的除错接口很方便,从图中就可以知道现在正在执行那些节点,也可以透过Filter功能
只看某一个想关注的actor
透过watch接口也可以即时的看到变量值
Visual Logger
https://youtu.be/j6mskTgL7kU?t=1963
Visual Logger功能也是很好的除错对象,在BP内也可以使用,不管是写一串文字,画一
个sphere,capsule,一个区段等等。
在Editor可以直接叫起Visual Logger并且录制除错资讯。
Console Command
https://youtu.be/j6mskTgL7kU?t=2113
console command stat game可以快速地看到BP的效能资讯
console command dumpticks可以把当下所有有tick的actor资讯写进outputlog内,可以
仔细的观察有多少actor在tick。
Others
https://youtu.be/j6mskTgL7kU?t=2168
UE4内建的profiller还是最详细的工具,里面可以列出哪个Actor的哪个函式占用多少CPU
时间。
BP也可以实作自动化测试,只要继承FunctionalTest这个class并实作对应的函式,以及
计算结果的正确与否
Memory and Loading
https://youtu.be/j6mskTgL7kU?t=2362
BP对内存与程式读取时间的影响是很大的
BP与C++的读取的行为从本质上就有很大的差别
BP是被视为content,Asset
C++ class则是在程式/游戏启动的时候就已经加载到内存了,BP则是有需要用到的时候
才会触发读取。
https://youtu.be/j6mskTgL7kU?t=2429
BP什么时候会被触发读取可以使用Editor内的Reference Viewer来查看。
由左往右连接的意思代表读取左边的Asset也会一并读取右边的Asset。
BP内的Cast也会建立相依(Reference)
Editor内的SizeMap也可以看出这个BP的大小是因为哪些相关连的Assets组成的
避免一个BP reference到许多其他的BP/Asset。
https://youtu.be/j6mskTgL7kU?t=2736
有需要可以透过增加一层C++ 的base class来回避BP 彼此reference的问题。
BP的Function Libraries使用要很小心,如果libraries连结到很多不同的class,就会造
成灾难。
使用Soft reference可以让BP真的有需要这个asset的时候才作读取。
Editor与packaged project在读取时间有很大的差别