본문 바로가기

Unity/DOTS

DOTS 학습을 위한 기초 정리 #8 동적 버퍼

반응형

참고 문헌 : 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에서는 두 가지 주요 이점을 제공합니다.

  1. float3 유형의 DynamicBuffer를 두개 이상 보유하거나 다른 공통 값 유형을 사용할 수 있습니다. 요소가 최상위 구조물에 고유하게 포장되어 있는한 동일한 값 유형을 활용하는 버퍼를 얼마든지 추가할 수 있습니다.

  2. 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. 무슨 용도인지 아직 모르겠음

반응형