Unity 웹의 메모리 제약으로 인해 사용자가 실행하는 콘텐츠의 복잡성이 제한될 수 있습니다.
웹 콘텐츠는 브라우저에서 실행됩니다. 브라우저는 애플리케이션이 콘텐츠를 실행하는 데 필요한 메모리를 메모리 공간에 할당합니다. 사용 가능한 메모리의 양은 다음에 따라 다릅니다.
참고: 웹 메모리 관련 보안 위험에 대한 자세한 내용은 보안 및 메모리 리소스를 참조하십시오.
Unity 웹 콘텐츠의 다음과 같은 부분에 따라 브라우저에서 상당한 양의 메모리를 할당해야 합니다.
Unity는 메모리 힙을 사용하여 모든 Unity 엔진 런타임 오브젝트를 저장합니다.여기에는 관리되는 오브젝트, 네이티브 오브젝트, 로드된 에셋, 씬, 셰이더가 포함됩니다.이는 Unity 플레이어가 다른 플랫폼에서 사용하는 메모리와 유사합니다.
Unity 힙은 할당된 메모리의 연속적인 블록입니다.Unity는 애플리케이션에서 필요한 대로 힙의 크기를 자동으로 조정할 수 있도록 지원합니다.힙 크기는 애플리케이션이 실행됨에 따라 확장되며, 최대 2GB까지 확장할 수 있습니다.Unity는 이 메모리 힙을 메모리 오브젝트로 생성합니다.메모리 오브젝트의 버퍼 프로퍼티는 WebAssembly 코드가 액세스한 메모리의 원시 바이트를 보유하는 크기 조정 가능한 ArrayBuffer입니다.
브라우저가 주소 공간에 연속된 메모리 블록을 할당하지 못하는 경우 힙의 크기 자동 조정으로 인해 애플리케이션에 크래시가 발생할 수 있습니다.이러한 이유로 Unity 힙 크기를 최대한 작게 유지하는 것이 중요합니다.따라서 애플리케이션의 메모리 사용량을 계획할 때 염두에 두어야 합니다.Unity 힙의 크기를 테스트하려는 경우 프로파일러를 사용하여 메모리 블록의 콘텐츠를 프로파일링하면 됩니다.
웹 플레이어 설정의 Memory Growth Mode 옵션을 사용하여 힙의 초기 크기와 증가를 제어할 수 있습니다. 기본 옵션은 모든 데스크톱 사용 사례에서 원활하게 작동하도록 설정되어 있습니다. 하지만 모바일 브라우저의 경우 고급 조정 옵션을 사용해야 합니다. 모바일 브라우저의 경우 Initial Memory Size를 애플리케이션의 일반적인 힙 사용량에 맞게 설정하는 것이 좋습니다.
Unity 웹 빌드를 생성하면 Unity는 .data
파일을 생성합니다. 여기에는 애플리케이션을 실행하는 데 필요한 모든 씬과 에셋이 포함됩니다. Unity 웹은 실제 파일 시스템에 액세스할 수 없으므로 가상 메모리 파일 시스템을 생성하고, 브라우저는 여기에 .data
파일을 언패킹합니다. Emscripten 프레임워크(JavaScript)는 이 메모리 파일 시스템을 브라우저 메모리 공간에 할당합니다. 콘텐츠가 실행되는 동안 브라우저 메모리는 압축되지 않은 데이터를 유지합니다. 다운로드 시간과 메모리 사용량을 모두 낮추려면 압축되지 않은 데이터를 가능한 한 작게 유지합니다.
메모리 사용을 줄이기 위해 에셋 데이터를 에셋 번들에 압축해도 됩니다.에셋 번들은 에셋 다운로드를 완벽하게 컨트롤할 수 있습니다.애플리케이션이 에셋을 다운로드하는 시기와 런타임이 에셋을 언로드하는 시기를 컨트롤할 수 있습니다.미사용 에셋을 언로드하여 메모리를 확보할 수 있습니다.
AssetBundles
는 Unity 힙에 바로 다운로드되므로 브라우저에서 추가 할당이 발생하지 않습니다.
Data Caching을 활성화하면 콘텐츠의 에셋 데이터를 사용자 컴퓨터에 자동으로 캐시할 수 있습니다. 이렇게 하면 그 다음 실행 시 데이터를 다시 다운로드할 필요가 없습니다. Unity 웹 로더는 IndexedDB API로 데이터 캐시를 구현합니다. 이 옵션을 사용하면 브라우저가 기본적으로 캐시하기에는 너무 큰 파일을 캐시할 수 있습니다.
데이터 캐시를 사용하면 브라우저가 사용자 컴퓨터에 애플리케이션 데이터를 저장할 수 있습니다. 브라우저는 캐시에 저장할 수 있는 양과 캐시할 수 있는 최대 파일 크기를 제한하는 경우가 많습니다. 많은 경우 이는 애플리케이션을 원활하게 실행하기에 충분하지 않습니다. IndexedDB
API를 사용하는 Unity 웹 로더 캐시는 Unity가 데이터를 브라우저 캐시 대신 IndexedDB에 저장하도록 합니다.
Data Caching 옵션을 활성화하려면 File > Build Settings > Player Settings > Publishing Settings로 이동하십시오.
가비지 컬렉션은 미사용 메모리를 찾아서 공간을 확보하는 프로세스입니다.가비지 컬렉터는 미사용 메모리를 수집한 후 Unity 힙 안에 다시 할당합니다.그런 다음 가비지 컬렉터는 스택을 검사하고 로드된 오브젝트 레퍼런스를 등록합니다.가비지 컬렉터가 더 이상 참조하지 않는 오브젝트를 찾으면 해당 오브젝트에서 사용한 메모리를 확보합니다.
Unity 가비지 컬렉션의 작동 방식에 대한 개요는 자동 메모리 관리를 참조하십시오. 웹 가비지 컬렉션은 스택이 비어 있을 때 실행됩니다. 스택은 Unity 힙의 일부이지만 힙 자체는 아닙니다. JavaScript에서는 디버깅할 수 없으므로 가비지 컬렉터는 스택이 비어 있는 경우에만 웹에서 실행됩니다. 이는 현재 프레임마다 한 번씩 발생합니다.
대부분의 다른 플랫폼에서는 컬렉터가 스택 검사를 위해 실행 중인 모든 스레드를 일시 중지하는 가비지 컬렉션 프로세스가 다릅니다.Unity 프로파일러를 사용하여 가비지 컬렉션 프로세스를 디버깅할 수 있습니다.
가비지 컬렉터는 메인 스레드에서 실행됩니다. 장기적으로 실행되는 루프가 있는 경우, 다음 코드를 웹에서 실행하면 루프 반복 사이에 가비지 컬렉터가 실행될 기회를 얻지 못하여 실패할 수 있습니다. 따라서 가비지 컬렉터가 중간 문자열 오브젝트가 사용하는 메모리를 확보하지 못해 Unity 힙의 메모리가 부족해집니다.
string hugeString = "";
for (int i = 0; i < 100000; i++)
{
hugeString += "foo";
}