UDN
Search public documentation:

ActorTickingKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 언리얼스크립트 > 액터 틱
UE3 홈 > 게임플레이 프로그래밍 > 액터 틱

액터 틱


문서 변경내역: Joe Graf 작성.

개요


액터들은 프레임당 한 번씩, 그들이 세계의 액터 목록(전체 레벨 목록의 집합)에서 나타나는 순서에 따라 프레임간의 경과시간으로 틱 됩니다. 액터의 틱은 현재 다음 3단계에서 행해집니다: 비동기 작업 전, 비동기 작업 도중 그리고 비동기 작업 후. 어느 그룹에서 액터가 틱 되는지는 TickGroup 멤버에 의해 제어됩니다. 한 액터의 상태가 비동기 작업(물리, 그리고 나중에 다른 것들)이 전혀 행해지기 이전에 업데이트될 필요가 있다면, 그 액터는 TG_PreAsyncWork 그룹에 배정되어야 합니다. 그렇게 하지 않으면 올바르지 않은 행동 및/또는 off-by-one-frame(프레임이 하나 더 많아지거나 하나 더 적어지는) 문제를 일으키게 됩니다. 물리 및 기타 스레드와 나란히 틱 될 수 있는 액터들은 TG_DuringAsyncWork 그룹에 배정됩니다. 이 그룹 내의 어떤 액터가 강체의 물리 데이터를 건드리는 함수를 호출하면, 오류가 로그되고 그 호출은 무시됩니다. 이것은 메모리 누출, 적법하지 않은 장면의 상태 등으로 이어질 수 있으므로, 신경 써서 수정되어야 합니다. SpawnActor(), MoveActor(), SetLocation(), SetCollision(), 등에 대해서도 마찬가지입니다. 이 함수들은 계속해서 집행되지만 물리 스레드에 영향을 주지는 않습니다. 이들에 대해서도 오류가 로그됩니다. 마지막으로, 물리가 먼저 업데이트되는 것에 의존하는 액터는 그룹을 TG_PostAsyncWork로 설정합니다. 이 그룹의 액터들은 정확한 세계의 상태 (차량, 헝겊인형 등)를 나타내기 위해 물리 시뮬레이션의 결과에 의존합니다. 이 단계에서는 움직임, 스폰하기, 그리고 충돌을 위한 물리 및 Unreal 함수의 호출이 모두 안전합니다.

다음은 액터를 틱 그룹에 배치하는 것에 대한 장단점의 목록입니다:

TG_PreAsync 그룹


+ Unreal 함수 또는 Novodex의 물리 함수를 어느 것이든 안전하게 호출할 수 있음.

+ 물리 시뮬레이션을 위해 위치, 회전 등을 업데이트 함.

- 바로 전 프레임의 물리 시뮬레이션 결과에 따라 작용함.

- 병렬 처리를 하지 않음.

TG_DuringAsync 그룹


+ 물리 시뮬레이션과 나란히 발생.

- 특정 Unreal 함수 및 장면 데이터에 기록하는 모든 Novodex 물리 함수의 호출이 안전하지 않음(읽기는 괜찮음).

TG_PostAsync 그룹


+ 어떤 Unreal 함수나 Novodex 물리 함수도 안전하게 호출할 수 있음.

+ 현 프레임의 물리 시뮬레이션 데이터에 따라 작용함.

- 병렬 처리를 하지 않음.

다음은 액터를 특정 목록에 배치하는 일반적인 규칙입니다:

  1. 해당 액터가 충돌을 변경하고, 충돌가능한 액터를 스폰하고, Novodex 데이터에 기록한다면, TG_PreAsyncWork에 넣어져야 합니다. 잘 알려진 이 그룹의 액터들에는Pawns, Weapons, 그리고 일부 강체 클래스들이 있습니다.
  2. 만일 액터가 충돌의 변경, 충돌하는 액터의 스폰(충돌하지 않는 액터는 괜찮음), 또는Novodex 데이터의 변경 을 하지 않는다면, 이 액터는 TG_DuringAsyncWork 그룹에 배치되어야 합니다. 액터의 틱에 소요된 시간이 물리의 시뮬레이션에 소요된 시간을 가리기 때문에 이곳이 가장 알맞은 장소입니다. 예를 들면 이곳에서 2ms의 틱 시간은 2ms까지의 시뮬레이션 시간을 사용할 수 있다는 것을 의미합니다. 입자 시스템, 오디오, AI의 처리 등이 이 그룹에 넣어지는 것들입니다.
  3. 액터가 그의 Unreal 데이터를 업데이트하기에 앞서 Novodex로부터 데이터를 찾아와야 한다면, 이 액터는 TG_PostAsyncWork 그룹에 들어가야 합니다. 차량이나 헝겊인형 등이 가장 빈번히 이 그룹에 들어가는 것들입니다.

액터의 스폰


액터를 스폰한다는 것은, 액터 (그리고 그 액터의 모든 컴포넌트)가 그의 틱 그룹에 상관없이 그것이 스폰된 그룹 내에서 틱 될것이라는 것을 뜻합니다. 바로 다음 프레임, 새로 스폰된 액터는 올바른 틱 그룹에서 틱 될것입니다. 이에 대한 한 가지 예외는 비동기 작업중에 스폰된 액터가 TG_PostAsyncWork때까지 지연되는 경우입니다.

컴포넌트의 틱


액터와 마찬가지로, 컴포넌트도 여러 틱 그룹으로 분리될 수 있습니다. 이전에는 액터가 틱하는 동안 그의 컴포넌트들도 모두 틱 했습니다. 이것은 지금도 마찬가지이기는 하지만, 서로 다른 그룹에 있어야 하는 컴포넌트들은 그것들이 언제 틱 될것인지를 관리하는 목록에 추가되었습니다. 컴포넌트들은 액터를 틱 그룹에 배정하는 것과 같은 기준을 사용해서 틱 그룹에 배정되어야 합니다.

틱 코드의 흐름


게임 스레드 물리 스레드
세계의 액터 목록을 짚어 나가면서 TG_PreAsyncWork인 것을 틱 하고 그밖의 것들은 모두 지연시킨다 대기 상태
각각의 틱 된 액터에 대해, 컴포넌트 목록을 짚어나가면서 TG_PreAsyncWork를 틱 하고 그밖의 것들은 모두 지연시킨다 대기 상태
물리 스레드에게 시작할 것을 지시한다 시뮬레이션 시작
TG_DuringAsyncWork 목록에 있는 각 액터를 틱 한다 물리를 시뮬레이트 한다
액터 내의 각 컴포넌트를 틱 한다. 필요한 것은 지연시킨다 물리를 시뮬레이트 한다
TG_DuringAsycnWork때까지 지연된 각 컴포넌트를 틱 한다 물리를 시뮬레이트 한다
물리 작업이 끝날 때까지 차단한다 시뮬레이션 결과를 반환한다
TG_PostAsyncWork 목록에 있는 각 액터를 틱 한다 대기 상태
액터 내의 각 컴포넌트를 틱 한다 대기 상태
TG_PostAsycnWork때까지 지연된 각 컴포넌트를 틱 한다 대기 상태
렌더하고, 위 과정을 반복한다 대기 상태

자세한 코드의 흐름(및 틱 이후)


코드의 흐름(각 프레임)

객체의 틱
   물리 이전
      콘트롤러 (입력)
      폰 (스크립트)
      컴포넌트
         SkeletalMeshComponent: 애니메이션, 뼈대 콘트롤을 업데이트 한 다음, 매트릭스를 연산
   물리, 비동기
      폰 물리
   물리 이후
   카메라 틱
   뷰포트 틱

   "서버 이동"
   "클라이언트 이동"
   스트리밍

렌더
   VP 매트릭스 계산 (스크립트에서 카메라를 요청허고, 캐시된 값을 반환)
   Controller.PreRender
      UTPawn.PreRender (라이센스 사용자들이 사용하기에도 아주 좋음)
   모든 것을 렌더

오디오

Callgraph 계산

틱이 왜 그렇게 중요한가?

틱하기와 렌더하기의 순서를 이해하는 것은 off-by-one-frame(프레임이 하나 더 많아지거나 하나 더 적어지는) 문제를 피하고 호출 순서에서의 종속 상태를 파악하는데 있어서 매우 중요합니다. 예를 들면, 카메라는 모든 틱이 끝난 다음에 업데이트 되므로, 카메라와 관련된 것들은 무엇이든지 (첫 번째 인물의 부착이라든지 레이저점 등)은 모두 PreRender에서 이루어져야 합니다. 그렇지만 만일, 예를 들자면, 애니메이션 이 카메라의 위치에 종속되어 있다면 off-by-one-frame 문제가 생기게 될 것입니다. 애니메이션은 물리 이전에 발생하고, 폰의 움직임은 물리 도중에 발생하며, (대개) 카메라는 폰의 위치에 의존하기 때문에, 애니메이션의 종속성은 연관되는 문제점의 고리를 형성하게 됩니다. 이 문제를 회피하기 위해서는 무엇인가를 프레임 당 한 번 이상 계산해야 할 필요가 있을지 모릅니다. 카메라의 틱과 애니메이션의 틱을 물리 이후로 이동하면 애니메이션이 카메라의 위치를 정확히 업데이트하도록 해줄 것입니다 (그러나 코드에서 특별히 이를 방지하도록 하지 않는 한, 카메라가 프레임 당 두 번 업데이트 될 것입니다).

- Jordan Weitz?