본문 바로가기

Unity/DOTS

DOTS 학습을 위한 기초 정리 #11 Job 구성 요소 시스템

반응형

JobComponentSystem

Automatic job dependency management

종속성을 관리하는 것은 어렵습니다. 이것이 우리가 JobComponentSystem이 자동으로 당신을 위해 자동으로 관리하는 이유입니다 . 규칙은 간단합니다. 서로 다른 시스템의 작업은 동일한 유형의 IComponentData에서 병렬로 읽을 수 있습니다. 작업 중 하나가 데이터에 쓰는 중이면 병렬로 실행할 수 없으며 작업 간 종속성으로 예약됩니다.

public class RotationSpeedSystem : JobComponentSystem
{
    [BurstCompile]
    struct RotationSpeedRotation : IJobForEach<Rotation, RotationSpeed>
    {
        public float dt;

        public void Execute(ref Rotation rotation, [ReadOnly]ref RotationSpeed speed)
        {
            rotation.value = math.mul(math.normalize(rotation.value), quaternion.axisAngle(math.up(), speed.speed * dt));
        }
    }

    // Any previously scheduled jobs reading/writing from Rotation or writing to RotationSpeed 
    // will automatically be included in the inputDeps dependency.
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        var job = new RotationSpeedRotation() { dt = Time.deltaTime };
        return job.Schedule(this, inputDeps);
    } 
}

How does this work?

모든 작업 및 시스템이 구성 요소를 선언합니다. 읽거나 쓰는 유형이며 결과적으로 JobComponentSystem이 JobHandle을 반환하면 이 작업은 EntityManager와 읽기 또는 쓰기 여부에 대한 정보를 포함한 모든 유형에 자동으로 등록됩니다.

 

따라서 시스템이 컴포넌트 A에 기록되고 나중에 컴포넌트 A에서 다른 시스템이 읽히는 경우 JobComponentSystem은 읽고 있는 유형 목록을 검색하여 첫 번째 시스템에서 작업에 대한 종속성을 전달합니다.

 

JobComponentSystem(작업 구성 요소 시스템)은 작업이 필요한 경우 종속성으로 연결하기만 하면 주 스레드에 스톨이 발생하지 않습니다. 그러나 JobComponentSystem외의 ComponentSystem이 동일한 데이터에 엑세스하면 어떻게 될까요? 모든 엑세스가 선언되므로 ComponentSystem은 OnUpdate를 호출하기 전에 시스템에서 사용하는 구성 요소 유형에 대해 실행 중인 모든 작업을 자동으로 완료합니다.

 

Dependency management is conservative & deterministic

종속성 관리는 보수적입니다. ComponentSystem은 단순히 EntityQueryobjects를 사용한 적이 있으며 이를 기반으로 작성되거나 읽히는 유형을 추적합니다.

 

또한 단일 시스템에서 여러 작업을 예약할 때 서로 다른 작업에 더 적은 종속성이 필요하더라도 모든 작업에 종속성을 전달해야 합니다. 이것이 성능 문제로 판명될 경우 가장 좋은 해결책은 시스템을 둘로 분할하는 것 입니다.

 

종속성 관리 접근법은 보수적입니다. 매우 간단한 API를 제공하면서 결정론적, 올바른 동작을 할 수 있습니다.

 

Sync points

모든 구조 변경에는 하드 싱크 포인트가 있습니다. CreateEntity, Instantiate, Destroy, AddComponent, RemoveComponent, SetSharedComponentData에는 모든 하드 동기화 포인트가 있습니다다. 즉, JobComponentSystem을 통해 예약된 모든 작업이 엔티티를 만들기 전에 완료됩니다. 이런일은 자동으로 발생합니다. 예를 들어, EntityManager.CreateEntity를 프레임 중간에 호출 하면 이전에 예정된 모든 World작업이 완료 될 때까지 대기하는 큰 스톨이 생길 수 있습니다 .

 

게임 플레이 중에 엔티티를 만들 때 동기화 지점을 피하는 방법에 대한 자세한 내용은 EntityCommandBuffer 를 참조하십시오.

 

Multiple Worlds

모든 월드에는 자체 엔티티 매니저가 있으므로 별도의 작업 핸들 종속성 관리 세트가 있습니다. 한 세계의 하드 동기화 지점은 다른 세계에 영향을 미치치 않습니다. 그 결과 스트리밍 및 절차 생성 시나리오의 경우, 한 월드에 엔티티를 생성한 다음 프레임 시작 시에 한 트랜잭셩으로 다른 월드로 이동하는 것이 유용합니다.

 

절차 생성 및 스트리밍 시나리오 및 시스템 업데이트 순서에 대한 동기화 지점을 피하는 방법에 대한 자세한 내용은 ExcludeEntityTransaction을 참조하십시오.
https://docs.unity3d.com/Packages/com.unity.entities@0.0/manual/exclusive_entity_transaction.html

반응형