Асинхронная потоковая передача данных
Потоковая передача данных - это метод оптимизации, предназначенный для уменьшения скачков, вызванных загрузкой графических ресурсов. При использовании этого метода не все данные загружаются в оперативную память (RAM) сразу. Вместо этого загружаются только необходимые данные, а все остальные загружаются постепенно, по запросу.
Загрузка ресурсов выполняется и передается в GPU отдельными асинхронными потоками. После этого ресурсы синхронизируются и добавляются в виртуальную сцену на стороне CPU.
В UNIGINE асинхронная потоковая передача данных включена по умолчанию. Чтобы отключить асинхронную потоковую передачу данных , включите режим Forced в Streaming Settings в редакторе или с помощью консольной команды render_streaming_mode 1 . Режим Forced обеспечивает принудительную загрузку всех сеток и / или текстур, необходимых для каждого кадра одновременно (например, захват последовательностей кадров, предварительный просмотр узлов рендеринга, разогрев и т. Д.).
Система потоковой передачи обеспечивает асинхронную загрузку следующих данных в RAM:
- Все текстуры исполняемые файлы и текстуры с включенной опцией Unchanged, включая cubemaps , воксельные карты зонда и карты теней запеченные тени .
- Меши из объектов ObjectMeshStatic, ObjectMeshClutter и ObjectMeshCluster.
Общую информацию о потоковых ресурсах можно получить с помощью консольной команды render_streaming_info .
Также можно распечатать список загруженных ресурсов и подробную информацию о них, используя консольную команду render_streaming_list .
Процедурно генерируемые объекты, такие как ObjectMeshClutter и ObjectGrass, генерируются в отдельном потоке, что значительно снижает затраты на производительность.
Общие настройки потоковой передачи#
Количество загружаемых / создаваемых графических ресурсов во время кадра ограничено параметром Render Budget. Его можно использовать, чтобы найти баланс между скоростью загрузки и производительностью.
Чтобы воспользоваться преимуществами многопоточности, установите максимальное количество потоков, используемых для потоковой передачи ресурсов, с помощью параметра консоли render_streaming_max_threads. Большее количество потоков приводит к более быстрой потоковой передаче, но может вызвать всплески в случае чрезмерного потребления ресурсов GPU.
По умолчанию элемент управления Memory Limit включен. При превышении указанного объема памяти выгружаются сетки и текстуры, которые на данный момент не требуются для рендеринга. Максимальный объем памяти определяется для сеток и текстур индивидуально с помощью параметров Meshes Memory Limit и Textures Memory Limit, значения указываются в процентах от общей памяти GPU.
Графические ресурсы регулярно проверяются на предмет модификации с целью перезагрузки или удаления. Соответствующий интервал определяется параметром Destroy Duration.
Кэш текстур#
Система потоковой передачи использует кеш текстур, состоящий из минимизированных копий, созданных для всех текстур с определяемым пользователем разрешением и хранящихся в папке data/.cache_textures . Эти копии используются вместо оригиналов при загрузке.
Кеш текстур загружается при запуске движка и всегда остается в памяти после загрузки. Для обеспечения плавной загрузки и отрисовки ресурсов потоковые сущности имеют следующие приоритеты загрузки:
- Кеш текстур
- Геометрия
- Некэшированные текстуры (вызывают спайки, поскольку для них на лету создается кеш текстур; материалы с примененными некэшированными и выгруженными текстурами отображаются черным)
- Полноразмерные текстуры
Кэш текстур может быть предварительно загружен или загружен после данных геометрии, флаг Texture Cache Preload управляет приоритетом загрузки кеша текстур.
По умолчанию файлы кэша текстур генерируются с разрешением 16x16, такое низкое разрешение текстур вызывает визуальные артефакты во время загрузки. Разрешение можно увеличить, установив параметр Texture Cache Resolution. Существующие файлы кеша следует удалить с помощью консольной команды render_streaming_textures_cache_destroy, после чего кеш текстуры будет автоматически сгенерирован с новым указанным разрешением.
Объем видеопамяти, занимаемый в данный момент кешем текстур, доступен в инструменте Performance Profiler.
Консольные команды render_streaming_textures_cache_load и render_streaming_textures_cache_unload позволяют управлять загрузкой кеша текстур. Например. после загрузки полноразмерных текстур кеш текстур может быть выгружен из видеопамяти для повышения производительности.
Настройки OpenGL#
Настройки и рабочий процесс для OpenGL API немного отличаются от DirectX API.
В OpenGL система потоковой передачи данных задействует два промежуточных буфера для передачи данных между CPU и новым ресурсом:
- Async Buffer используется для потоковой передачи сетки и текстур
- Async Buffer Indices используется для потоковой передачи индексов вершин мешей
размер буфера Async Buffer должен соответствовать размеру самого большого ресурса (сетка / текстура), в противном случае, в случае большего ресурса, размер буфера будет изменен, вызывая скачок.
Механизм синхронизации буфера включается, если для параметра Async Buffer Synchronization установлено значение 1 . Таким образом, асинхронные буферы создаются только один раз, а затем синхронизируются, сокращая время на выделение и освобождение памяти. Когда синхронизация отключена, и Async Buffer, и Async Buffer Indices создаются заново для каждого нового ресурса. Это уменьшает количество синхронизаций буфера, но увеличивает количество выделений памяти.
Иногда (в зависимости от используемого оборудования / драйвера, например, когда на основной поток влияют примитивы синхронизации в других потоках) выделение памяти может быть быстрее, чем синхронизация; в таких случаях, когда потоковая передача становится неприемлемо медленной, рекомендуется отключить синхронизацию буфера.
Есть некоторые известные проблемы и обходные пути для некоторых аппаратных средств / программного обеспечения драйверов:
- The Mesa 3D GL: для повышения производительности необходимо отключить синхронизацию буфера (gl_async_buffer_synchronization 0). Требуются обновленные драйверы открытой графики .
- Intel: необходимо принять во внимание, что объем VRAM ограничен ОС половиной от RAM.