Асинхронная потоковая передача данных
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.
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 обеспечивает принудительную загрузку всех ресурсов, необходимых для каждого кадра одновременно (например, захват последовательностей кадров, рендеринг предварительного просмотра нод, прогрев и т.д.).
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:
- All texture runtime files and textures with the Unchanged option enabled, including cubemaps, voxel probe maps, and shadow maps of baked shadows. Все исполняемые файлы текстур и текстуры с включенной опцией Unchanged, включая кубические карты, карты воксельных проб и карты запеченных теней.
- Meshes of ObjectMeshStatic, ObjectMeshClutter, ObjectMeshCluster, ObjectGuiMesh objects, and DecalMesh.Меши объектов ObjectMeshStatic, ObjectMeshClutter, ObjectMeshCluster, ObjectGuiMesh и DecalMesh.
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.
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.
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 всех шейдеров, необходимых для текущего кадра одновременно, в текущем потоке. По умолчанию используется асинхронный режим.
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.
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 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: Кеш текстур загружается при запуске движка и всегда остается в памяти после загрузки. Для обеспечения плавной загрузки и отрисовки ресурсов потоковые сущности имеют следующие приоритеты загрузки:
- Texture cache Кеш текстур
- Geometry Геометрия
- Uncached textures cause spikes as texture cache is generated for them on the fly; materials with uncached and unloaded textures applied are rendered black Некешированные текстуры (вызывают скачки, поскольку кэш текстур генерируется для них на лету; материалы с некешированными и незагруженными текстурами отображаются черными)
- 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 управляет приоритетом загрузки кеша текстур.
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, после чего кэш текстур будет сгенерирован автоматически с новым указанным разрешением.
The video memory amount currently occupied by the texture cache is available in the Performance Profiler tool. Информацию об объеме видеопамяти, занятом в данный момент кешем текстур, можно посмотреть в инструменте Performance Profiler.
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:Используйте систему предварительной выборки, которая позволяет асинхронно предварительно загружать меши, участвующие в коллизиях и пересечениях, в память перед их использованием:
- Set the Radius prefetch mode.Установите режим предварительной выборки Radius.
- Specify the physics radius (for collisions) and/or the radius within which intersections are calculated.Укажите физический радиус (для столкновений) и/или радиус, в пределах которого рассчитываются пересечения.
- 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 предоставляют также методы, которые позволяют реализовать пользовательскую логику предварительной выборки для предварительной загрузки мешей.
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 должен соответствовать размеру самого большого ресурса (меш/текстура), иначе в случае большего ресурса, размер буфера будет изменен, вызывая скачок.
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: Есть некоторые известные проблемы и обходные пути для некоторых аппаратных средств / программного обеспечения драйверов:
- The Mesa 3D GL: The buffer synchronization must be disabled (gl_async_buffer_synchronization 0) for better performance. The updated Open Graphics Drivers are required. Mesa 3D GL: для повышения производительности необходимо отключить синхронизацию буфера (gl_async_buffer_synchronization 0). Требуются обновленные бесплатные графические драйверы.
- Intel: It is necessary to consider that VRAM is limited by OS to one-half of RAM. Intel: необходимо принять во внимание, что объем VRAM ограничен ОС половиной от RAM.