(轉載)Actor 生命周期
Actor 生命周期
本頁面的內容:- 生命周期詳解
- 從磁盤加載
- Play in Editor
- 生成
- 延遲生成
- 生命走向終點
- 在遊戲進程中
- 垃圾回收
- 高級垃圾回收
此文檔是 Actor 生命周期的高級概述:Actor 如何被實例化(生成)到關卡中,以及如何被移除(銷毀)。
以下流程圖展示了 Actor 被實例的三種主要路徑。無論 Actor 的創建方式如何,銷毀路徑均相同。
生命周期詳解
從磁盤加載
已位於關卡中的 Actor 使用此路徑,如 LoadMap 發生時、或 AddToWorld(從流關卡或子關卡)被調用時。
-
包/關卡中的 Actor 從磁盤中進行加載。
-
PostLoad - 在序列化 Actor 從磁盤加載完成後被調用。在此處可執行自定義版本化和修復操作。PostLoad 與 PostActorCreated 互斥。
-
InitializeActorsForPlay
-
為未初始化的 Actor 執行 RouteActorInitialize(包含無縫行程攜帶)
-
PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用
-
InitializeComponent - Actor 上定義的每個組件的創建輔助函數。
-
PostInitializeComponents
-
-
BeginPlay - 關卡開始後調用
Play in Editor
Play in Editor 路徑與 Load from Disk 十分相似,然而 Actor 卻並非從磁盤中加載,而是從編輯器中復制而來。
-
編輯器中的 Actor 被復制到新世界場景中
-
PostDuplicate 被調用
-
InitializeActorsForPlay
-
為未初始化的 Actor 執行 RouteActorInitialize(包含無縫行程攜帶)
-
PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用
-
InitializeComponent - Actor 上定義的每個組件的創建輔助函數。
-
PostInitializeComponents - Actor 的組件初始化後調用
-
-
BeginPlay - 關卡開始後調用
生成
這是生成(實例)Actor 時的路徑。
-
SpawnActor 被調用
-
PostSpawnInitialize
-
PostActorCreated - 創建後即被生成的 Actor 調用,構建函數類行為在此發生。PostActorCreated 與 PostLoad 互斥。
-
ExecuteConstruction:
-
OnConstruction - Actor 的構建。藍圖 Actor 的組件在此處創建,藍圖變量在此處初始化
-
-
PostActorConstruction:
-
PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用
-
InitializeComponent - Actor 上定義的每個組件的創建輔助函數。
-
PostInitializeComponents - Actor 的組件初始化後調用
-
-
OnActorSpawned 在 UWorld 上播放
-
BeginPlay 被調用。
延遲生成
將任意屬性設為“Expose on Spawn”即可延遲 Actor 的生成。
-
SpawnActorDeferred - 生成程序化 Actor,在藍圖構建腳本之前進行額外設置
-
SpawnActor 中的所有操作發生;PostActorCreated 之後發生以下操作:
-
通過一個有效但不完整的 Actor 實例設置/調用多個“初始化函數”
-
FinishSpawningActor -調用後對 Actor 進行最終化,在 Spawn Actor 行中選取 ExecuteConstruction。
-
生命走向終點
銷毀 Actor 的方式有許多種,但終結其存在的方式始終如一。
在遊戲進程中
它們完全為任選,因為許多 Actor 在遊戲進程中不會實際消亡。
Destroy - 遊戲在 Actor 需要被移除時手動調用,但遊戲進程仍在繼續。Actor 被標記為等待銷毀並從關卡的 Actor 陣列中移除。
EndPlay - 在數個地方調用,保證 Actor 的生命走向終點。在遊戲過程中,如包含流關卡的 Actor 被卸載,Destroy 將發射此項和關卡過渡。調用 EndPlay 的全部情形:
-
對 Destroy 顯式調用
-
Play in Editor 終結
-
關卡過渡(無縫行程或加載地圖) 包含 Actor 的流關卡被卸載
-
Actor 的生命期已過
-
應用程序關閉(全部 Actor 被銷毀)
無論這些情形出現的方式如何,Actor 都將被標記為 RF_PendingKill,因此在下個垃圾回收周期中它將被解除分配。此外,可以考慮使用更整潔的 FWeakObjectPtr 代替手動檢查“等待銷毀”。
OnDestroy - 這是對 Destroy 的舊有反應。也許應該將這裏的所有內容移到 EndPlay,因為它被關卡過渡和其他遊戲清理函數調用。
垃圾回收
一個對象被標記待銷毀的一段時間後,垃圾回收會將其從內存中實際移除,釋放其使用的資源。
在對象的銷毀過程中,以下函數將被調用:
-
BeginDestroy - 對象可利用此機會釋放內存並處理其他多線程資源(即為圖像線程代理對象)。與銷毀相關的大多數遊戲性功能理應在
EndPlay
中 更早地被處理。 -
IsReadyForFinishDestroy - 垃圾回收過程將調用此函數,以確定對象是否可被永久解除分配。返回
false
,此函數即可延遲對象的實際銷毀,直到下一個垃圾回收過程。 -
FinishDestroy - 最後對象將被銷毀,這是釋放內部數據結構的另一個機會。這是內存釋放前的最後一次調用。
高級垃圾回收
虛幻引擎 4 中的垃圾回收過程將構建共同被銷毀對象的集群。較之於單個刪除對象,集群可減少垃圾回收相關的總體時間和整體內存流失。可能隨對象的加載創建子對象。將對象與其子對象組合到垃圾回收器的單個集群後,引擎可延遲釋放集群使用的資源,直到整個對象可被釋放時一次性釋放全部資源。
多數項目中無需對垃圾回收進行配置或修改,但存在一些特定情況 - 可以如下方式對垃圾回收器的“集群”行為進行調整,以提高效率:
-
Clustering - 關閉集群。在 Project Settings 中的 Garbage Collection 部分下,可將 Create Garbage Collector UObject Clusters 選項設為 false。對多數項目而言,此操作將導致垃圾回收效率降低,因此只建議在性能測試證明其絕對有益的情況下使用。
-
Cluster Merging - 如集群設為 true,Merge GC Clusters 選項(在 Project Settings 中的 Garbage Collection 部分下)可被設為 true,以便啟動集群合並。此行為默認關閉,並不適合所有項目。在一個對象集群的構建過程中,對象將被檢查,在其中可能找到對其他對象的引用。關閉集群合並的情況下(默認行為),那些引用將被記錄;但被加載的對象和其子對象仍位於其原始集群中。開啟集群合並的情況下,被加載對象和被引用對象的集群將被組合。例如,一個粒子系統資源可能引用一個材質資源;但如果集群合並被關閉,材質和粒子系統將因垃圾回收的原因而處在各自的集群中。開啟集群合並後,因粒子系統引用材質,粒子資源集群將和材質集群進行合並。此行為通常不用於流動內容的遊戲(如開放世界遊戲),因為可能合並許多集群,形成更大、更多樣化的對象群組。集群中的對象不會被單獨銷毀,將等待群組中的所有對象均被設為待銷毀。而其中一小部分對象可能一直處於使用狀態,因此內存中可能出現較大的對象集群。在特殊情況下(如大量引用對象未被其他對象共享的資源)可啟用集群合並,並在代碼中手動添加集群,可統一子對象的清理、減少垃圾回收器在遊戲中必須進行的輸入和依賴關系維持檢查次數,進而提高性能。
原文地址:https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Actors/ActorLifecycle/index.html
(轉載)Actor 生命周期