참고 문헌 : https://docs.unity3d.com/Packages/com.unity.entities@0.0/manual/dynamic_buffers.html
Dynamic Buffers
DynamicBuffer는 가변 크기의 "stretchy(확장)"버퍼가 엔티티와 연관 될 수있게 하는 일종의 구성 요소 데이터입니다. 특정 수의 요소를 포함하는 구성요소 유형으로 작동하지만 내부 용량이 모두 소모되면 힙 메모리 블록을 할당 할 수 있습니다.
이 접근법을 사용할 때 메모리 관리는 완전 자동입니다.DynamicBuffer와 연관된 메모리는 구성 요소가 제거 될 때 연관된 힙 메모리도 자동으로 해제 되도록 EntityManager에 의해 관리됩니다.
DynamicBuffers는 제거 된 고정 배열 지원을 대체합니다.
Declaring Buffer Element Types
버퍼를 선언하려면 버퍼에 넣을 요소의 유형을 사용하여 버퍼를 선언하십시오.
#Code
// 예약해야 하는 버퍼 요소의 수를 설명한다.
// 버퍼의 각 인스턴스에 대한 청크 데이터. 이 경우 8개의 정수
// 버퍼 헤더의 크기와 함께 예약됨(32바이트)
// (현재 64비트 대상의 경우 16바이트)
[InternalBufferCapacity(8)]
public struct MyBufferElement : IBufferElementData {
// 이러한 암묵적 변환은 선택 사항이지만 타자를 줄이는 데 도움이 될 수 있다.
public static implicit operator int(MyBufferElement e) { return e.Value; }
public static implicit operator MyBufferElement(int e) { return new MyBufferElement { Value = e };
}
// 각 버퍼 요소가 저장할 실제 값이다.
public int Value;
}
#Code/
Buffer이 디자인은 요소 유형을 설명하는 것이 이상한 것처럼 보이지만 ECS에서는 두 가지 주요 이점을 제공합니다.
-
float3 유형의 DynamicBuffer를 두개 이상 보유하거나 다른 공통 값 유형을 사용할 수 있습니다. 요소가 최상위 구조물에 고유하게 포장되어 있는한 동일한 값 유형을 활용하는 버퍼를 얼마든지 추가할 수 있습니다.
-
EntityArchetype에 Buffer 요소 유형을 포함할 수 잇으며, 일반적으로 구성 요소가 있는 것처럼 동작합니다.
Adding Buffer Types To Entities
엔티티에 버퍼를 추가하려면 엔티티에 구성 요소 유형을 추가하는 일반적인 방법을 사용할 수 있습니다.
Using AddBuffer()
entityManager.AddBuffer<MyBufferElement>(entity);
Using an archetype
Entity e = entityManager.CreateEntity(typeof(MyBufferElement));
Accessing Buffers
DynamicBuffers에 엑세스하는 방법에는 여러 가지가 있으며, 이 방법은 일반 구성 요소 데이터에 병렬로 엑세스 하는 방법입니다.
Direct, main-thread only access
DynamicBuffer<MyBufferElement> buffer = entityManager.GetBuffer<MyBufferElement>(entity);
Entity based access
또한 JobComponentSystem에서 엔티티 단위로 Buffer를 조회 할 수 있습니다 .
var lookup = GetBufferFromEntity<EcsIntElement>();
var buffer = lookup[myEntity];
buffer.Append(17);
buffer.RemoveAt(0);
Reinterpreting Buffers (experimental)
Buffers는 같은 크기의 종류로 재해석할 수 있습니다. 제어된 유형 펀딩을 허용하고 래퍼 요소 유형이 방해가 되면 제거하려는 의도입니다. 재해석 하려면 간단히 Reinterpreting<T>를 작성하면됩니다.
#Code
var intBuffer = entityManager.GetBuffer<EcsIntElement>().Reinterpret<int>();
#Code/
재해석된 버퍼는 원래의 버퍼의 safety handle를 가지고 있으며, 사용해도 안전합니다. 동일한 기본 BufferHeader를 사용하므로 한 개의 재해석된 Buffer에 대한 수정 사항이 다른 항목에 즉시 반영됩니다.
형식 검사가 필요하지 않으므로 uint과 float버퍼의 별명을 지정할 수 있습니다 .
#정리
1. 가변 길이를 지원해주는 버퍼
2. 무슨 용도인지 아직 모르겠음
'Unity > DOTS' 카테고리의 다른 글
DOTS 학습을 위한 기초 정리 #10 구성 요소 시스템 (0) | 2019.05.25 |
---|---|
DOTS 학습을 위한 기초 정리 #9 Systems (0) | 2019.05.25 |
DOTS 학습을 위한 기초 정리 #7 시스템 상태 구성요소 (2) | 2019.05.25 |
DOTS 학습을 위한 기초 정리 #6 공유된 구성 요소(Shared Component) (0) | 2019.05.24 |