# 버킷 할당자

> Inspect the usage reports of the bucket allocator.

버킷 할당자는 소규모 할당을 수행하는 빠르고 잠금 없는 할당자입니다. 일반적으로 버킷 할당자는 힙 할당자로 이동하기 전에 소규모 할당을 가속화하기 위한 첫 번째 단계로 사용됩니다.

이 할당자는 할당을 위해 메모리 블록을 예약합니다. 각 블록은 16KB의 **하위 섹션**으로 나뉩니다. 이는 설정할 수 없으며 사용자 인터페이스에 표시되지 않습니다. 각 하위 섹션은 **할당**으로 나뉩니다. 할당 크기는 설정된 고정 크기의 배수로, **세분화**라고 합니다.

## 예시 설정

다음 예시 설정에서는 할당을 위해 블록을 예약하는 프로세스를 보여 줍니다.


**Windows, Mac, Linux 플레이어용 공유 버킷 할당자:**
![](/api/media?file=/engine/6000.0/media/images/Shared_Bucket.png)

이 설정에서 총 **블록** 크기(**버킷 할당자 블록 크기**)는 4MB이고 할당 세분화(**버킷 할당자 세분화**)는 16B입니다. 총 8개의 버킷(**버킷 할당자 BucketCount**)에 첫 번째 할당은 16B, 두 번째는 32B(2\*16), 그 다음은 48B, 64B, 80B, 96B, 112B, 128B입니다.

각 하위 섹션에는 서로 다른 수의 버킷이 포함되어 있습니다. 하위 섹션의 버킷 수를 계산하려면 하위 섹션 크기(16KB)를 세분화 크기로 나눕니다. 예시:

* 할당 세분화가 64B인 경우 256개의 버킷이 하위 섹션에 들어갑니다.
* 할당 세분화가 16B인 경우 1,024개의 버킷이 하위 섹션에 들어갑니다.

## 개발 및 릴리스 빌드 비교

버킷 할당자는 개발 빌드와 릴리스 빌드에 대해 서로 다른 사용량 보고서를 생성하는데, 개발 빌드에서는 각 할당에 40B 헤더가 추가되기 때문입니다. 다음 다이어그램은 16B 및 64B 할당에 대한 개발 빌드와 릴리스 빌드의 차이를 보여 줍니다.


**개발 및 릴리스 빌드 비교:**
![](/api/media?file=/engine/6000.0/media/images/memory_allocation.png)

다음과 같이 할당자가 4MB 중 2MB만 할당한 후 가득 찼다고 보고하는 이유 또한 헤더 때문입니다.

```
[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 2.0 MB
      Failed Allocations. Bucket layout:
        16B: 64 Subsections = 18724 buckets. Failed count: 3889
        32B: 17 Subsections = 3868 buckets. Failed count: 169583
        48B: 31 Subsections = 5771 buckets. Failed count: 39674
        64B: 28 Subsections = 4411 buckets. Failed count: 9981
        80B: 17 Subsections = 2321 buckets. Failed count: 14299
        96B: 6 Subsections = 722 buckets. Failed count: 9384
        112B: 44 Subsections = 4742 buckets. Failed count: 5909
        128B: 49 Subsections = 4778 buckets. Failed count: 8715
```

동일한 프로젝트의 릴리스 빌드에서는 할당자 블록 크기가 충분함을 보여 줍니다.

```
[ALLOC_BUCKET]
      Large Block size 4.0 MB
      Used Block count 1
      Peak Allocated bytes 3.3 MB
```

버킷 할당자가 가득 차면 할당이 다른 할당자로 폴백됩니다. 사용량 보고서에는 할당 실패 횟수를 비롯한 사용량 통계가 표시됩니다. 보고서에 선형적으로 증가하는 실패 횟수가 표시되면 로드가 아닌 프레임을 계산할 때 할당이 실패할 가능성이 높습니다. 폴백 할당은 씬 로드에 문제가 되지 않지만 프레임을 계산할 때 발생하면 성능에 영향을 미칠 수 있습니다.

이러한 폴백 할당을 방지하려면 블록 크기를 늘립니다. 그리고 씬 로드 최대 사용량이 아닌 프레임의 최대 사용량과 일치하도록 새 블록 크기를 제한합니다. 이렇게 하면 블록이 너무 커져서 런타임 시 사용하지도 않을 많은 메모리 예약을 방지할 수 있습니다.

> **팁**: 프로파일러 할당자는 버킷 할당자의 인스턴스를 공유합니다. 프로파일러 [공유 버킷 할당자](#example)에서 이 공유 인스턴스를 커스터마이즈할 수 있습니다.
