Video Tutorials
Interface
Essentials
Advanced
Полезные советы
UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Working With Projects
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Lighting
Landscape Tool
Using Editor Tools for Specific Tasks
Extending Editor Functionality
Программирование
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Работа с контентом
Content Optimization
Materials
Art Samples
Tutorials

Асинхронная потоковая передача данных

Потоковая передача данных - это метод оптимизации, предназначенный для уменьшения скачков, вызванных загрузкой графических ресурсов. При использовании этого метода не все данные загружаются в оперативную память (RAM) сразу. Вместо этого загружаются только необходимые данные, а все остальные загружаются постепенно, по запросу.

Загрузка ресурсов выполняется и передается в GPU отдельными асинхронными потоками. После этого ресурсы синхронизируются и добавляются в виртуальную сцену на стороне CPU.

Вывод инструмента Microprofile

В UNIGINE асинхронная потоковая передача данных включена по умолчанию. Чтобы отключить асинхронную потоковую передачу данных , включите режим Forced в Streaming Settings в редакторе или с помощью консольной команды render_streaming_mode 1 . Режим Forced обеспечивает принудительную загрузку всех сеток и / или текстур, необходимых для каждого кадра одновременно (например, захват последовательностей кадров, предварительный просмотр узлов рендеринга, разогрев и т. Д.).

Система потоковой передачи обеспечивает асинхронную загрузку следующих данных в RAM:

Общую информацию о потоковых ресурсах можно получить с помощью консольной команды render_streaming_info .

Вывод render_streaming_info

Также можно распечатать список загруженных ресурсов и подробную информацию о них, используя консольную команду render_streaming_list .

Вывод render_streaming_list

Процедурно генерируемые объекты, такие как ObjectMeshClutter и ObjectGrass, генерируются в отдельном потоке, что значительно снижает затраты на производительность.

Общие настройки потоковой передачи#

Количество загружаемых / создаваемых графических ресурсов во время кадра ограничено параметром Render Budget. Его можно использовать, чтобы найти баланс между скоростью загрузки и производительностью.

Чтобы воспользоваться преимуществами многопоточности, установите максимальное количество потоков, используемых для потоковой передачи ресурсов, с помощью параметра консоли render_streaming_max_threads. Большее количество потоков приводит к более быстрой потоковой передаче, но может вызвать всплески в случае чрезмерного потребления ресурсов GPU.

Примечание
Для потоковой системы требуется драйвер GPU с поддержкой многопоточности.

По умолчанию элемент управления Memory Limit включен. При превышении указанного объема памяти выгружаются сетки и текстуры, которые на данный момент не требуются для рендеринга. Максимальный объем памяти определяется для сеток и текстур индивидуально с помощью параметров Meshes Memory Limit и Textures Memory Limit, значения указываются в процентах от общей памяти GPU.

Ограничения памяти и VRAM, занятые потоковыми ресурсами, доступны в инструменте Profiler

Графические ресурсы регулярно проверяются на предмет модификации с целью перезагрузки или удаления. Соответствующий интервал определяется параметром Destroy Duration.

Кэш текстур#

Система потоковой передачи использует кеш текстур, состоящий из минимизированных копий, созданных для всех текстур с определяемым пользователем разрешением и хранящихся в папке data/.cache_textures . Эти копии используются вместо оригиналов при загрузке.

Кеш текстур загружается при запуске движка и всегда остается в памяти после загрузки. Для обеспечения плавной загрузки и отрисовки ресурсов потоковые сущности имеют следующие приоритеты загрузки:

  1. Кеш текстур
  2. Геометрия
  3. Некэшированные текстуры (вызывают спайки, поскольку для них на лету создается кеш текстур; материалы с примененными некэшированными и выгруженными текстурами отображаются черным)
  4. Полноразмерные текстуры

Кэш текстур может быть предварительно загружен или загружен после данных геометрии, флаг Texture Cache Preload управляет приоритетом загрузки кеша текстур.

Примечание
Если в проекте нет кеша текстур, он будет сгенерирован для всех текстур при запуске движка, что приведет к резким скачкам и резкому увеличению времени загрузки (до нескольких минут).

По умолчанию файлы кэша текстур генерируются с разрешением 16x16, такое низкое разрешение текстур вызывает визуальные артефакты во время загрузки. Разрешение можно увеличить, установив параметр Texture Cache Resolution. Существующие файлы кеша следует удалить с помощью консольной команды render_streaming_textures_cache_destroy, после чего кеш текстуры будет автоматически сгенерирован с новым указанным разрешением.

Примечание
Имейте в виду, что более высокое разрешение кэша текстур требует больше видеопамяти.

Объем видеопамяти, занимаемый в данный момент кешем текстур, доступен в инструменте Performance Profiler.

Примечание
Поскольку все текстуры в проекте кэшируются независимо от того, используются они или нет, разумно использовать инструмент Cleaner для удаления неиспользуемых ресурсов и, таким образом, уменьшения потребления видеопамяти.

Консольные команды 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.
Последнее обновление: 30.09.2020