Version: 2021.3
Compressing mesh data
텍스처

텍스처 및 메시 데이터 로드

Unity는 디스크에서 텍스처 및 메시 데이터를 로드한 후 동기식 또는 비동기식으로 GPU에 업로드할 수 있습니다. 이 두 프로세스를 동기식 업로드 파이프라인과 비동기식 업로드 파이프라인이라고 부릅니다.

Unity가 동기식 업로드 파이프라인을 사용하는 경우 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 없습니다. 그렇게 할 경우 애플리케이션에서 일시 중지가 자주 발생할 수 있습니다. Unity가 비동기식 업로드 파이프라인을 사용하는 경우 백그라운드에서 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 있습니다.

텍스처 또는 메시가 비동기식 업로드 파이프라인에 적합한 경우 Unity는 비동기식 업로드 파이프라인을 자동으로 사용합니다. 텍스처 또는 메시가 비동기식 업로드 파이프라인에 적합하지 않다면 Unity는 동기식 업로드 파이프라인을 자동으로 사용합니다.

작동 방식

동기식 업로드 파이프라인과 비동기식 업로드 파이프라인의 가장 큰 차이점은 Unity가 빌드 시점에 데이터를 저장하는 방식이며, 이는 Unity가 런타임 시점에 데이터를 로드하는 방식에도 영향을 줍니다.

동기식 업로드 파이프라인에서 Unity는 텍스처 또는 메시에 대한 메타데이터(헤더 데이터)와 텍셀 또는 버텍스 데이터(바이너리 데이터)를 단일 프레임에서 로드해야 합니다. 비동기식 업로드 파이프라인에서 Unity는 단일 프레임의 헤더 데이터만 로드해야 하며, 이후 프레임에서 바이너리 데이터를 GPU로 스트리밍할 수 있습니다.

동기식 업로드 파이프라인에서 Unity는 다음을 수행합니다.

  • 빌드 시점에 Unity는 메시 또는 텍스처의 헤더 데이터와 바이너리 데이터를 동일한 .res 파일에 기록합니다.
  • 런타임 시점에 애플리케이션이 텍스처 또는 메시를 필요로 하는 경우 Unity는 해당 텍스처 또는 메시에 대한 헤더 데이터와 바이너리 데이터를 .res 파일에서 메모리로 로드합니다. 모든 데이터가 메모리에 있으면 Unity는 바이너리 데이터를 메모리에서 GPU로 업로드합니다. 로드 및 업로드 작업은 주로 메인 스레드에서 단일 프레임으로 진행됩니다.

비동기식 업로드 파이프라인에서 Unity는 다음을 수행합니다.

  • 빌드 시점에 Unity는 헤더 데이터를 .res 파일에 기록하고 바이너리 데이터를 별도 .resS 파일에 기록합니다.
  • 런타임 시 애플리케이션에 텍스처나 메시가 필요할 때 Unity는 .res 파일의 헤더를 메모리로 로드합니다. 헤더가 메모리에 있으면 Unity는 고정된 크기의 링 버퍼를 사용하여 .resS 파일에서 GPU로 바이너리 데이터를 스트리밍합니다. Unity는 여러 프레임에 걸쳐 여러 스레드를 사용하여 바이너리 데이터를 스트리밍합니다. Unity가 GPU 하드웨어를 이미 알고 있는 일부 콘솔 플랫폼에서는 링 버퍼를 건너뛰고 GPU 메모리로 바로 로드합니다.

텍스처 및 메시 데이터 적격성

다음 조건을 충족할 경우 텍스처는 비동기식 업로드 파이프라인에 적합합니다.

  • 텍스처의 읽기/쓰기가 비활성화되어 있습니다.
  • 텍스처가 Resources 폴더에 없습니다.
  • 빌드 타겟이 Android인 경우 LZ4 압축이 프로젝트의 빌드 설정에서 활성화되어 있습니다.

LoadImage(byte[] data)를 사용하여 텍스처를 로드하면 위 조건을 충족하더라도 Unity가 동기식 업로드 파이프라인을 사용합니다.

다음 조건을 충족할 경우 메시는 비동기식 업로드 파이프라인에 적합합니다.

  • 메시의 읽기/쓰기가 비활성화되어 있습니다.
  • 메시가 Resources 폴더에 없습니다.
  • 메시에 블렌드 셰이프가 없습니다.
  • 메시가 동적 배칭에 적합하지 않거나 동적 배칭이 비활성화되어 있어서 Unity가 메시에 동적 배칭을 적용하지 않았습니다. 동적 배칭에 대한 자세한 내용은 드로우 콜 배칭을 참조하십시오.
  • 메시 버텍스/인덱스 데이터가 파티클 시스템, 터레인 또는 메시 콜라이더에 필요하지 않습니다.
  • 메시에 뼈대 가중치가 없습니다.
  • 메시 토폴로지사각형이 아닙니다.
  • 메시 에셋에 대한 meshCompression꺼짐으로 설정되어 있습니다. 빌드 타겟이 Android인 경우 LZ4 압축이 프로젝트의 빌드 설정에서 활성화되어 있습니다.

그 외 다른 모든 환경에서 Unity는 텍스처와 메시를 동기식으로 로드합니다.

Unity가 사용하는 업로드 파이프라인을 식별하는 방법

프로파일러 또는 다른 프로파일링 툴을 사용하면 스레드 활동과 프로파일러 마커를 관찰하여 Unity가 비동기식 업로드 파이프라인을 사용하는 시기를 식별할 수 있습니다.

다음을 통해 Unity가 비동기식 업로드 파이프라인을 사용하여 텍스처나 메시를 업로드하고 있음을 알 수 있습니다.

  • AsyncUploadManager.ScheduleAsyncRead, AsyncReadManager.ReadFileAsync.DirectTextureLoadBegin 프로파일러 마커
  • AsyncRead 스레드의 활동

이러한 활동이 관찰되지 않으면 Unity는 비동기식 업로드 파이프라인을 사용하지 않는 것입니다.

다음 프로파일러 마커는 Unity가 비동기식 업로드 파이프라인을 사용하고 있음을 나타내지 않습니다. Unity는 다음을 호출하여 비동기식 업로드 작업을 수행해야 하는지 확인합니다.

  • Initialization.AsyncUploadTimeSlicedUpdate
  • AsyncUploadManager.AsyncResourceUpload
  • AsyncUploadManager.ScheduleAsyncCommands

비동기식 업로드 파이프라인 설정

비동기식 업로드 파이프라인에 대해 다음의 설정을 지정할 수 있습니다. 동기식 업로드 파이프라인에는 이러한 설정을 적용할 수 없습니다.

Quality 설정에서 비동기 업로드 설정
Quality 설정에서 비동기 업로드 설정

비동기 업로드 버퍼

Unity는 단일 링 버퍼를 다시 사용하여 텍스처 및 메시 데이터를 GPU로 스트리밍합니다. 이렇게 하면 필요한 메모리 할당 수가 줄어듭니다.

Async Upload Buffer는 링 버퍼의 크기(MB)를 판단합니다. 최소 크기는 2이고 최대 크기는 512입니다.

Unity는 버퍼의 크기를 자동으로 조정하여 현재 로드 중인 최대 크기의 텍스처 또는 메시에 맞춥니다. Unity가 이러한 작업을 두 번 이상 수행해야 하는 경우 작업 속도가 느려질 수 있습니다. 기본 버퍼 크기보다 큰 여러 개의 텍스처를 로드하는 경우를 예로 들 수 있습니다. Unity가 버퍼 크기를 조정해야 하는 횟수를 줄이려면 로드할 것으로 예상되는 가장 큰 값으로 이 값을 설정하십시오. 이 값은 대개 씬에서 가장 큰 텍스처의 크기입니다.

이 값은 품질 설정 창에서 설정하거나 QualitySettings.asyncUploadBufferSize API를 사용하여 설정할 수 있습니다.

비동기 업로드 타임 슬라이스

Async Upload Time Slice는 CPU가 텍스처 또는 메시 데이터를 GPU에 업로드하는 데 소비하는 시간(프레임당 밀리초 단위)입니다.

값이 클수록 GPU에서 데이터가 더 빨리 준비되지만, CPU가 해당 프레임 동안 업로드 작업에 더 많은 시간을 소비합니다. Unity는 GPU에 업로드하기 위해 버퍼에 대기 중인 데이터가 있을 때에만 이 시간을 업로드에 사용합니다. 대기 중인 데이터가 없는 경우 Unity가 이 시간을 다른 작업에 사용할 수 있습니다.

이 값은 품질 설정 창에서 설정하거나 QualitySettings.asyncUploadTimeSlice API를 사용하여 설정할 수 있습니다.

추가 정보

텍스처 및 메시 데이터를 비동기식으로 업로드하는 방법에 대한 자세한 내용은 Unity 블로그 포스트 로드 성능 최적화: 비동기식 업로드 파이프라인 이해를 참조하십시오.

Compressing mesh data
텍스처