Основной цикл движка
This article describes in detail the steps taken by the UNIGINE engine when the Engine::update(), Engine::render(), and Engine::swap() functions are called. For other steps and general information about execution sequence, see the Execution Sequence article.В этой статье подробно описаны действия, выполняемые движком UNIGINE при вызове функций Engine::update(), Engine::render() и Engine::swap(). Для других шагов и общей информации о последовательности выполнения см. статью Последовательность выполнения.
The total time the main loop has taken is displayed by the Total counter in the Performance Profiler.Общее время, затраченное на основной цикл, отображается счетчиком Total в Профилировщике производительности .
UpdateUpdate#
The update part of the execution sequence includes the following:Этап обновления (update) в последовательности выполнения включает следующее:
The FPS value of the application starts to be calculated.Начинается расчет значения FPS приложения.
ПримечаниеCalculation of FPS starts only with the second rendered frame, while the very first one is skipped.Расчет FPS начинается только со второго отрендеренного кадра, а самый первый пропускается.- All pending console commands that were called during the previous frame are executed. The commands are executed in the beginning of the update() cycle, but before the scripts are updated, because otherwise they may violate the current process of rendering or physical calculations. Выполняются все ожидающие консольные команды, которые были вызваны в предыдущем кадре. Команды выполняются в начале цикла update(), но до обновления скриптов, поскольку в противном случае они могут нарушить текущий процесс рендеринга или физических вычислений.
- If a world has been unloaded during the previous frame, another world is loaded: WorldLogic::init().Если мир был выгружен во время предыдущего кадра, загружается другой мир: WorldLogic::init().
If the restart_main_window console command was executed previously (not in the current update stage), world shaders are created.Если консольная команда restart_main_window была выполнена ранее (не на текущем этапе обновления), создаются шейдеры мира.
- Properties, input, and controls are updated.Обновление свойств (properties), ввод и элементов управления.
- Update of streamed textures, sound, and landscape.Обновление потоковых текстур, звука и данных ландшафта.
- Game FPS and materials are updated.Обновление Game FPS и материалов.
- Ambient sound sources timers are updated.Обновление таймеров источников окружающего звука.
- The World Logic init() function for the newly loaded world is called.Вызывается функция World Logic init() для вновь загруженного мира.
- The update() function of all plugins is called. What happens during it, solely depends on the content of this custom function.Вызывается функция update() всех плагинов . Что происходит во время этого, зависит исключительно от содержимого этой настраиваемой функции.
- The Editor-related Logic is updated by calling the Editor update() function.Логика, связанная с редактором, обновляется путем вызова функции Editor update().
- The System Logic is updated. The default system script update() function performs the following:
- The system script handles the mouse. It controls whether the mouse is grabbed when clicked (by default), the mouse cursor disappears when not moved for some time (set by the MOUSE_SOFT definition), or not handled by the system (set by the MOUSE_USER definition, which allows input handling by some custom module).The system script handles the mouse. It controls whether the mouse is grabbed when clicked (by default), the mouse cursor disappears when not moved for some time (set by the MOUSE_SOFT definition), or not handled by the system (set by the MOUSE_USER definition, which allows input handling by some custom module).
- The main menu logic is updated (if the MENU_USER definition is not set).The main menu logic is updated (if the MENU_USER definition is not set).
- Other system-related user input is handled. For example, the world state is saved or restored, or a screenshot of the current UNIGINE window contents is made, if required.Other system-related user input is handled. For example, the world state is saved or restored, or a screenshot of the current UNIGINE window contents is made, if required.
If the GPU Monitor plugin is initialized (the HAS_GPU_MONITOR definition is set), the plugin output is displayed in the application window and additional console commands become available.If the GPU Monitor plugin is initialized (the HAS_GPU_MONITOR definition is set), the plugin output is displayed in the application window and additional console commands become available.
- The system script handles the mouse. It controls whether the mouse is grabbed when clicked (by default), the mouse cursor disappears when not moved for some time (set by the MOUSE_SOFT definition), or not handled by the system (set by the MOUSE_USER definition, which allows input handling by some custom module).Системный скрипт обрабатывает события от мыши. Он контролирует, захватывается ли мышь при нажатии (по умолчанию), курсор мыши исчезает, если он не перемещается в течение некоторого времени (устанавливается дефайном MOUSE_SOFT), или не обрабатывается системой (устанавливается дефайном MOUSE_USER, что позволяет обрабатывать ввод с помощью какого-то кастомного модуля).
- The main menu logic is updated (if the MENU_USER definition is not set).Обновление логики главного меню (если не задан дефайн MENU_USER).
- Other system-related user input is handled. For example, the world state is saved or restored, or a screenshot of the current UNIGINE window contents is made, if required.Обработка другого пользовательского ввода, связанного с системой. Например, сохранение или восстановление состояния мира, или выполнение снимка экрана с текущим содержимым окна UNIGINE, если требуется.
If the GPU Monitor plugin is initialized (the HAS_GPU_MONITOR definition is set), the plugin output is displayed in the application window and additional console commands become available.Если плагин GPU Monitorинициализирован (задан дефайн HAS_GPU_MONITOR), вывод плагина отображается в окне приложения и становятся доступными дополнительные консольные команды.
If the world is loaded (it can be done from the console or via the System Logic), the World Logic gets updated. In the World Logic update() function, you can code frame-by-frame behavior of your application (see details here). Если мир загружен (это можно сделать из консоли или через системную логику), то выполняется обновление логики мира (World Logic). В функции World Logic update() вы можете закодировать покадровое поведение вашего приложения (подробнее см. здесь ).
ПримечаниеPhysics, if any, and continuous operations (pushing a car forward depending on current motor's RPM, simulating wind blowing constantly, performing immediate collision response, etc.), can be implemented separately in the updatePhysics() function. This function is called with a fixed frame rate (while the update() function is called each frame).Физика, при использовании, и непрерывные операции (толкание автомобиля вперед в зависимости от текущей скорости вращения двигателя, имитация постоянного ветра, немедленное реагирование на столкновение и т.д.) Могут быть реализованы отдельно в функции updatePhysics(). Эта функция вызывается с фиксированной частотой кадров (в то время как функция update() вызывается для каждого кадра).The world and its world logic are updated in the following order:Мир и его логика обновляются в следующем порядке:
- The World Logic updateAsyncThread() function is executed. It is designed to perform logic functions that should be called every frame independently of the rendering thread. This function doesn't block the Main Thread.Выполняется функция World Logic updateAsyncThread(). Она предназначена для выполнения логических функций, которые должны вызываться в каждом кадре независимо от потока рендеринга. Эта функция не блокирует главный поток.
- The World Logic updateSyncThread() function is executed: all parallel logic functions that should be executed before update(). This function blocks the Main Thread until all calls are completed.Выполняется функция World Logic updateSyncThread(): все функции параллельной логики, которые должны выполняться до update(). Эта функция блокирует главный поток до тех пор, пока не будут завершены все вызовы.
- The World Logic update() function is executed: node parameters are updated, transformations for non-physical nodes are set and so on.Выполняется функция World Logic update(): обновляются параметры ноды, устанавливаются преобразования для нефизических нод и так далее.
- The state of nodes existing in the world is updated (mostly for visible nodes): skinned animation is played, particle systems spawn new particles, players are repositioned, and so on. Triggered world callbacks are added to a stack (they will be executed later).Обновление состояния существующих в мире нод в основном для видимых нод): воспроизводится анимация со скинами, системы частиц порождают новые частицы, перемещаются игроки и т.д. Инициированные мировые обратные вызовы добавляются в стек (они будут выполнены позже ).
- World Expressions are updated. Code in World Expressions can be written via UnigineEditor.Обновление World Expressions. Код в World Expressions можно написать через UnigineEditor.
- GUI is updated.Обновление графического интерфейса.
- The World Logic postUpdate() function is called.Вызывается функция World Logic postUpdate().
- The System Logic postUpdate() function is executed, if necessary (see details here). It can access the updated data on node states and correct the behavior accordingly in the same frame.При необходимости выполняется функция System Logic postUpdate() (подробнее см. здесь ). Она может использоваться для получения доступа к обновленным данным о состояниях нод и соответствующего корректирования поведения в том же кадре.
- The Editor Logic postUpdate() function is executed.Выполняется функция Editor Logic postUpdate().
- The postUpdate() function of all plugins is called.Вызывается функция postUpdate() всех плагинов.
- The world spatial tree is updated.Обновление пространственного дерева мира.
- The file system is updated.Обновление файловой системы.
At the end of the update stage, physics and pathfinding start to be updated in their separate threads. Then they perform their tasks on all available threads in parallel to rendering.В конце этапа обновления физика и поиск пути начинают обновляться в отдельных потоках . Затем они выполняют свои задачи во всех доступных потоках параллельно с рендерингом .
The total time of update stage is displayed by the Update counter in the Performance Profiler.Общее время этапа update отображается счетчиком Update в Профилировщике производительности .
RenderingRendering#
As soon as the update stage is completed, UNIGINE can start rendering the world. In parallel, the pathfinding is performed in a separate thread. Depending on the physics update mode, parts of the physics calculations are performed in the main thread or in parallel to it. This approach enables to effectively balance the load between CPU and GPU, and thus allows for higher framerate in the UNIGINE-based application.Как только этап обновления завершен, UNIGINE может начать рендеринг мира. Параллельно выполняется поиск пути в отдельном потоке. В зависимости от режима обновления физики , части физических расчетов выполняются в основном потоке или параллельно ему . Такой подход позволяет эффективно балансировать нагрузку между процессором и графическим процессором и, таким образом, обеспечивает более высокую частоту кадров в приложении на основе UNIGINE.
Here is what happens during the render stage:Вот что происходит на этапе рендеринга:
Рендер | Физика | Поиск пути |
---|---|---|
|
|
|
SwapSwap#
The swap stage is the last one in the main loop. It includes the following:Этап Swap - последний в основном цикле. Он включает в себя следующее:
- If the screenshot console command is executed previously, on this stage, the taken screenshot is saved in folder where all application data is stored.Если ранее была выполнена консольная команда screenshot, на этом этапе сделанный снимок экрана сохраняется в папке, где все Данные приложений хранится.
Synchronization of physics and pathfinding with the rendered world, i.e. waiting for all additional threads to finish their tasks. Results of the physical calculations are applied to the world. That is, on the previous step we have calculated how physical bodies with collision shapes have changed their position and orientation (due to our update-based logic or interaction). Now these transformations can be finally applied to nodes, i.e. rendered meshes.Синхронизация физики и поиска пути с визуализированным миром, т.е. ожидание, пока все дополнительные потоки завершат свои задачи. Результаты физических расчетов применяются к миру. То есть на предыдущем шаге мы вычислили, как физические тела с формами столкновения изменили свое положение и ориентацию (из-за нашей логики или взаимодействия, основанного на обновлении). Теперь эти преобразования можно, наконец, применить к нодам, то есть к визуализированным мешам.
ПримечаниеAs the synchronization of physics follows the rendering stage (in default Async Rendering physics mode), applied physical transformations will be visible on the screen only in the next frame. To calculate physics before the rendering enable the Before Rendering physics mode.Поскольку синхронизация физики следует за этапом рендеринга (в режиме физики по умолчанию Async Rendering), примененные физические преобразования будут видны на экране только в следующем кадре. Для расчета физики перед рендерингом включите режим физики Before Rendering.- The World Logic swap() function is executed. It operates with the results of the updateAsyncThread() function.Выполняется функция World Logic swap(). Она работает с результатами функции updateAsyncThread().
- The plugin swap() function is called, if it exists.Вызывается функция плагина swap(), если она существует.
- Unloading of the world, if another world is going to be loaded in the next frame.Выполняется выгрузка мира, если в следующем кадре будет загружен другой мир.
- Deletion of all objects that are planned to be deleted.Удаление всех объектов, которые планируется удалить.
- Values shown in the Performance Profiler are updated.Обновление значений, отображаемых в Профилировщике производительности.
After the swap stage is completed, the application window initiates GPU buffers swapping as described here.После завершения этапа Swap окно приложения инициирует перестановку буферов графического процессора, как описано здесь .