Version: Unity 6.0 (6000.0)
언어 : 한국어
TLS(스레드 로컬 스토리지) 스택 할당자
Unmanaged C# memory

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

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(스레드 로컬 스토리지) 스택 할당자
Unmanaged C# memory
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961