1. 程式人生 > >(轉載)Actor 生命周期

(轉載)Actor 生命周期

函數 con advance tsp dup kobject 整潔 行程 多個

Actor 生命周期

本頁面的內容:
  • 生命周期詳解
  • 從磁盤加載
  • Play in Editor
  • 生成
  • 延遲生成
  • 生命走向終點
    • 在遊戲進程中
  • 垃圾回收
    • 高級垃圾回收

此文檔是 Actor 生命周期的高級概述:Actor 如何被實例化(生成)到關卡中,以及如何被移除(銷毀)。

以下流程圖展示了 Actor 被實例的三種主要路徑。無論 Actor 的創建方式如何,銷毀路徑均相同。

生命周期詳解

技術分享圖片

從磁盤加載

已位於關卡中的 Actor 使用此路徑,如 LoadMap 發生時、或 AddToWorld(從流關卡或子關卡)被調用時。

  1. 包/關卡中的 Actor 從磁盤中進行加載。

  2. PostLoad - 在序列化 Actor 從磁盤加載完成後被調用。在此處可執行自定義版本化和修復操作。PostLoad 與 PostActorCreated 互斥。

  3. InitializeActorsForPlay

  4. 為未初始化的 Actor 執行 RouteActorInitialize(包含無縫行程攜帶)

    1. PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用

    2. InitializeComponent - Actor 上定義的每個組件的創建輔助函數。

    3. PostInitializeComponents

      - Actor 的組件初始化後調用

  5. BeginPlay - 關卡開始後調用

Play in Editor

Play in Editor 路徑與 Load from Disk 十分相似,然而 Actor 卻並非從磁盤中加載,而是從編輯器中復制而來。

  1. 編輯器中的 Actor 被復制到新世界場景中

  2. PostDuplicate 被調用

  3. InitializeActorsForPlay

  4. 為未初始化的 Actor 執行 RouteActorInitialize(包含無縫行程攜帶)

    1. PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用

    2. InitializeComponent - Actor 上定義的每個組件的創建輔助函數。

    3. PostInitializeComponents - Actor 的組件初始化後調用

  5. BeginPlay - 關卡開始後調用

生成

這是生成(實例)Actor 時的路徑。

  1. SpawnActor 被調用

  2. PostSpawnInitialize

  3. PostActorCreated - 創建後即被生成的 Actor 調用,構建函數類行為在此發生。PostActorCreated 與 PostLoad 互斥。

  4. ExecuteConstruction

    • OnConstruction - Actor 的構建。藍圖 Actor 的組件在此處創建,藍圖變量在此處初始化

  5. PostActorConstruction

    1. PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用

    2. InitializeComponent - Actor 上定義的每個組件的創建輔助函數。

    3. PostInitializeComponents - Actor 的組件初始化後調用

  6. OnActorSpawned 在 UWorld 上播放

  7. BeginPlay 被調用。

延遲生成

將任意屬性設為“Expose on Spawn”即可延遲 Actor 的生成。

  1. SpawnActorDeferred - 生成程序化 Actor,在藍圖構建腳本之前進行額外設置

  2. SpawnActor 中的所有操作發生;PostActorCreated 之後發生以下操作:

    1. 通過一個有效但不完整的 Actor 實例設置/調用多個“初始化函數”

    2. 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,因為它被關卡過渡和其他遊戲清理函數調用。

垃圾回收

一個對象被標記待銷毀的一段時間後,垃圾回收會將其從內存中實際移除,釋放其使用的資源。

在對象的銷毀過程中,以下函數將被調用:

  1. BeginDestroy - 對象可利用此機會釋放內存並處理其他多線程資源(即為圖像線程代理對象)。與銷毀相關的大多數遊戲性功能理應在 EndPlay 中 更早地被處理。

  2. IsReadyForFinishDestroy - 垃圾回收過程將調用此函數,以確定對象是否可被永久解除分配。返回 false,此函數即可延遲對象的實際銷毀,直到下一個垃圾回收過程。

  3. FinishDestroy - 最後對象將被銷毀,這是釋放內部數據結構的另一個機會。這是內存釋放前的最後一次調用。

高級垃圾回收

虛幻引擎 4 中的垃圾回收過程將構建共同被銷毀對象的集群。較之於單個刪除對象,集群可減少垃圾回收相關的總體時間和整體內存流失。可能隨對象的加載創建子對象。將對象與其子對象組合到垃圾回收器的單個集群後,引擎可延遲釋放集群使用的資源,直到整個對象可被釋放時一次性釋放全部資源。

多數項目中無需對垃圾回收進行配置或修改,但存在一些特定情況 - 可以如下方式對垃圾回收器的“集群”行為進行調整,以提高效率:

  1. Clustering - 關閉集群。在 Project Settings 中的 Garbage Collection 部分下,可將 Create Garbage Collector UObject Clusters 選項設為 false。對多數項目而言,此操作將導致垃圾回收效率降低,因此只建議在性能測試證明其絕對有益的情況下使用。

  2. Cluster Merging - 如集群設為 true,Merge GC Clusters 選項(在 Project Settings 中的 Garbage Collection 部分下)可被設為 true,以便啟動集群合並。此行為默認關閉,並不適合所有項目。在一個對象集群的構建過程中,對象將被檢查,在其中可能找到對其他對象的引用。關閉集群合並的情況下(默認行為),那些引用將被記錄;但被加載的對象和其子對象仍位於其原始集群中。開啟集群合並的情況下,被加載對象和被引用對象的集群將被組合。例如,一個粒子系統資源可能引用一個材質資源;但如果集群合並被關閉,材質和粒子系統將因垃圾回收的原因而處在各自的集群中。開啟集群合並後,因粒子系統引用材質,粒子資源集群將和材質集群進行合並。此行為通常不用於流動內容的遊戲(如開放世界遊戲),因為可能合並許多集群,形成更大、更多樣化的對象群組。集群中的對象不會被單獨銷毀,將等待群組中的所有對象均被設為待銷毀。而其中一小部分對象可能一直處於使用狀態,因此內存中可能出現較大的對象集群。在特殊情況下(如大量引用對象未被其他對象共享的資源)可啟用集群合並,並在代碼中手動添加集群,可統一子對象的清理、減少垃圾回收器在遊戲中必須進行的輸入和依賴關系維持檢查次數,進而提高性能。 技術分享圖片

原文地址:https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Actors/ActorLifecycle/index.html

(轉載)Actor 生命周期