Unity 텍스처 및 메시 데이터 로드
개요
Unity는 디스크에서 텍스처 및 메시 데이터를 로드한 후 이를 GPU에 업로드하는 두 가지 방법(동기식, 비동기식)을 제공합니다. 이 문서에서는 이 두 프로세스의 차이점과 각 프로세스의 사용 시나리오를 설명합니다.
동기식 vs 비동기식 업로드 파이프라인
- 동기식 업로드 파이프라인
- 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 없습니다.
- 애플리케이션에서 일시 중지 현상이 발생할 수 있습니다.
- 텍스처 및 메시에 대한 메타데이터와 비트맵 데이터를 동일한 프레임에서 로드해야 합니다.
- 비동기식 업로드 파이프라인
- 백그라운드에서 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 있습니다.
- 헤더 데이터는 단일 프레임에서 로드하고, 바이너리 데이터는 이후 프레임에서 스트리밍하여 GPU에 업로드합니다.
작동 방식
- 동기식 업로드
- 빌드 시 헤더 데이터와 바이너리 데이터를 같은 .res 파일에 기록합니다.
- 런타임에서 텍스처나 메시가 필요할 때 모두 메모리로 로드 후 GPU로 업로드합니다.
- 비동기식 업로드
- 빌드 시 헤더 데이터는 .res 파일에, 바이너리 데이터는 별도의 .resS 파일에 기록합니다.
- 런타임에서 헤더만 메모리로 로드하며, 바이너리는 링 버퍼를 사용하여 스트리밍됩니다.
텍스처 및 메시 데이터 적격성
비동기식 업로드 파이프라인에 적합한 조건은 다음과 같습니다:
텍스처
조건 | 설명 |
---|---|
읽기/쓰기가 비활성화됨 | 텍스처의 읽기/쓰기를 비활성화해야 합니다. |
Resources 폴더에 없음 | 텍스처가 Resources 폴더에 있어서는 안 됩니다. |
Android 빌드 타겟 | LZ4 압축이 활성화되어 있어야 합니다. |
메시
조건 | 설명 |
---|---|
읽기/쓰기가 비활성화됨 | 메시의 읽기/쓰기를 비활성화해야 합니다. |
Resources 폴더에 없음 | 메시가 Resources 폴더에 있어서는 안 됩니다. |
블렌드 셰이프 없음 | 메시에는 블렌드 셰이프가 없어야 합니다. |
동적 배칭 비활성화 | 동적 배칭이 적용되지 않거나 비활성화되어야 합니다. |
메시 데이터 필요 없음 | 파티클 시스템, 터레인 또는 메시 콜라이더에 필요하지 않아야 합니다. |
뼈대 웨이트 없음 | 메시에는 뼈대 웨이트가 없어야 합니다. |
사각형이 아님 | 메시 토폴로지가 사각형이 아니어야 합니다. |
meshCompression 설정 | 메시 에셋에 대한 meshCompression이 꺼짐으로 설정되어야 합니다. |
Android 빌드 타겟 | LZ4 압축이 활성화되어 있어야 합니다. |
프로파일링으로 업로드 파이프라인 식별
Unity에서 사용 중인 업로드 파이프라인을 식별할 수 있습니다. 프로파일러나 다른 프로파일링 툴을 사용하여 아래의 활동을 관찰합니다.
활동 | 설명 |
---|---|
AsyncUploadManager.ScheduleAsyncRead | 비동기식을 사용하여 텍스처나 메시를 업로드 할 때 나타나는 마커입니다. |
AsyncReadManager.ReadFile | 비동기 읽기 작업을 나타냅니다. |
Async.DirectTextureLoadBegin | 텍스처 로드 초기화를 나타냅니다. |
비동기식 작업이 관찰되지 않는 경우 동기식 업로드가 이루어지는 것입니다.
비동기식 업로드 파이프라인 설정
비동기식 업로드 파이프라인에 대해 다음 설정을 조정할 수 있습니다.
설정 | 설명 |
---|---|
Quality 설정 | 비동기 업로드 설정을 조정합니다. |
Async Upload Buffer | 링 버퍼 크기를 재사용하여 메모리 할당을 줄입니다. |
비동기 업로드 타임 슬라이스 | 텍스처 또는 메시 데이터를 GPU에 업로드 하는 데 소비하는 시간입니다. |
결론
Unity의 비동기식 업로드 파이프라인은 게임의 성능을 최적화하는 데 매우 중요합니다. 적절한 설정과 조건을 따라 텍스처와 메시를 효과적으로 처리할 수 있습니다. 최적의 성능을 위해 Unity에서 제공하는 프로파일링 도구를 적극적으로 활용하기 바랍니다.