Видеоуроки
Interface
Essentials
Advanced
Полезные советы
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров узла
Setting Up Materials
Setting Up Properties
Освещение
Landscape Tool
Sandworm (Experimental)
Использование инструментов редактора для конкретных задач
Extending Editor Functionality
Программирование
Настройка среды разработки
Примеры использования
UnigineScript
C++
C#
Унифицированный язык шейдеров UUSL
File Formats
Rebuilding the Engine Tools
GUI
Двойная точность координат
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
Работа с контентом
Оптимизация контента
Материалы
Art Samples
Tutorials

Куда писать код?

The world logic has a number of functions that are used to code logic of the application. Initialization function of the world logic (init()) is used to create objects and initialize all other necessary resources on the world load. Shutdown function (shutdown()) is called when the world is unloaded and is used to delete resources that were created during the logic execution to avoid memory leaks. Мировая логика имеет ряд функций, которые используются для кодирования логики приложения. Функция Initialization мировой логики (init()) используется для создания объектов и инициализации всех других необходимых ресурсов при мировой загрузке. Функция Shutdown (shutdown()) вызывается, когда мир выгружается, и используется для удаления ресурсов, которые были созданы во время выполнения логики, чтобы избежать утечек памяти.

But what about the frame-by-frame update? In the world logic, this update is performed within the main loop that has the following blocks for that: А как насчет покадрового обновления? В мировой логике это обновление выполняется в основном цикле , который имеет для этого следующие блоки:

  • updateAsyncThread() can contain logic functions to be called every frame independently of the rendering thread: pathfinding, generation of procedural textures, custom physics, etc. updateAsyncThread() может содержать логические функции, вызываемые в каждом кадре независимо от потока рендеринга: поиск пути, создание процедурных текстур, настраиваемая физика и т. д.
  • updateSyncThread() can contain any parallel logic functions to be executed before update(). updateSyncThread() может содержать любые функции параллельной логики, которые должны выполняться до update().
  • update() can contain any logic: control what to render on the screen and how to do it, render to textures, create nodes, call console commands, etc. update() может содержать любую логику: управлять тем, что отображать на экране и как это делать, выполнять рендеринг в текстуры, создавать узлы, вызывать команды консоли и т. д.
  • updatePhysics() can be used to simulate physics: perform continuous operations (pushing a car forward depending on current motor's RPM, simulating a wind blowing constantly, perform immediate collision response, etc.). updatePhysics() можно использовать для моделирования физики: выполнять непрерывные операции (толкать автомобиль вперед в зависимости от оборотов двигателя, имитировать постоянный ветер, выполнять немедленную реакцию на столкновение и т. д.).
  • postUpdate() can be used to correct behavior according to the updated node states in the same frame. postUpdate() можно использовать для исправления поведения в соответствии с обновленными состояниями узлов в том же кадре.
  • swap() can be used to process the results of the updateAsyncThread() function. swap() можно использовать для обработки результатов функции updateAsyncThread().

Code UpdateAsyncThread()Code UpdateAsyncThread()#

In the world logic updateAsyncThread(), you can specify all logic functions you want to be called every frame independently of the rendering thread. This function can be used to perform some heavy resource-consuming calculations performed during the whole frame, such as pathfinding, generation of procedural textures, custom physics, and so on. This function does not block the main thread. В мировой логике updateAsyncThread() вы можете указать все логические функции, которые вы хотите вызывать в каждом кадре независимо от потока рендеринга. Эта функция может использоваться для выполнения некоторых ресурсоемких вычислений, выполняемых в течение всего кадра, таких как поиск пути, создание процедурных текстур, настраиваемая физика и т. Д. Эта функция не блокирует основной поток.

Code UpdateSyncThread()Code UpdateSyncThread()#

In the world logic updateSyncThread(), you can specify any parallel logic functions you want to be executed before update(). This function blocks the Main Thread until all calls are completed. В мировой логике updateSyncThread() вы можете указать любые функции параллельной логики, которые вы хотите выполнять до update(). Эта функция блокирует главный поток до тех пор, пока все вызовы не будут завершены.

This function can be used to perform some heavy resource-consuming calculations such as pathfinding, generation of procedural textures, manipulations with big amounts of data, the result of which is required before the frame starts to be rendered. This function can also be used for simpler operations, that can be implemented in the update() function, to distribute between threads and improve performance. Эта функция может использоваться для выполнения некоторых ресурсоемких вычислений, таких как поиск пути, генерация процедурных текстур, манипуляции с большими объемами данных, результат которых требуется до начала рендеринга кадра. Эту функцию также можно использовать для более простых операций, которые можно реализовать в функции update(), для распределения между потоками и повышения производительности.

Code Update()Code Update()#

In the world logic update(), you can put all functions to be called every frame, while your application is executed. It serves for implementing any logic. In brief, you can control a lot of things (whether graphics-related or not) from within the update(). Here you can: В мировой логике update() вы можете поместить все функции, которые будут вызываться в каждом кадре, пока ваше приложение выполняется. Он служит для реализации любой логики. Короче говоря, вы можете управлять многими вещами (связанными с графикой или нет) из файла update(). Здесь вы можете:

Примечание
Do not apply forces and torques to rigid bodies in the update(). Otherwise, you will get an unstable result that varies with each rendering frame. All continuous operations must be within updatePhysics(). Не применяйте силы и крутящие моменты к твердым телам в update(). В противном случае вы получите нестабильный результат, который зависит от каждого кадра рендеринга. Все непрерывные операции должны быть внутри updatePhysics().

World CallbacksМировые обратные вызовы#

Callbacks set in update() (for example, by using WorldTrigger or widget callbacks) are not executed immediately. They are run when the next engine function is called: that is, before updatePhysics(), if any (in the current frame), or before the next update() (in the following frame) — whatever comes first. Обратные вызовы, установленные в update() (например, с использованием WorldTrigger или обратных вызовов виджета ), не выполняются немедленно. Они запускаются при вызове следующей функции движка: то есть перед updatePhysics(), если есть (в текущем кадре), или перед следующим update() (в следующем кадре) - все, что будет первым.

Code UpdatePhysics()Code UpdatePhysics()#

The updatePhysics() function of the world logic is used to control physics in your application. This function should be used for continuous operations such as pushing a car forward depending on current motor's RPM, simulating a wind blowing constantly, performing immediate collision response (as updatePhysics() can be executed several times during a single rendering frame, you can process multiple bounces of objects, when they collide with each other and monitor them, while the update() will only show us the final result), etc. So, in the updatePhysics() you can: Функция мировой логики updatePhysics() используется для управления физикой в ​​вашем приложении. Эту функцию следует использовать для непрерывных операций, таких как толкание автомобиля вперед в зависимости от текущей скорости вращения двигателя, имитация постоянно дующего ветра, выполнение немедленной реакции на столкновение (поскольку updatePhysics() может выполняться несколько раз в течение одного кадра рендеринга, вы можете обрабатывать несколько отскоков объекты, когда они сталкиваются друг с другом и контролируют их, в то время как update() покажет нам только окончательный результат) и т.д. Итак, в updatePhysics() вы можете:

Примечание
There are certain limitations for what can be done from within updatePhysics(). As the main loop accesses the list of nodes and their transformation data during the updatePhysics call, you can't do any of the following:
  • Reposition and transform nodes if they are enabled.Reposition and transform nodes if they are enabled.
  • Create new nodes.Create new nodes.
  • Delete nodes.Delete nodes.
These operations can violate the rendering process already in progress. Reposition and transform nodes if they are enabled.Create new nodes.Delete nodes.
Существуют определенные ограничения на то, что можно сделать из updatePhysics(). Поскольку основной цикл обращается к списку узлов и их данным преобразования во время вызова updatePhysics, вы не можете делать ничего из следующего :
  • Reposition and transform nodes if they are enabled. Перемещение и преобразование узлов, если они включены.
  • Create new nodes. Создание новых узлов.
  • Delete nodes. Удаление узлов.
Эти операции могут нарушить уже начатый процесс рендеринга.

Physics CallbacksФункции обратного вызова (физика)#

Just like in case with update(), if you set any physics-based callbacks in updatePhysics() or use a PhysicalTrigger, they cannot be executed immediately, as the rendering process is already in action and they can violate it. If there is one more physics iteration to go, these callbacks or a PhysicalTrigger are executed before the next updatePhysics(); if not, before the next world logic update(). Как и в случае с update(), если вы установите какие-либо обратные вызовы на основе физики в updatePhysics() или используете PhysicalTrigger, они не могут быть выполнены немедленно, поскольку процесс рендеринга уже запущен, и они могут его нарушить. Если предстоит еще одна физическая итерация, эти обратные вызовы или PhysicalTrigger выполняются перед следующей updatePhysics(); если нет, то перед следующей мировой логикой update().

If you want to reposition or transform, create or delete nodes that are returned by your physics callback, the workflow is as follows: store them in the array and then perform all necessary operations in the update(). Если вы хотите изменить положение или преобразовать, создать или удалить узлы, возвращаемые вашим обратным вызовом физики, рабочий процесс выглядит следующим образом: сохраните их в массиве, а затем выполните все необходимые операции в update().

Code PostUpdate()Code PostUpdate()#

The postUpdate() function of the world logic is an additional function used to correct behavior after the state of the node has been updated (for example, skinned animation has been played in the current frame or particle system has spawn its particles). Функция postUpdate() мировой логики - это дополнительная функция, используемая для исправления поведения после обновления состояния узла (например, в текущем кадре воспроизводилась анимация со скинами или система частиц порождала свои частицы).

Imagine a situation when we need to attach an object (let's say, a sword) to the hand of a skinned mesh character. If we get transformation of the character hand bone and set it to the sword in the update() function, the attachment will be loose rather than precise. The sword will not be tightly held in the hand, because the animation is actually played right after the world logic update() has been executed. This means, returned bone transformations in the update() will be for the previous frame. The world logic postUpdate() is executed after animation is played, which means you can get updated bone transformations for the current frame from within this function and set them to the sword. Представьте себе ситуацию, когда нам нужно прикрепить объект (скажем, меч) к руке персонажа из меша со скиной. Если мы получим преобразование кости руки персонажа и установим его на меч в функции update(), привязка будет скорее свободной, чем точной. Меч не будет крепко зажат в руке, потому что анимация фактически воспроизводится сразу после выполнения мировой логики update(). Это означает, что возвращенные преобразования костей в update() будут для предыдущего кадра. Мировая логика postUpdate() выполняется после воспроизведения анимации, что означает, что вы можете получить обновленные преобразования костей для текущего кадра из этой функции и установить их на меч.

Примечание
Use postUpdate() for correction purposes only; otherwise, this will increase the main loop time. All other functions should be placed within update() or updatePhysics() (physics). Используйте postUpdate() только в целях исправления; в противном случае это увеличит время основного цикла. Все остальные функции следует размещать в пределах update() или updatePhysics() (физика).

Code Swap()Code Swap()#

Engine calls this function after the following processes are completed: rendering (CPU portion), physics calculations and pathfinding, GUI rendering, and all Async threads. The function is designed to process the results of the updateAsyncThread() method — all other methods (threads) have already been performed and are idle. After this function, only two actions occur: Движок вызывает эту функцию после завершения следующих процессов: рендеринг (часть ЦП), физические вычисления и поиск пути, рендеринг графического интерфейса и все потоки Async. Функция предназначена для обработки результатов метода updateAsyncThread() - все остальные методы (потоки) уже выполнены и простаивают. После этой функции происходит только два действия:

  • All objects that are queued for deletion are deleted. Все объекты, поставленные в очередь на удаление, удаляются.
  • Profiler is updated. Обновляется Profiler.

Последнее обновление: 30.09.2020