본문 바로가기

Unity/DOTS

DOTS 학습을 위한 기초 정리 #6 공유된 구성 요소(Shared Component)

반응형

ComponentData 공유

IComponentData는 World의 위치 저장과 같이 각 엔티티간에 달라지는 데이터에 적합합니다 . ISharedComponentData많은 엔티티가 공통점이있는 경우에 유용합니다. 예를 들어 Boid데모에서는 동일한 프리 팹 에서 많은 엔티티를 인스턴스화 하므로 RenderMesh많은 Boid엔티티 사이 가 동일합니다.

#Code

[System.Serializable]

public struct RenderMesh : ISharedComponentData {

public Mesh mesh;

public Material material;

public ShadowCastingMode castShadows;

public bool receiveShadows; }

#Code/

이 방법의 가장 큰 장점은 ISharedComponentData 엔티티 단위로 문자 그대로 0의 메모리 비용이 있다는 것입니다.

우리 ISharedComponentData는 동일한 InstanceRenderer데이터를 사용하여 모든 엔티티를 그룹화 한 다음 렌더링을 위해 모든 매트릭스를 효율적으로 추출하는 데 사용합니다. 결과 코드는 데이터가 액세스 될 때 정확히 배치되기 때문에 간단하고 효율적입니다.

  • RenderMeshSystemV2(파일 : Packages / com.unity.entities / Unity.Rendering.Hybrid / RenderMeshSystemV2.cs 참조 )

SharedComponentData에 대한 몇 가지 중요한 참고 사항 :

  • 같은 엔티티 SharedComponentData는 같은 청크 로 그룹화됩니다 . Chunk에 대한 색인 은 엔티티 당 하나가 아니라 SharedComponentData저장됩니다. 결과적으로 SharedComponentData엔티티 단위로 제로 메모리 오버 헤드 가 발생 합니다.
  • using을 사용 EntityQuery하면 동일한 유형의 모든 항목을 반복 할 수 있습니다.
  • 또한 EntityQuery.SetFilter()특정 SharedComponentData값 을 가진 엔티티에 대해 반복적으로 사용할 수 있습니다 . 데이터 레이아웃으로 인해 이 반복에는 낮은 오버 헤드가 있습니다.
  • EntityManager.GetAllUniqueSharedComponents를 사용하여 활성 상태의 엔티티에 추가된 모든 고유한 SharedComponentData를 검색할 수 잇습니다.
  • SharedComponentData자동으로 참조 횟수가 계산됩니다 .
  • SharedComponentData는 변경을 자제해야합니다.  SharedComponentData를 변경하면 memcpy  사용하여 해당 엔티티의 모든 ComponentData를 다른 Chunk로 복사합니다.

 

#정리

 1. 이 컴포넌트를 포함하게 된 모든 엔티티는 같은 데이터를 공유하게 된다.

 2. 하나의 데이터를 엔티티들이 참조하는 상태이기 때문에 각 엔티티간의 메모리 낭비는 0이다.

 3. 이 컴포넌트를 변경하면 메모리 복사 등의 오버헤드가 발생한다.

반응형