Unity может загружать текстуру и сеткуосновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
Просматривать в Словарь данные с диска и загружать их на GPU двумя разными способами : синхронно или асинхронно. Эти два процесса называются конвейером синхронной загрузки и конвейером асинхронной загрузки.
Когда Unity использует конвейер синхронной загрузки, он не может выполнять другие задачи во время загрузки и выгрузки данных. Это может вызвать видимые паузы в вашем приложении. Когда Unity использует конвейер асинхронной загрузки, он может выполнять другие задачи во время загрузки и выгрузки данных в фоновом режиме.
Если текстура или сетка подходят для конвейера асинхронной загрузки, Unity автоматически использует конвейер асинхронной загрузки. Если текстура или сетка не подходят для конвейера асинхронной загрузки, Unity автоматически использует конвейер синхронной загрузки.
Как это работает
Основное различие между синхронным и асинхронным конвейерами загрузки заключается в том, что Unity сохраняет данные во время сборки, что влияет на то, как Unity загружает их во время выполнения.
В конвейере синхронной загрузки Unity должна загружать как метаданные (данные заголовка), так и данные текселей или вершин (двоичные данные) для текстуры или сетки в одном кадре. В конвейере асинхронной загрузки Unity должен загружать только данные заголовка в одном кадре и может передавать двоичные данные на графический процессор в последующих кадрах.
В конвейере синхронной загрузки:
- Во время сборки Unity записывает и заголовок, и двоичные данные для сетки или текстуры в один и тот же файл .res.
- Во время выполнения, когда приложению требуется текстура или сетка, Unity загружает как данные заголовка, так и двоичные данные для этой текстуры или сетки из файла .res в память. Когда все данные находятся в памяти, Unity загружает двоичные данные из памяти в графический процессор. Операции загрузки и выгрузки происходят в основном в основном потоке в одном кадре.
В конвейере асинхронной загрузки:
- Во время сборки Unity записывает данные заголовка в файл .res, а двоичные данные — в отдельный файл .resS.
- Во время выполнения, когда приложению требуется текстура или сетка, Unity загружает заголовок из файла .res в память. Когда заголовок находится в памяти, Unity затем передает двоичные данные из файла .resS в графический процессор, используя кольцевой буфер фиксированного размера. Unity передает двоичные данные с помощью нескольких потоков в течение нескольких кадров. Обратите внимание, что на некоторых консольных платформах, где Unity уже знает аппаратное обеспечение графического процессора, Unity пропускает кольцевой буфер и загружается прямо в память графического процессора.
Приемлемость данных о текстурах и сетках
Текстура подходит для конвейера асинхронной загрузки, если выполняются следующие условия:
- Текстура недоступна для чтения/записи.
- Текстуры нет в папке "Ресурсы".
- Если целевым объектом сборки является Android, LZ4 сжатиеметод хранения данных, уменьшающий объем требуемого дискового пространства. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
See in Словарь включен в настройках сборки проекта.
Обратите внимание: если вы загружаете текстуру с помощью LoadImage(byte[] data)
, это заставляет Unity использовать конвейер синхронной загрузки, даже если выполняются вышеуказанные условия.
Сетка подходит для конвейера асинхронной загрузки, если выполняются следующие условия:
- Сетка недоступна для чтения/записи.
- Сетка отсутствует в папке "Ресурсы".
- В сетке нет BlendShapes.
- Unity не применила динамическую пакетную обработкуавтоматический процесс Unity, который пытается визуализировать несколько сеток, как если бы они были одной сеткой для оптимизированная графическая производительность. Этот метод преобразует все вершины GameObject на ЦП и группирует множество похожих вершин вместе. Подробнее
См. в Словарь сетку, либо потому, что сетка не подходит для динамической пакетной обработки или потому что динамическая пакетная обработка отключена. Дополнительную информацию о динамической пакетной обработке см. в разделе Отрисовка пакетной обработки вызовов. - Данные вершины/индекса сетки не нужны для Системы частицКомпонента, который имитирует текучие объекты, такие как жидкости, облака и пламя путем создания и анимации большого количества небольших 2D-изображений в сцене. Подробнее
См. в Словарь, ЛандшафтПейзаж в вашей сцене. Игровой объект Terrain добавляет в вашу сцену большую плоскую плоскость, и вы можете использовать окно Terrain Inspector для создания подробного ландшафта. Подробнее
См. в Словарь или в сетке КоллайдерНевидимая форма, используемая для обработки физических столкновений объекта. Коллайдер не обязательно должен быть точно такой же формы, как сетка объекта — грубое приближение часто бывает более эффективным и неразличимым в игровом процессе. Подробнее
См. в Словарь. - Сетка не имеет утяжеления костей.
- Сетка топология не соответствует quadsПримитивный объект, напоминающий плоскость, но его ребра имеют длину всего одну единицу, он использует только 4 вершины, а поверхность ориентирована в плоскости XY локальной координатное пространство. Подробнее
См. в Словарь. - Для параметра meshCompression для объекта сетки установлено значение Выкл.. Если целью сборки является Android, сжатие LZ4 включается в настройках сборки проекта.
Во всех остальных случаях Unity загружает текстуры и сетки синхронно.
Как определить, какой конвейер загрузки использует Unity
Вы можете использовать окно Profiler, которое поможет вам оптимизировать игру. . Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. в Словарь или другом инструменте профилирования, чтобы определить, когда Unity использует конвейер асинхронной загрузки, наблюдая за активностью потока и маркерами профилировщикапомещенными в код для описания события ЦП или ГП, которое затем отображается в окне Unity Profiler. Добавляется в код Unity по умолчанию, или вы можете использовать ProfilerMarker API для добавления собственных маркеров. Подробнее
См. в Словарь.
Следующее указывает на то, что Unity использует конвейер асинхронной загрузки для загрузки текстур или мешей:
AsyncUploadManager.ScheduleAsyncRead
,AsyncReadManager.ReadFile
иAsync.DirectTextureLoadBegin
маркеры профилировщика.- Активность в потоке
AsyncRead
.
Если вы не видите это действие, Unity не использует конвейер асинхронной загрузки.
Обратите внимание, что следующие маркеры профилировщика не указывают на то, что Unity использует конвейер асинхронной загрузки. Unity вызывает их, чтобы проверить, нужно ли выполнять какую-либо асинхронную загрузку:
Initialization.AsyncUploadTimeSlicedUpdate
AsyncUploadManager.AsyncResourceUpload
AsyncUploadManager.ScheduleAsyncCommands
Настройка конвейера асинхронной загрузки
Эти параметры можно настроить для конвейера асинхронной загрузки. Обратите внимание, что вы не можете настраивать параметры конвейера синхронной загрузки.
Асинхронный буфер загрузки
Unity повторно использует один кольцевой буфер для потоковой передачи текстур и данных сетки на графический процессор. Это уменьшает количество требуемых выделений памяти.
Буфер асинхронной загрузки определяет размер этого кольцевого буфера в мегабайтах. Он имеет минимальный размер 2 и максимальный размер 512.
Unity автоматически изменяет размер буфера, чтобы он соответствовал самой большой загружаемой в данный момент текстуре или сетке. Это может быть медленной операцией, особенно если Unity приходится выполнять ее более одного раза; например, если вы загружаете много текстур, размер которых превышает размер буфера по умолчанию. Чтобы уменьшить количество раз, когда Unity должна изменять размер буфера, установите это значение так, чтобы оно соответствовало максимальному значению, которое вы ожидаете загрузить. Обычно это самая большая текстура в СценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь.
Это значение можно настроить в окне настроек качества или с помощью API QualitySettings.asyncUploadBufferSize.
Временной интервал асинхронной загрузки
Квант времени асинхронной загрузки — это количество времени, которое ЦП тратит на загрузку данных текстуры или сетки в графический процессор, в миллисекундах на кадр.
Большее значение означает, что данные будут готовы на графическом процессоре раньше, но ЦП будет тратить больше времени на операции загрузки в этих кадрах. Обратите внимание, что Unity использует это время для загрузки только в том случае, если в буфере есть данные, ожидающие загрузки в GPU; если ожидающих данных нет, Unity может использовать это время для других операций.
Это значение можно настроить в окне настроек качества или с помощью API QualitySettings.asyncUploadTimeSlice.
Дополнительная информация
Дополнительную информацию об асинхронной загрузке данных текстуры и сетки см. в записи блога Unity Оптимизация производительности загрузки: понимание конвейера асинхронной загрузки.