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의 블록 크기는 너무 작아서 애플리케이션에 필요한 잡 메모리를 수용할 수 없으며 전체 할당자로 인해 대부분의 할당이 오버플로되었습니다.
빌드의 프레임 오버플로가 충분한지 확인하려면 짧게 실행한 후 더 오래 실행해 보십시오. 오버플로 수가 일정하게 유지되면 오버플로는 로드 중에 발생하는 상위 수위선입니다. 실행 시간이 길어질수록 오버플로 수가 증가하면 빌드가 프레임당 오버플로를 처리하고 있는 것입니다. 두 경우 모두 블록 크기를 늘려서 오버플로를 줄일 수 있지만 로드 중에는 프레임당보다 오버플로가 덜 중요합니다.