Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Ограничения памяти в Unity WebGLJavaScript API, который отображает 2D- и 3D-графику в веб-браузере. Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
См. в Словарь
может ограничить сложность контента, который вы можете запускать.

Содержимое WebGL запускается в браузере. Браузер выделяет память в своем пространстве памяти, которая необходима вашему приложению для запуска вашего контента. Объем доступной памяти зависит от:

  • Какое устройство вы используете
  • Какую операционную систему вы используете
  • Какой браузер вы используете и на каком процессоре он работает: 32-й или 64-й.
  • Сколько памяти требуется движку JavaScript браузера для синтаксического анализа вашего кода
  • Независимо от того, использует ли браузер отдельные процессы для каждой вкладки, или вашему содержимому необходимо совместное пространство памяти со всеми другими открытыми вкладками.

Есть несколько областей, в которых содержимое Unity WebGL требует от браузера выделения значительных объемов памяти.

Куча Unity

Unity использует кучу памяти для хранения всех объектов среды выполнения Unity. К ним относятся управляемые и собственные объекты, загруженные активы, СценыСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь
и шейдерыПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь
. Это похоже на память, которую используют проигрыватели Unity на любой другой платформе.

Куча Unity — это непрерывный блок выделенной памяти. Unity поддерживает автоматическое изменение размера кучи в соответствии с потребностями приложения. Размер кучи увеличивается по мере запуска приложения и может увеличиваться до 2 ГБ. Unity создает эту кучу памяти как объект памяти. Свойство буфера объекта Memory представляет собой массив ArrayBuffer с изменяемым размером, который содержит необработанные байты памяти, к которым обращается код WebAssembly.

Автоматическое изменение размера кучи может привести к сбою приложения, если браузеру не удастся выделить непрерывный блок памяти в адресном пространстве. По этой причине важно, чтобы размер кучи Unity был как можно меньше. Поэтому будьте внимательны при планировании использования памяти вашим приложением. Если вы хотите проверить размер кучи Unity, вы можете использовать Profiler Окно, которое поможет вам оптимизировать вашу игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. в Словарь
профилирование содержимого блока памяти.

Данные объекта

При создании сборки Unity WebGL Unity создает файл .data. Он содержит все сцены и активы, необходимые приложению для запуска. Поскольку Unity WebGL не имеет доступа к реальной файловой системе, она создает файловую систему виртуальной памяти, и браузер распаковывает здесь файл .data. Платформа Emscipten (JavaScript) выделяет эту файловую систему памяти в пространстве памяти браузера. Пока ваш контент работает, память браузера хранит несжатые данные. Чтобы сократить время загрузки и использование памяти, старайтесь, чтобы несжатые данные были как можно меньше.

Чтобы сократить использование памяти, вы можете упаковать данные вашего объекта в AssetBundles. AssetBundles позволяют вам полностью контролировать загрузку ваших активов. Это означает, что вы можете контролировать, когда ваше приложение загружает актив, а когда среда выполнения выгружает его. Выгрузка неиспользуемых ресурсов освобождает память.

AssetBundles загружаются непосредственно в кучу Unity, поэтому браузер не выделяет дополнительное пространство.

Включите Кэширование данных для автоматического кэширования данных объекта в вашем контенте на компьютере пользователя. Это означает, что вам не нужно повторно загружать эти данные во время последующих запусков. Загрузчик Unity WebGL реализует кэширование данных с помощью IndexedDB API. Этот параметр позволяет кэшировать файлы, которые слишком велики для браузера, чтобы кэшировать их собственными средствами.

Кэширование данных позволяет браузеру сохранять данные приложений на компьютере пользователя. Браузеры часто ограничивают объем, который вы можете хранить в своем кеше, и максимальный размер файла, который можно кэшировать. Часто этого недостаточно для бесперебойной работы приложения. Поэтому загрузчик Unity WebGL реализует кэширование даты с API IndexedDB. Вместо того, чтобы хранить содержимое в кеше браузера, Unity хранит данные в IndexedDB.

Чтобы включить параметр кэширования данных, выберите Файл > Настройки сборки > Настройки проигрывателя > Настройки публикации.

Заголовок HTTP с большим выделением

Ваш сервер может создавать Large-Allocation HTTP-заголовок для вашего контента. Это сообщает поддерживаемым браузерам (в настоящее время только Mozilla Firefox) о ваших потребностях в памяти. Эта информация позволяет поддерживаемому браузеру запускать новый процесс, используя нефрагментированное пространство памяти. Браузер также может выполнять дополнительные действия, чтобы обеспечить успешное выделение больших объемов памяти. Это может решить проблемы, когда браузеру не хватает памяти при попытке выделить кучу Unity. Это особенно важно в 32-разрядных браузерах.

Соображения по сборке мусора

Сборка мусора — это процесс обнаружения и освобождения неиспользуемой памяти. Как только сборщик мусора соберет неиспользуемую память, он перераспределит ее внутри кучи Unity.

Общие сведения о том, как работает сборка мусора Unity, см. в разделе Автоматическое управление памятью. Сборка мусора WebGL запускается, когда стек пуст. Стек является частью кучи Unity, но не самой кучи. Обычно это происходит после каждого кадра. Это отличается от процесса сборки мусора на других платформах, где сборщик приостанавливает все запущенные потоки, чтобы он мог проверить стек. Это невозможно в JavaScript. Вы можете отладить процесс сборки мусора с помощью Unity Profiler.

На большинстве других платформ сборка мусора приостанавливает все запущенные потоки. Затем сборщик мусора проверит их стеки и зарегистрирует загруженные ссылки на объекты. В настоящее время это невозможно в JavaScript. По этой причине сборщик мусора будет работать в WebGL только в тех случаях, когда стек пуст. В настоящее время это происходит один раз после каждого кадра.

В связи с этим следующий код не будет работать в WebGL. Это связано с тем, что у сборщика нет возможности запустить сборщик мусора между итерациями цикла. Это означает, что сборщик мусора не может освободить память, которую используют промежуточные строковые объекты, и, скорее всего, закончится память в куче Unity.

string hugeString = ""; for (int i = 0; i < 100000; i++) { hugeString += "foo"; }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3