Unity는 디스크에서 텍스처 및 메시 데이터를 로드한 후 동기식 또는 비동기식으로 GPU에 업로드할 수 있습니다. 이 두 프로세스를 동기식 업로드 파이프라인과 비동기식 업로드 파이프라인이라고 부릅니다.
Unity가 동기식 업로드 파이프라인을 사용하는 경우 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 없습니다. 그렇게 할 경우 애플리케이션에서 일시 중지가 자주 발생할 수 있습니다. Unity가 비동기식 업로드 파이프라인을 사용하는 경우 백그라운드에서 데이터를 로드하고 업로드하는 동안 다른 작업을 수행할 수 있습니다.
텍스처 또는 메시가 비동기식 업로드 파이프라인에 적합한 경우 Unity는 비동기식 업로드 파이프라인을 자동으로 사용합니다. 텍스처 또는 메시가 비동기식 업로드 파이프라인에 적합하지 않다면 Unity는 동기식 업로드 파이프라인을 자동으로 사용합니다.
동기식 업로드 파이프라인과 비동기식 업로드 파이프라인의 가장 큰 차이점은 Unity가 빌드 시점에 데이터를 저장하는 방식이며, 이는 Unity가 런타임 시점에 데이터를 로드하는 방식에도 영향을 줍니다.
동기식 업로드 파이프라인에서 Unity는 텍스처 또는 메시에 대한 메타데이터(헤더 데이터)와 텍셀 또는 버텍스 데이터(바이너리 데이터)를 단일 프레임에서 로드해야 합니다. 비동기식 업로드 파이프라인에서 Unity는 단일 프레임의 헤더 데이터만 로드해야 하며, 이후 프레임에서 바이너리 데이터를 GPU로 스트리밍할 수 있습니다.
동기식 업로드 파이프라인에서 Unity는 다음을 수행합니다.
비동기식 업로드 파이프라인에서 Unity는 다음을 수행합니다.
다음 조건을 충족할 경우 텍스처는 비동기식 업로드 파이프라인에 적합합니다.
LoadImage(byte[] data)
를 사용하여 텍스처를 로드하면 위 조건을 충족하더라도 Unity가 동기식 업로드 파이프라인을 사용합니다.
다음 조건을 충족할 경우 메시는 비동기식 업로드 파이프라인에 적합합니다.
그 외 다른 모든 환경에서 Unity는 텍스처와 메시를 동기식으로 로드합니다.
프로파일러 또는 다른 프로파일링 툴을 사용하면 스레드 활동과 프로파일러 마커를 관찰하여 Unity가 비동기식 업로드 파이프라인을 사용하는 시기를 식별할 수 있습니다.
다음을 통해 Unity가 비동기식 업로드 파이프라인을 사용하여 텍스처나 메시를 업로드하고 있음을 알 수 있습니다.
AsyncUploadManager.ScheduleAsyncRead
, AsyncReadManager.ReadFile
및 Async.DirectTextureLoadBegin
프로파일러 마커AsyncRead
스레드의 활동이러한 활동이 관찰되지 않으면 Unity는 비동기식 업로드 파이프라인을 사용하지 않는 것입니다.
다음 프로파일러 마커는 Unity가 비동기식 업로드 파이프라인을 사용하고 있음을 나타내지 않습니다. Unity는 다음을 호출하여 비동기식 업로드 작업을 수행해야 하는지 확인합니다.
Initialization.AsyncUploadTimeSlicedUpdate
AsyncUploadManager.AsyncResourceUpload
AsyncUploadManager.ScheduleAsyncCommands
비동기식 업로드 파이프라인에 대해 다음의 설정을 지정할 수 있습니다. 동기식 업로드 파이프라인에는 이러한 설정을 적용할 수 없습니다.
Unity는 단일 링 버퍼를 다시 사용하여 텍스처 및 메시 데이터를 GPU로 스트리밍합니다. 이렇게 하면 필요한 메모리 할당 수가 줄어듭니다.
The Async Upload Buffer determines the size of this ring buffer. It has a minimum size of 2 megabytes, and a maximum size of 2047 megabytes.
Unity는 버퍼의 크기를 자동으로 조정하여 현재 로드 중인 최대 크기의 텍스처 또는 메시에 맞춥니다. Unity가 이러한 작업을 두 번 이상 수행해야 하는 경우 작업 속도가 느려질 수 있습니다. 기본 버퍼 크기보다 큰 여러 개의 텍스처를 로드하는 경우를 예로 들 수 있습니다. Unity가 버퍼 크기를 조정해야 하는 횟수를 줄이려면 로드할 것으로 예상되는 가장 큰 값으로 이 값을 설정하십시오. 이 값은 대개 씬에서 가장 큰 텍스처의 크기입니다.
이 값은 품질 설정 창에서 설정하거나 QualitySettings.asyncUploadBufferSize API를 사용하여 설정할 수 있습니다.
Async Upload Time Slice는 CPU가 텍스처 또는 메시 데이터를 GPU에 업로드하는 데 소비하는 시간(프레임당 밀리초 단위)입니다.
값이 클수록 GPU에서 데이터가 더 빨리 준비되지만, CPU가 해당 프레임 동안 업로드 작업에 더 많은 시간을 소비합니다. Unity는 GPU에 업로드하기 위해 버퍼에 대기 중인 데이터가 있을 때에만 이 시간을 업로드에 사용합니다. 대기 중인 데이터가 없는 경우 Unity가 이 시간을 다른 작업에 사용할 수 있습니다.
이 값은 품질 설정 창에서 설정하거나 QualitySettings.asyncUploadTimeSlice API를 사용하여 설정할 수 있습니다.
텍스처 및 메시 데이터를 비동기식으로 업로드하는 방법에 대한 자세한 내용은 Unity 블로그 포스트 로드 성능 최적화: 비동기식 업로드 파이프라인 이해를 참조하십시오.