본문 바로가기

Unity/DOTS

DOTS 학습을 위한 기초 정리 #12 엔티티 명령 버퍼

반응형

Entity Command Buffer

EntityCommandBuffer 클래스는 두 가지 중요한 문제를 해결합니다 :

  1. 당신이 직업 중인 경우 EntityManager에 액세스 할 수 없습니다.
  2. EntityManager(엔티티를 생성하기 위해) 액세스하면 삽입 된 모든 배열과 EntityQuery객체 를 무효화 합니다.

EntityCommandBuffer 추상화를 사용하면 작업 또는 기본 스레드에서 변경 사항을 대기열에 추가하여 나중에 기본 스레드에 적용할 수 잇습니다.

 

EntityCommandBuffer를 사용하는 방법은 다음과 같습니다.

  주 스레드에서 업데이트하는 ComponentSystem 하위 클래스에는 자동으로 호출 할 수있는 PostUpdateCommands 클래스가 있습니다. 그것을 사용하려면 단순히 속성을 참조하고 변경 사항을 대기열에 올려 놓으십시오. 시스템의 Update기능 에서 복귀하면 즉시 자동으로 적용됩니다 .

 

다음은 그 예입니다.

PostUpdateCommands.CreateEntity(TwoStickBootstrap.BasicEnemyArchetype);
PostUpdateCommands.SetComponent(new Position2D { Value = spawnPosition });
PostUpdateCommands.SetComponent(new Heading2D { Value = new float2(0.0f, -1.0f) });
PostUpdateCommands.SetComponent(default(Enemy));
PostUpdateCommands.SetComponent(new Health { Value = TwoStickBootstrap.Settings.enemyInitialHealth });
PostUpdateCommands.SetComponent(new EnemyShootState { Cooldown = 0.5f });
PostUpdateCommands.SetComponent(new MoveSpeed { speed = TwoStickBootstrap.Settings.enemySpeed });
PostUpdateCommands.AddSharedComponent(TwoStickBootstrap.EnemyLook);

보시다시피 API는 EntityManager API와 매우 유사합니다. 이 모드에서는 EntityCommandBuffer를 시스템 내에서 어레이가 무효화되는 것을 방지하는 편리함으로 생각하는 것이 좋습니다.

 

작업의 경우 기본 스레드의 엔티티 명령 버퍼 시스템에 EntityCommandBuffer를 요청하고 작업에 전달해야합니다.  EntityCommandBufferSystem이 업데이트되면 명령 버퍼가 순서대로 주 스레드에서 재생됩니다. 메모리 관리를 중앙 집중화하고 생성된 엔티티와 구성 요소의 결정론을 보장할 수 있도록 이 추가 단계가 필요합니다.

 

다시 두 개의 스틱 슈터 샘플을 보고 실제로 어떻게 작동하는지 알아보겠습니다.

Entity Command Buffer Systems

기본 World Initialization은 초기화, 시뮬레이션 및 프레젠테이션을 위해 각 프레임 순서로 업데이트 되는 세 개의 시스템 그룹을 제공합니다. 그룹 내에는 그룹의 다른 시스템 보다 먼저 실행되는 엔티티 명령 버퍼 시스템이 있고 그룹의 다른 모든 시스템 다음에 실행되는 시스템도 있습니다. 동기화 지점을 최소화하려면 기종 명령 버퍼 시스템 중 하나를 사용하는 것이 좋습니다. 기본 그룹 및 명령 버퍼 시스템 목록은 기본 시스템 그룹을 참조합니다.

Using EntityCommandBuffers from ParallelFor jobs

EntityCommandBuffer를 사용하여 ParallelFor 작업에서 EntityManager 명령을 실행할 때 EntityCommnadBuffer가 사용됩니다. 동시 인터페이스는 스레드 안전성 및 결정론적 재생을 봊아하는 데 사용됩니다. 이 인터페이스의 공용 메서드는 기록된 명령을 결정론적 순서로 재생하는 데 사용되는 추가 jobIndex 매개 변수를 사용합니다. jobIndex는 각 작업에 고유 ID여야 합니다. 성능상의 이유로 jobIndex는 IJobParallelFor.Execute()에 전달된 (증가)인덱스 값이어야 합니다.  작업을 제대로 알지 못하는 한 인덱스를 jobIndex로 사용하는 것이 가장 안정합니다. 다른 jobIndex 값을 사용하면 올바른 출력이 생성되지만 경우에 따라 성능이 심각하게 저하될 수 있습니다.

 

 

반응형