This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
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
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы

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

Data streaming is an optimization technique intended to reduce spikes caused by loading graphic resources and compiling shaders. With this technique, not all the data is loaded into memory at once. Instead, only the required data is loaded, and the rest is loaded progressively on demand. Потоковая передача данных — это метод оптимизации, предназначенный для уменьшения скачков, вызванных загрузкой графических ресурсов и компиляцией шейдеров. При использовании этого метода не все данные загружаются в оперативную память (RAM) сразу. Вместо этого загружаются только необходимые данные, а все остальные загружаются постепенно, по запросу.

Resource loading is performed and transferred to the GPU in separate asynchronous threads. After that, resources are synchronized and added to the virtual scene on the CPU side.Ресурсы загружаются и передаются в GPU отдельными асинхронными потоками. После этого ресурсы синхронизируются и добавляются в виртуальную сцену на стороне CPU.

The output of the Microprofile tool. Вывод инструмента Microprofile

In UNIGINE, asynchronous data streaming is enabled by default. You can disable asynchronous data streaming in UnigineEditor or via the console:В UNIGINE асинхронная потоковая передача данных включена по умолчанию. Вы можете отключить асинхронную потоковую передачу данных в UnigineEditor или через консоль:

  • In UnigineEditor, open the Settings window and go to the Streaming section. Here you can switch the streaming mode for textures and/or meshes.В UnigineEditor откройте окно Settings и перейдите в раздел Streaming. Здесь вы можете переключить режим потоковой передачи текстур и/или мешей.
  • In the console, run the corresponding commands that switch the streaming mode for textures and/or meshes.В консоли запустите соответствующие команды, которые переключают режим потоковой передачи текстур и/или мешей.

There are two main streaming modes — asynchronous (Async) and forced (Force). The Force mode ensures force-loading of all resources required for each frame simultaneously (e.g., grabbing frame sequences, rendering node previews, warmup, etc.).Существует два основных режима потоковой передачи — асинхронный (Async) и принудительный (Force). Режим Force обеспечивает принудительную загрузку всех ресурсов, необходимых для каждого кадра одновременно (например, захват последовательностей кадров, рендеринг предварительного просмотра нод, прогрев и т.д.).

Примечание
The Force mode may cause freezes, so use it only if you are sure that the resources in your world fit into the available memory.Режим Force может привести к зависанию, поэтому используйте его только в том случае, если вы уверены, что ресурсы в вашем мире помещаются в доступную память.

For meshes, there is an additional All mode that disables mesh streaming and provides loading of all meshes available in the project on the application start-up. This mode is good for small projects with few meshes.Для мешей существует дополнительный режим All, который отключает потоковую передачу меша и обеспечивает загрузку всех мешей, доступных в проекте, при запуске приложения. Этот режим хорош для небольших проектов с небольшим количеством мешей.

The streaming system provides asynchronous loading of the following data to RAM: Система потоковой передачи обеспечивает асинхронную загрузку следующих данных в RAM:

Procedurally generated objects such as ObjectMeshClutter are generated in a separate thread, significantly reducing performance costs.Процедурно сгенерированные объекты, такие как ObjectMeshClutter, генерируются в отдельном потоке, что значительно снижает затраты на производительность.

You can obtain general information on streamed resources by using the render_streaming_meshes_info and render_streaming_textures_info console commands.Вы можете получить общую информацию о потоковых ресурсах, используя консольные команды render_streaming_meshes_info и render_streaming_textures_info.

The render_streaming_meshes_info output.Вывод render_streaming_meshes_info.

It is also possible to print the list of loaded resources and detailed information on them by using the render_streaming_meshes_list and render_streaming_textures_list console commands.Также можно вывести на экран список загруженных ресурсов и подробную информацию о них с помощью консольных команд render_streaming_meshes_list и render_streaming_textures_list.

The render_streaming_meshes_list output.Вывод render_streaming_meshes_list.

Asynchronous Shader CompilationАсинхронная компиляция шейдеров#

In addition to the asynchronous loading of meshes and textures, the streaming system provides asynchronous shader compilation and loading.Помимо асинхронной загрузки мешей и текстур, система потоковой передачи обеспечивает асинхронную компиляцию и загрузку шейдеров.

There are also 2 modes - asynchronous (Async) and forced (Force). In the Force mode, all shaders required for the current frame are compiled and loaded to RAM simultaneously in the current thread. By default, the asynchronous mode is used.Для шейдеров также есть 2 режима - асинхронный (Async) и принудительный (Force). Режим Force обеспечивает принудительную компиляцию и загрузку в RAM всех шейдеров, необходимых для текущего кадра одновременно, в текущем потоке. По умолчанию используется асинхронный режим.

Примечание
You can switch the compilation mode in UnigineEditor or by using the render_shaders_compile_mode console command.Изменить режим компиляции и загрузки шейдеров можно в UnigineEditor или с помощью консольной команды render_shaders_compile_mode.

The number of compiled and loaded shaders are available in the Performance Profiler tool.Количество компилируемых в настоящий момент шейдеров, а также количество уже загруженных в память шейдеров доступно в Performance Profiler

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

To make the scene appear immediately when the application starts, there is the First Frames Force parameter, which sets the number of frames that will be loaded right after the first frame. Чтобы сцена появлялась сразу при запуске приложения, существует параметр First Frames Force, задающий количество кадров, которые будут загружены сразу после первого кадра.

To take advantage of multithreading, set the maximum number of threads used for resource streaming by using the render_streaming_max_threads console parameter. A higher number of threads results in faster streaming but may cause spikes in the case of excessive consumption of GPU resources. Чтобы воспользоваться преимуществами многопоточности, установите максимальное количество потоков, используемых для потоковой передачи ресурсов, с помощью параметра консоли render_streaming_max_threads. Большее количество потоков приводит к более быстрой потоковой передаче, но может вызвать всплески в случае чрезмерного потребления ресурсов GPU.

Примечание
The streaming system requires a GPU driver with multithreading support. Для системы потоковой передачи требуется драйвер GPU с поддержкой многопоточности.

Memory LimitsОграничения памяти#

You can limit the number of loaded and unloaded graphic resources per frame by specifying the corresponding budgets. Use them to find the balance between loading/unloading speed and performance: keep in mind that increasing the budget increases streaming performance, however, memory consumption increases as well.Вы можете ограничить количество загружаемых и выгружаемых графических ресурсов на кадр, указав соответствующие бюджеты. Используйте их, чтобы найти баланс между скоростью загрузки/выгрузки и производительностью: имейте в виду, что увеличение бюджета увеличивает производительность потоковой передачи, однако также увеличивается потребление памяти.

Adjustable memory limits and life times enable to avoid situations where resources remain loaded in memory or video memory even after they are no longer used. They are defined for meshes loaded to RAM/VRAM, textures, and particles separately in a percentage of the total RAM/VRAM.Регулируемые ограничения памяти и время автономной работы позволяют избежать ситуаций, когда ресурсы остаются загруженными в оперативную память или видеопамять даже после того, как они больше не используются. Они определены для мешей, загруженных в RAM/VRAM, текстур и частиц отдельно в процентах от общего объема RAM/VRAM.

Примечание
The memory limit is a recommended value to aim for. It can be exceeded if textures or meshes are required for the current frame.Ограничение объема памяти — это рекомендуемое значение, к которому следует стремиться. Это значение может быть превышено, если для текущего кадра требуются текстуры или меши.

The memory limit is associated with the lifetime: resources are deleted from memory or video memory only when both values are exceeded.Ограничение памяти связано со временем существования (lifetime): ресурсы удаляются из оперативной памяти или видеопамяти только при превышении обоих значений.

Memory limits and RAM / VRAM occupied by streamed resources are available in the Performance Profiler tool.Ограничения памяти и RAM/VRAM, занимаемые потоковыми ресурсами, доступны в инструменте Performance Profiler.

The limits are slash separated: the first value displays the current RAM / VRAM usage, and the second value is the limit.Ограничения разделены косой чертой: первое значение отображает текущее использование оперативной памяти / видеопамяти, а второе — предел.

Texture CacheКэш текстур#

The streaming system uses the texture cache composed of minimized copies generated for all textures with user-defined resolution stored in the data/.cache_textures folder. These copies are used instead of the originals while they are being loaded. Система потоковой передачи использует кеш текстур, состоящий из минимизированных копий, созданных для всех текстур с определяемым пользователем разрешением и хранящихся в папке data/.cache_textures . Эти копии используются вместо оригиналов при загрузке.

Texture cache is loaded at Engine's startup and always stays in the memory after loading. The following default loading order ensures smooth loading and rendering of resources: Кеш текстур загружается при запуске движка и всегда остается в памяти после загрузки. Для обеспечения плавной загрузки и отрисовки ресурсов потоковые сущности имеют следующие приоритеты загрузки:

  1. Texture cache Кеш текстур
  2. Geometry Геометрия
  3. Uncached textures cause spikes as texture cache is generated for them on the fly; materials with uncached and unloaded textures applied are rendered black Некешированные текстуры (вызывают скачки, поскольку кэш текстур генерируется для них на лету; материалы с некешированными и незагруженными текстурами отображаются черными)
  4. Full-size textures Полноразмерные текстуры

Using the textures_cache_preload flag in the boot config file, you can choose the texture cache loading priority — preloaded or loaded after geometry data. Кэш текстур может быть предварительно загружен или загружен после данных геометрии, флаг Texture Cache Preload управляет приоритетом загрузки кеша текстур.

Примечание
If there is no texture cache in the project, it will be generated for all textures at Engine's startup, causing spikes and extremely increasing loading time (up to several minutes). Если в проекте нет кеша текстур, он будет сгенерирован для всех текстур при запуске движка, что приведет к резким скачкам и резкому увеличению времени загрузки (до нескольких минут).

By default, texture cache files are generated with a resolution of 16 x 16 px. Such a low resolution of textures may be noticeable during loading. По умолчанию файлы кэша текстур генерируются с разрешением 16x16, такое низкое разрешение текстур вызывает визуальные артефакты во время загрузки.

Control the resolution of texture cache by setting the Texture Cache Resolution parameter. To apply changes, wipe away existing cache files by using the render_streaming_textures_cache_destroy console command, after which the texture cache will be generated automatically with the new specified resolution.Управляйте разрешением кэша текстур через параметр Texture Cache Resolution. Чтобы применить изменения, удалите существующие файлы кэша с помощью консольной команды render_streaming_textures_cache_destroy, после чего кэш текстур будет сгенерирован автоматически с новым указанным разрешением.

Примечание
Be aware that higher texture cache resolution requires more video memory. Имейте в виду, что более высокое разрешение кэша текстур требует больше видеопамяти.

The video memory amount currently occupied by the texture cache is available in the Performance Profiler tool. Информацию об объеме видеопамяти, занятом в данный момент кешем текстур, можно посмотреть в инструменте Performance Profiler.

Примечание
As all textures are cached regardless of their use in the project, it is reasonable to use the Cleaner tool to delete unused assets and thus lighten video memory consumption. Поскольку все текстуры в проекте кэшируются независимо от того, используются они или нет, разумно использовать инструмент Cleaner для удаления неиспользуемых ресурсов и, таким образом, уменьшения потребления видеопамяти.

The render_streaming_textures_cache_load and render_streaming_textures_cache_unload console commands enable you to control loading of texture cache. For example, after loading full-size textures, you can unload the texture cache from video memory for better performance. Консольные команды render_streaming_textures_cache_load и render_streaming_textures_cache_unload позволяют управлять загрузкой кеша текстур. Например. после загрузки полноразмерных текстур кеш текстур может быть выгружен из видеопамяти для повышения производительности.

Mesh StreamingПотоковая передача мешей#

Meshes can be loaded to RAM and VRAM separately for more efficient work with geometry. This allows eliminating memory leaks: meshes participating in collisions and intersections can be loaded to RAM only, if they are not currently rendered.Меши могут быть загружены в оперативную память и видеопамять отдельно для более эффективной работы с геометрией. Это позволяет устранить утечки памяти: меши, участвующие в коллизиях и пересечениях, могут быть загружены в оперативную память только в том случае, если они в данный момент не отрисованы.

There are 3 modes of mesh streaming to RAM/VRAM:Существует 3 режима потоковой передачи мешей в RAM/VRAM:

  • Asynchronous mode that provides asynchronous loading of meshes.асинхронный режим, обеспечивающий асинхронную загрузку мешей;
  • Forced mode for force-loading of meshes required for the current frame at once.принудительный режим для одновременной принудительной загрузки мешей, необходимых для текущего кадра;
  • Mode for loading all meshes available in the project on the application start-up. Actually, this mode disables mesh streaming at all.режим загрузки всех мешей, доступных в проекте, при запуске приложения. На самом деле, этот режим вообще отключает потоковую передачу мешей.

The asynchronous loading to RAM and VRAM differs. Even if a mesh hasn't been loaded to video memory in time, it doesn't affect the application behavior (you may only notice some lag). However, if a mesh hasn't been loaded to memory in time, it may lead to incorrect physical behavior of objects in the scene.Асинхронная загрузка в RAM и VRAM отличается. Даже если меш не был загружен в видеопамять вовремя, это не влияет на поведение приложения (вы можете заметить только некоторую задержку). Однако, если меш не был загружен в память вовремя, это может привести к неправильному физическому поведению объектов в сцене.

First of all, we highly recommend you to use shapes for collision and intersection detection as it is faster. If, for some reason, it doesn't suit you, use the following methods:Прежде всего, мы настоятельно рекомендуем вам использовать формы (shape) для обнаружения столкновений и пересечений, поскольку это быстрее. Если по какой-то причине это вам не подходит, воспользуйтесь следующими способами:

  • Load meshes and hold them in memory while they exist. API of some mesh-based objects provides this functionality out of the box. It may partially solve the problem with incorrect behavior, however, only a few meshes can remain loaded.Загружайте меши и сохраняйте их в памяти, пока они существуют. В API некоторых объектов на основе меша эта функциональность предусмотрена. Это может частично решить проблему с некорректным поведением, однако загруженными могут оставаться только несколько мешей.
  • Use the prefetch system that allows asynchronous pre-loading of meshes participating in collisions and intersections to memory before they are used:Используйте систему предварительной выборки, которая позволяет асинхронно предварительно загружать меши, участвующие в коллизиях и пересечениях, в память перед их использованием:

    1. Set the Radius prefetch mode.Установите режим предварительной выборки Radius.
    2. Specify the physics radius (for collisions) and/or the radius within which intersections are calculated.Укажите физический радиус (для столкновений) и/или радиус, в пределах которого рассчитываются пересечения.
    3. Specify the prefetch radius that should exceed the collison and intersection radius values.Укажите радиус предварительной выборки, который должен превышать значения радиуса столкновения и пересечения.

    You can also preload all meshes for which collisions and intersections are calculated (the Full prefetch mode), however it will significantly increase RAM usage.Вы также можете предварительно загрузить все меши, для которых вычисляются коллизии и пересечения (режим предварительной выборки Full), однако это значительно увеличит использование оперативной памяти.

  • API of some mesh-based objects, as well as the MeshStatic class API provides also methods which allow implementing a custom prefetch logic for pre-loading meshes.API некоторых mesh-объектов, а также API класса MeshStatic предоставляют также методы, которые позволяют реализовать пользовательскую логику предварительной выборки для предварительной загрузки мешей.
Примечание
It is highly recommended to use shapes for collision and intersection detection.Настоятельно рекомендуется использовать формы (shape) для обнаружения столкновений и пересечений.

Asynchronously streamed meshes shouldn't be modified. The only way to change such mesh is to make it procedural. A procedural mesh is a mesh created via code, such meshes have a specific streaming mode — they are always kept in memory after creation and never unloaded until the object is destroyed via code or the mesh returns to its normal mode (streaming from a source file). The mesh-based objects API allows switching a mesh to the procedural mode and apply changes.Асинхронно передаваемые меши не должны изменяться. Единственный способ изменить такой меш — сделать его процедурным. Процедурный меш — это меш, созданный с помощью кода, такие меши имеют определенный режим потоковой передачи — они всегда сохраняются в памяти после создания и никогда не выгружаются, пока объект не будет уничтожен через код или меш не вернется в свой обычный режим (потоковая передача из исходного файла). API объектов на основе меша позволяет переключать меш в процедурный режим и применять изменения.

OpenGL SettingsНастройки OpenGL#

Settings and workflow for OpenGL API are slightly different than for DirectX API. Настройки и рабочий процесс для OpenGL API немного отличаются от DirectX API.

Under OpenGL, the Data Streaming System engages two intermediate buffers to provide data transfer between CPU and new resource: В OpenGL система потоковой передачи данных задействует два промежуточных буфера для передачи данных между CPU и новым ресурсом:

  • Async Buffer used for mesh and texture streaming Async Buffer используется для потоковой передачи мешей и текстур
  • Async Buffer Indices used for streaming of vertex indices of meshes Async Buffer Indices используется для потоковой передачи индексов вершин мешей

The size of the Async Buffer buffer must correspond to the size of the largest resource (mesh/texture); otherwise, in the case of a larger resource, the buffer will be resized, causing a spike. размер буфера Async Buffer должен соответствовать размеру самого большого ресурса (меш/текстура), иначе в случае большего ресурса, размер буфера будет изменен, вызывая скачок.

Примечание
Be aware that the size of these intermediate buffers contributes to the increased total memory consumption. Имейте в виду, что размер этих промежуточных буферов увеличивает общее потребление памяти.

The Async Buffer Synchronization parameter stands for the mechanism of buffer synchronization. So, async buffers are created only once and then synchronized, reducing the time on allocating and freeing memory. When the synchronization is disabled, both Async Buffer and Async Buffer Indices are created anew for each new resource. This reduces the number of buffer synchronizations but increases the number of memory allocations. Механизм синхронизации буфера включается, если для параметра Async Buffer Synchronization установлено значение 1 . Таким образом, асинхронные буферы создаются только один раз, а затем синхронизируются, сокращая время на выделение и освобождение памяти. Когда синхронизация отключена, и Async Buffer, и Async Buffer Indices создаются заново для каждого нового ресурса. Это уменьшает количество синхронизаций буфера, но увеличивает количество выделений памяти.

Sometimes (depending on the hardware/driver used, e.g., when the main thread is affected by synchronization primitives in other threads), memory allocation may be faster than synchronizations; in such cases, when streaming becomes unacceptably slow, it is recommended to disable buffer synchronization. Иногда (в зависимости от используемого оборудования/драйвера, например, когда на основной поток влияют примитивы синхронизации в других потоках) выделение памяти может быть быстрее, чем синхронизация; в таких случаях, когда потоковая передача становится неприемлемо медленной, рекомендуется отключить синхронизацию буфера.

There are some known issues and workarounds for some hardware/driver software: Есть некоторые известные проблемы и обходные пути для некоторых аппаратных средств / программного обеспечения драйверов:

Последнее обновление: 05.10.2023
Build: ()