Unity의 워커 스레드는 잡에 대한 워커 버퍼를 잠금 없이 빠르게 할당하기 위해 라운드 로빈 FIFO(선입선출) 알고리즘을 사용합니다. 잡이 완료되면 버퍼를 삭제합니다.
이 할당자는 메모리 블록을 할당한 다음 해당 블록 내에서 선형으로 메모리를 할당합니다. 사용 가능한 블록은 풀에 보관됩니다. 한 블록이 가득 차면 할당자는 풀에서 새 블록을 페치합니다. 할당자가 블록의 메모리를 더 이상 필요로 하지 않으면 블록을 비우고 사용 가능한 블록 풀로 반환합니다. 블록을 다시 사용할 수 있도록 빠르게 할당을 지우는 것이 중요하므로 잡은 몇 프레임 이상 할당된 상태를 유지해서는 안 됩니다.
블록 크기를 커스터마이즈할 수 있습니다. 할당자는 필요에 따라 최대 64개의 블록을 할당합니다.
모든 블록이 사용 중이거나 할당이 블록에 비해 너무 큰 경우 해당 할당은 잡 할당자보다 훨씬 느린 메인 힙 할당자로 폴백됩니다. 몇 개(프레임에서 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의 블록 크기는 너무 작아서 애플리케이션에 필요한 잡 메모리를 수용할 수 없으며 전체 할당자로 인해 대부분의 할당이 오버플로되었습니다.
빌드의 프레임 오버플로가 충분한지 확인하려면 잠시 실행해 본 다음 더 오래 실행하십시오. 오버플로 카운트가 일정하게 유지되면 해당 오버플로는 로드 중에 발생하는 최고점입니다. 실행 시간이 길어질수록 오버플로 카운트가 증가하면 빌드는 프레임당 오버플로를 처리합니다. 두 경우 모두 블록 크기를 늘려 오버플로를 줄일 수 있지만, 로드 중에는 프레임당 오버플로가 오버플로보다 더 중요합니다.