Version: 2023.1
언어: 한국어
Emscripten용 WebGL 네이티브 플러그인
WebGL의 캐시 동작

Unity WebGL의 메모리

Unity WebGL의 메모리 제약으로 인해 실행하는 콘텐츠의 복잡도가 제한될 수 있습니다.

WebGL 콘텐츠는 브라우저에서 실행됩니다. 브라우저는 애플리케이션이 콘텐츠를 실행하는 데 필요한 메모리 공간에 메모리를 할당합니다. 사용 가능한 메모리 양은 다음에 따라 다릅니다.

  • 사용하는 기기
  • 사용하는 운영체제
  • 사용하는 브라우저, 32 또는 64 프로세서에서 실행되는지 여부
  • 브라우저의 JavaScript 엔진이 코드를 파싱하는 데 필요한 메모리 양
  • 브라우저가 각 탭에 대해 별도의 프로세스를 사용하는지, 또는 콘텐츠가 다른 모든 열린 탭과 메모리 공간을 공유해야 하는지 여부

참고:WebGL 메모리와 관련된 보안 위험성에 관한 내용은 보안 및 메모리 리소스를 참조하십시오.

Unity WebGL에서 메모리 사용

다음 Unity WebGL 콘텐츠 영역은 브라우저에 상당한 양의 메모리를 할당해야 합니다.

Unity 힙

Unity는 메모리 힙을 사용하여 모든 Unity 엔진 런타임 오브젝트를 저장합니다.여기에는 관리되는 오브젝트, 네이티브 오브젝트, 로드된 에셋, 씬, 셰이더가 포함됩니다.이는 Unity 플레이어가 다른 플랫폼에서 사용하는 메모리와 유사합니다.

Unity 힙은 할당된 메모리의 연속적인 블록입니다.Unity는 애플리케이션에서 필요한 대로 힙의 크기를 자동으로 조정할 수 있도록 지원합니다.힙 크기는 애플리케이션이 실행됨에 따라 확장되며, 최대 2GB까지 확장할 수 있습니다.Unity는 이 메모리 힙을 메모리 오브젝트로 생성합니다.메모리 오브젝트의 버퍼 프로퍼티는 WebAssembly 코드가 액세스한 메모리의 원시 바이트를 보유하는 크기 조정 가능한 ArrayBuffer입니다.

브라우저가 주소 공간에 연속된 메모리 블록을 할당하지 못하는 경우 힙의 크기 자동 조정으로 인해 애플리케이션에 크래시가 발생할 수 있습니다.이러한 이유로 Unity 힙 크기를 최대한 작게 유지하는 것이 중요합니다.따라서 애플리케이션의 메모리 사용량을 계획할 때 염두에 두어야 합니다.Unity 힙의 크기를 테스트하려는 경우 프로파일러를 사용하여 메모리 블록의 콘텐츠를 프로파일링하면 됩니다.

You can control the initial size and growth of the heap by using the Memory Growth Mode options in the WebGL Player Settings. The default options are configured to work well for all desktop use cases. However, for mobile browsers you need to use the advanced tuning options. For mobile browsers, it’s recommended to configure the Initial Memory Size to the typical heap usage of the application.

에셋 데이터

Unity WebGL 빌드를 생성하면 Unity는 .data 파일을 생성합니다.여기에는 애플리케이션 실행에 필요한 모든 씬과 에셋이 포함됩니다.Unity WebGL은 실제 파일 시스템에 액세스하지 못하므로 가상 메모리 파일 시스템을 생성하고 브라우저는 여기에서 .data 파일을 압축 해제합니다.Emscripten 프레임워크(JavaScript)는 브라우저 메모리 공간에 이 메모리 파일 시스템을 할당합니다.콘텐츠가 실행되는 동안 브라우저 메모리는 데이터를 압축되지 않은 상태로 유지합니다.짧은 다운로드 시간과 적은 메모리 사용량을 유지하려면 이 압축되지 않은 데이터를 최대한 적게 유지하십시오.

메모리 사용을 줄이기 위해 에셋 데이터를 에셋 번들에 압축해도 됩니다.에셋 번들은 에셋 다운로드를 완벽하게 컨트롤할 수 있습니다.애플리케이션이 에셋을 다운로드하는 시기와 런타임이 에셋을 언로드하는 시기를 컨트롤할 수 있습니다.미사용 에셋을 언로드하여 메모리를 확보할 수 있습니다.

AssetBundles는 Unity 힙에 바로 다운로드되므로 브라우저에서 추가 할당이 발생하지 않습니다.

Data Caching을 활성화하면 사용자 머신에서 콘텐츠의 에셋 데이터를 자동으로 캐싱할 수 있습니다.즉, 나중에 실행할 때 해당 데이터를 다시 다운로드할 필요가 없습니다.Unity WebGL 로더는 IndexedDB API로 데이터 캐싱을 구현합니다.이 옵션을 사용하면 브라우저가 기본적으로 캐싱하기에는 너무 큰 파일을 캐싱할 수 있습니다.

데이터 캐싱을 활성화하면 브라우저는 사용자의 머신에 애플리케이션 데이터를 저장할 수 있습니다.브라우저는 캐시에 저장할 수 있는 양과 캐싱할 수 있는 최대 파일 크기를 제한하는 경우가 많습니다.이로 인해 애플리케이션이 원활하게 실행되기에 충분하지 않은 경우가 많습니다.Unity WebGL 로더는 IndexedDB API로 캐싱하여 브라우저 캐시 대신 IndexedDB에 데이터를 저장할 수 있습니다.

Data Caching 옵션을 활성화하려면 File > Build Settings > Player Settings > Publishing Settings로 이동하십시오.

가비지 컬렉션

가비지 컬렉션은 미사용 메모리를 찾아서 공간을 확보하는 프로세스입니다.가비지 컬렉터는 미사용 메모리를 수집한 후 Unity 힙 안에 다시 할당합니다.그런 다음 가비지 컬렉터는 스택을 검사하고 로드된 오브젝트 레퍼런스를 등록합니다.가비지 컬렉터가 더 이상 참조하지 않는 오브젝트를 찾으면 해당 오브젝트에서 사용한 메모리를 확보합니다.

Unity 가비지 컬렉션 작동 방식에 대한 개요는 자동 메모리 관리를 참조하십시오.WebGL 가비지 컬렉션은 스택이 비어 있을 때 실행됩니다.스택은 Unity 힙의 일부이지만, 힙 자체는 아닙니다.JavaScript에서는 디버깅할 수 없으므로 가비지 컬렉터는 스택이 비어 있는 경우에만 WebGL에서 실행됩니다.이는 보통 프레임이 끝날 때마다 실행됩니다.

대부분의 다른 플랫폼에서는 컬렉터가 스택 검사를 위해 실행 중인 모든 스레드를 일시 중지하는 가비지 컬렉션 프로세스가 다릅니다.Unity 프로파일러를 사용하여 가비지 컬렉션 프로세스를 디버깅할 수 있습니다.

가비지 컬렉터는 메인 스레드에서 실행됩니다.즉, 오래 실행되는 루프가 있는 경우 다음 코드를 WebGL에서 실행하면 루프 반복 간에 가비지 컬렉터를 실행할 기회를 얻지 못해 실패할 수 있습니다.즉, 중간 문자열 오브젝트가 사용하는 메모리를 가비지 컬렉터가 확보할 수 없어 Unity 힙의 메모리가 부족해집니다.

string hugeString = "";
 
for (int i = 0; i < 100000; i++)
 
{
 
 hugeString += "foo";
 
}

추가 리소스

Emscripten용 WebGL 네이티브 플러그인
WebGL의 캐시 동작