Blueprints In-depth - Part 1

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在讀取時間有很大的差別


留言

這個網誌中的熱門文章

UE4 除錯技巧分享 (一)

UE4 GameplayAbilitySystem - GameplayEffect & GameplayCue 如何設定參數

UE4 GameplayAbilityTask介紹