Version: 2023.2
언어: 한국어
TLS(스레드 로컬 스토리지) 스택 할당자
할당자 커스터마이즈

스레드세이프 리니어 할당자

Unity의 워커 스레드는 잡에 대한 워커 버퍼를 잠금 없이 빠르게 할당하기 위해 라운드 로빈 FIFO(선입선출) 알고리즘을 사용합니다. 잡이 완료되면 버퍼를 삭제합니다.

이 할당자는 메모리 블록을 할당한 다음 해당 블록 내에서 선형으로 메모리를 할당합니다. 사용 가능한 블록은 풀에 보관됩니다. 한 블록이 가득 차면 할당자는 풀에서 새 블록을 페치합니다. 할당자가 블록의 메모리를 더 이상 필요로 하지 않으면 블록을 비우고 사용 가능한 블록 풀로 반환합니다. 블록을 다시 사용할 수 있도록 빠르게 할당을 지우는 것이 중요하므로 잡은 몇 프레임 이상 할당된 상태를 유지해서는 안 됩니다.

블록 크기를 커스터마이즈할 수 있습니다. 할당자는 필요에 따라 최대 64개의 블록을 할당합니다.

에디터용 Fast Thread Shared Temporary Allocators의 기본값
에디터용 Fast Thread Shared Temporary Allocators의 기본값

모든 블록이 사용 중이거나 할당이 블록에 비해 너무 큰 경우 해당 할당은 잡 할당자보다 훨씬 느린 메인 힙 할당자로 폴백됩니다. 몇 개(프레임에서 1–10개 또는 특히 로드 중에 수백 개)의 오버플로 할당은 가능하지만 모든 프레임에서 오버플로 수가 증가하면 블록 크기를 늘려 폴백 할당을 방지할 수 있습니다. 그러나 씬 로드와 같은 이벤트의 최대 사용량에 맞추기 위해 블록 크기를 너무 많이 늘리면 플레이 동안에 많은 메모리를 사용할 수 없게 될 수 있습니다.

예제:

[ALLOC_TEMP_JOB_4_FRAMES (JobTemp)]
  Initial Block Size 0.5 MB
  Used Block Count 64
  Overflow Count (too large) 0
  Overflow Count (full) 50408

이 예제 사용량 보고서에서 0.5MB의 블록 크기는 너무 작아서 애플리케이션에 필요한 잡 메모리를 수용할 수 없으며 전체 할당자로 인해 대부분의 할당이 오버플로되었습니다.

빌드의 프레임 오버플로가 충분한지 확인하려면 잠시 실행해 본 다음 더 오래 실행하십시오. 오버플로 카운트가 일정하게 유지되면 해당 오버플로는 로드 중에 발생하는 최고점입니다. 실행 시간이 길어질수록 오버플로 카운트가 증가하면 빌드는 프레임당 오버플로를 처리합니다. 두 경우 모두 블록 크기를 늘려 오버플로를 줄일 수 있지만, 로드 중에는 프레임당 오버플로가 오버플로보다 더 중요합니다.

TLS(스레드 로컬 스토리지) 스택 할당자
할당자 커스터마이즈