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. 이 컴포넌트를 변경하면 메모리 복사 등의 오버헤드가 발생한다.
'Unity > DOTS' 카테고리의 다른 글
DOTS 학습을 위한 기초 정리 #8 동적 버퍼 (0) | 2019.05.25 |
---|---|
DOTS 학습을 위한 기초 정리 #7 시스템 상태 구성요소 (2) | 2019.05.25 |
DOTS 학습을 위한 기초 정리 #5 일반 구성 요소 (2) | 2019.05.24 |
DOTS 학습을 위한 기초 정리 #4 구성 요소(Component) (0) | 2019.05.24 |