UE5

[UE5] Animation System 분석

Pyxis 2025. 8. 10. 19:30

[ UE5 : Animation System 분석 ]

 

 

Animation System Pipeline


https://www.unrealengine.com/en-US/blog/animation-blueprints

 

 

애니메이션 시스템의 업데이트시, 다음과 같은 순서로 처리됨

  • Event Graph Update
  • Anim Graph Update
  • Trigger Event

 

Event Graph 업데이트를 먼저 실행하는 이유는, 모든 변수를 업데이트되도록 하여 AnimGraph에서 해당 변수들을 사용해서 블렌딩할 수 있게하기 위함임. 업데이트시, Bone Transform을 변경하지는 않음. 시간의 변환에 따라 상태(state)를 업데이트하는 것 뿐이다. 그러면, Bone Transform을 언제 변경하고 해당 프레임에서 유효한 포즈를 생성하도록 하는 것일까? Evaluate 단계에서 발생한다.

 

AnimGraph에서는 세 가지 이벤트가 발생한다.

  • Initialize
  • Update
  • Evaluate

 

EventGraph에서는 Evaluate가 필요없기 때문에 Initialize, Update 두 가지 이벤트만 발생시킨다.

  • Initialize
  • Update

보통 Initialize는 한 번만 발생하지만, 해당 프레임에서 메시가 변경되어 Re-Initialization이 필요한 경우 다시 발생할 수 있다. Update와 Evaluate는 기본적으로 매 프레임마다 발생한다. (설정 값 및 NetMode에 따라 예외가 있지만, 여기선 생략한다)

Evaluate는 유효한 포즈 결과를 생성하게되는데, 왜 Update와 분리되어 있을까? 대부분은 최적화때문이다. Evaluation은 Animation Process에서 가장 비싼 단계에 해당되는데, 엄청나게 많은 Transform관련 수학 연산을 필요로 하기 때문이다.

대신, 게임과 상호작용하는 동작은 없기 때문에 쉽게 병렬화가 가능하다. (이는 엔진 코드에서 Evaluate 단계가 멀티스레드로 구현되어 있는 이유가 된다) 반면에, Anim Notify와 같은 Trigger Event 업데이트의 경우, 게임과 상호작용을 필요로 하기 때문에 병렬화하기 매우 어렵다.

 

 

 

 

 

 

 

Init (Update & Evaluate In Lyra)

UWorld::SpawnActor

└ AActor::PostSpawnInitialize

   └ AActor::RegisterAllComponents

      └ AActor::IncrementalRegisterComponents

         └ UActorComponent::RegisterComponentWithWorld

            └ UActorComponent::ExecuteRegisterEvents

               └ USkeletalMeshComponent::OnRegister

                  └ USkeletalMeshComponent::InitAnim

                      ├ USkeletalMeshComponent::TickAnimation

                      │ └ USkeletalMeshComponent::TickAnimInstances

                      │     └ UAnimInstance::UpdateAnimation

                      │         └ UAnimInstance::ParallelUpdateAnimation (todo: MutliThreaded in Lyra?)

                      │             └ FAnimInstanceProxy::UpdateAnimation

                      │                └ FAnimInstanceProxy::UpdateAnimation_WithRoot

                      │                   ├ UAnimInstance::NativeThreadSafeUpdateAnimation

                      │                   ├ UAnimInstance::BlueprintThreadSafeUpdateAnimation

                      │                   ├ FAnimInstanceProxy ::Update

                      │                   └ FAnimInstanceProxy ::UpdateAnimationNode (if //)

                      │

                      └ USkeletalMeshComponent::RefreshBoneTransforms

                         └ USkeletalMeshCompnent::DoParallelEvaluationTasks_OnGameThread

                            └ USkeletalMeshCompnent::ParallelAnimationEvaluation

                               └ USkeletalMeshCompnent::PerformAnimationProcessing

                                  └ USkeletalMeshCompnent::EvaluateAnimation

                                     └ UAnimInstance::ParallelEvaluateAnimation

                                        └ FAnimInstanceProxy::EvaluateAnimation

                                           └ FAnimInstanceProxy::EvaluateAnimation_WithRoot

                                              └ FAnimInstanceProxy::EvaluateAnimationNode_WithRoot

                                                 └ FAnimNode_Root::Evaluate_AnyThread

 

 

 

 

 

Tick

USkeletalMeshComponent::TickAnimation

└ USkeletalMeshComponent::TickComponent

    └ USkinnedMeshComponent::TickComponent

       └ USkeletalMeshComponent::TickPose

          └ USkeletalMeshComponent::TickAnimation

             └ USkeletalMeshComponent::TickAnimInstances

                └ UAnimInstance::UpdateAnimation

 

 

 

FAnimInstanceProxy::PostUpdate

FAnimInstanceProxy::PostUpdate

 

이름과 달리 USkeletalMeshComponent::PostAnimEvaluation에서만 호출되는 것으로 확인.

추후 보충 필요

 

AnimNode Update - Idle Node

FParallelAnimationEvaluationTask::DoTask

└ USkeletalMeshComponent::ParallelAnimationEvaluation

   └ USkeletalMeshComponent::PerformAnimationProcessing

      └ UAnimInstance::ParallelUpdateAnimation

         └ FAnimInstanceProxy::UpdateAnimation

            └ FAnimInstanceProxy::UpdateAnimation_WithRoot

               └ FAnimInstanceProxy::UpdateAnimationNode

                  └ FAnimInstanceProxy::UpdateAnimationNode_WithRoot

                     └ FAnimNode_SaveCachedPose::PostGraphUpdate
                        └ PoseLinkBase::Update

                           └ FAnimNode_StateMachine::Update_AnyThread

                              └ PoseLinkBase::Update

                                 └ FAnimNode_SequencePlayerBase::UpdateAssetPlayer

 

 

 

 

 

 

 

'UE5' 카테고리의 다른 글

Performance Tips & Tricks - Animation  (0) 2025.11.02
[UE5] 공식 문서 주요사항 메모  (0) 2024.11.19
[UE5] TWeakObjectPtr  (4) 2024.11.06
[UE5] CreateDefaultSubobject, NewObject, SpawnActor  (0) 2024.11.03
[UE5] LineTrace Cost  (3) 2024.10.18