Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

КРАТКОЕ СОДЕРЖАНИЕ

proVIDec 28.06.11 в 10:24

0

ВВЕДЕНИЕ В РУКОВОДСТВО

wuffur 22.07.11 в 20:24

0

В этом туториале мы познакомимся с одной полезной конструкцией - FrameListener.

proVIDec 28.06.11 в 09:57

0

В этом руководстве мы познакомимся с одной из наиболее полезных конструкций Ogre - FrameListener.

wuffur 22.07.11 в 20:24

0

К концу этого урока вы поймёте что такое FrameListeners, как использовать их для вещей которые должны обновляться каждый кадр, и как использовать небуфферизованный ввод системы OIS.

cin 30.06.11 в 15:24

0

К концу этого руководство, вы поймёте объекты FrameListener, как их использовать там, где требуется обновление в каждом кадре, и как использовать небуферизованный ввод системы OIS

wuffur 22.07.11 в 20:25

0

ДЛЯ НАЧАЛА

proVIDec 28.06.11 в 10:18

0

Вот код, с которого мы начнем:

proVIDec 27.06.11 в 10:34

1

Мы переписали функцию frameRenderingQueued и определили новую приватную функцию processUnbufferedInput.

proVIDec 29.06.11 в 13:27

1

Давайте проведем остаток туториала, заставляя их делать что-нибудь интересное.

proVIDec 28.06.11 в 06:23

1

КАДРОВЫЕ КОНТРОЛЛЕРЫ

proVIDec 29.06.11 в 11:47

0

ВВЕДЕНИЕ

proVIDec 27.06.11 в 10:22

1

В Ogre мы можем зарегистрировать класс который получает уведомления перед тем и после того как содержимое сцены будет отрендерено на экране.
Этот класс называется FrameListener

alexx_x 06.07.11 в 07:38

0

Интерфейс FrameListener определяет три функции которые могут использоваться для того чтобы получать уведомления о событиях:

alexx_x 06.07.11 в 07:41

1

frameStarted: Вызывается перед тем как фрейм будет отрендерен.

alexx_x 06.07.11 в 07:41

0

frameStarted: вызывается прямо перед тем, как кадр будет отрендерен.

wuffur 23.07.11 в 04:26

0

frameRenderingQueued: Вызывается после того, как все части рендринга получат свои команды, но до того, как окно рендеринга запросит сброс их буферов.

proVIDec 08.07.11 в 14:06

1

frameEnded: Вызывается как только произошел рендеринг фрейма.

proVIDec 08.07.11 в 11:03

0

frameEnded: Вызывается сразу после того, как произошел рендеринг кадра.

wuffur 23.07.11 в 04:27

0

Это работает, пока любой кадровый контроллер возвращает false из frameStarted, frameRenderingQueued или frameEnded.

proVIDec 08.07.11 в 13:50

0

Цикл продолжается до тех пор, пока любой FrameListener возвратит ложное значение из frameStarted, frameRenderingQueued or frameEnded.

wuffur 23.07.11 в 04:29

0

Возвращаемое значение для этой функции означает "остановить рендеринг".

proVIDec 08.07.11 в 12:28

0

Возвращаемые значения для этих функций в основном означают "продолжать реднеринг".

wuffur 23.07.11 в 04:29

0

Если вернется значение false, то программа закроется.

proVIDec 08.07.11 в 11:04

1

Объект FrameEvent содержит две переменные, но во FrameListener можно применить только timeSinceLastFrame.

proVIDec 08.07.11 в 12:34

0

Объект FrameEvent содержит две переменные, но только в FrameListener полезна переменная timeSinceLastFrame.

wuffur 23.07.11 в 04:31

0

Эта переменная отслеживает как много времени назад это происходило, с момента последнего рендеринга кадра в frameStarted или frameEnded.

proVIDec 08.07.11 в 12:33

0

Переменная отслеживает сколько времени заняло, с тех пор как события frameStarted или frameEnded в последний раз выводились.

wuffur 23.07.11 в 04:33

0

Отметим, что в методе frameStarted, FrameEvent::timeSinceLastFrame будет содержать количество времени с последнего воспроизведения кадра в событии frameStarted (не событие frameEnded).

proVIDec 08.07.11 в 15:01

0

Одна важная концепция, порядок вызова кадровых контроллеров полностью зависит от Ogre.

proVIDec 08.07.11 в 14:53

0

Одним из важных принципов, который нужно реализовать, касающийся кадровых контроллеров из Ogre состоит в том, что порядок, в котором они вызываются полностью зависит от Ogre.

wuffur 23.07.11 в 04:40

0

Вы не можете определить какой кадровый контроллер будет вызываться первым, вторым, третьим... и так далее.

proVIDec 08.07.11 в 12:03

1

Если вам нужно убедиться, что кадровые контроллеры вызываются в правильном порядке, то зарегистрируйте только один контроллер и заставьте его вызывать все объекты в надлежащем порядке.

proVIDec 08.07.11 в 14:09

0

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

wuffur 23.07.11 в 19:06

0

Итак, какой же из трех методов FrameListener нужно выбрать?

proVIDec 08.07.11 в 11:04

1

Это конечно зависит, от того, что вам нужно в итоге, но если вы хотите обновлять материал один раз за фрейм, то поместите его в событие frameRenderingQueued, потому что только оно одно вызывается прямо перед началом нагрузки на GPU (путем сброса буферов рендринга).

Таким образом вы сохраните ваш CPU, в то время как GPU будет нагружен.

proVIDec 08.07.11 в 15:49

0

Конечно это зависит от того, что вам нужно сделать, но если вы только хотите обновлять объекты каждый кадр, то разместите его в событие frameRenderingQueued, потому, что это событие вызывается прямо перед обработкой в GPU и становится занятой, при сбросе буферов рендеринга.

wuffur 23.07.11 в 12:07

0

Или, если процитировать API документы:

proVIDec 28.06.11 в 06:02

0

Плюсы данного способа связанны с тем, что команды рендринга отслеживают GPU для вызова.

proVIDec 08.07.11 в 13:55

0

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

wuffur 23.07.11 в 12:08

0

Это может занять некоторое время, и когда наконец это произойдет CPU может стать полезной вещью.

proVIDec 08.07.11 в 13:56

0

Для завершения это может занять некоторое время, и когда это происходит CPU может сделать полезные вещи.

wuffur 23.07.11 в 12:09

0

Как только запрос на "сброс буферов" произойдет, поток запрашивающий это будет блокирован, пока GPU не будет готов. Это все может потратить ресурсы процессора.

proVIDec 08.07.11 в 14:03

0

Как только случится зарос на "сброс буферов", поток запрашивающий это будет заблокирован, до тех пор пока GPU не будет готов, что может заставить процессор(CPU) работать впустую.

wuffur 23.07.11 в 12:11

0

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

proVIDec 08.07.11 в 12:03

0

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

wuffur 24.07.11 в 07:21

0

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

proVIDec 08.07.11 в 12:40

0

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

wuffur 24.07.11 в 07:23

0

Для обновления каждого кадра используйте функцию frameRenderingQueued, если вы хотите производительности.

proVIDec 08.07.11 в 14:00

1

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

wuffur 24.07.11 в 11:02

0

РЕГИСТРАЦИЯ КАДРОВОГО КОНТРОЛЛЕРА

proVIDec 29.06.11 в 13:14

0

Наш класс BasicTutorial4 уже FrameListener - сюрприз.

Это происходит благодаря BaseApplication, который наследует FrameListener:

proVIDec 08.07.11 в 13:23

0

Наш класс BasicTutorial4 уже является FrameListener - сюрприз.

Это происходит благодаря BaseApplication, который наследует FrameListener:

wuffur 24.07.11 в 11:03

0

BaseApplication содержит функцию frameRenderingQueued, мы не использовали эту функцию в предыдущем туториале.

proVIDec 08.07.11 в 11:09

0

На самом деле, мы так же не использовали функцию createFrameListener.

proVIDec 08.07.11 в 11:06

0

Ну и теперь мы объясним, что эта функция все таки делает.

proVIDec 08.07.11 в 10:58

0

Для того, чтобы сделать полнофункциональный FrameListener, вы должны зарегистрировать его в Ogre::Root.

Вам нужно сделать это, так как Ogre::Root должен знать какой FrameListener вызывать, когда происходит событие связанное с фреймами.

proVIDec 08.07.11 в 15:41

0

Для того, чтобы сделать полностью функциональный FrameListener, вам нужно зарегистрировать его в Ogre::Root.

Вам нужно сделать это из-за того, что Ogre::Root должен знать какой FrameListener вызывать, когда происходит кадровое событие.

wuffur 24.07.11 в 11:27

0

Для добавления или удаления кадрового контроллера мы можем использовать две функции: Ogre::Root::addFrameListener и Ogre::Root::removeFrameListener.

proVIDec 08.07.11 в 12:07

0

Метод addFrameListener добавляет FrameListener, а метод removeFrameListener удаляет FrameListener (то есть FrameListener больше не будет получать обновления фреймов).

proVIDec 08.07.11 в 14:55

0

Метод addFrameListener добавляет FrameListener, а метод removeFrameListener удаляет FrameListener (то есть FrameListener больше не будет получать обновлений)

wuffur 24.07.11 в 11:29

0

Обратите внимание, что методы add|removeFrameListener берут только указатели на FrameListener (то есть FrameListeners не имеют имен, которые вы можете использовать).

proVIDec 08.07.11 в 14:58

0

Обратите внимание, что методы add|removeFrameListener берут только указатели на FrameListener (то есть FrameListeners не имеют имен, которые вы можете использовать, чтобы их убрать).

wuffur 24.07.11 в 11:30

0

BaseApplication использует следующий код в createFrameListener для регистрации самого себя с Ogre::Root как кадровых контроллеров:

proVIDec 08.07.11 в 12:06

0

BaseApplication использует следующий код в createFrameListener для регистрации самого себя с Ogre::Root как кадрового контроллера:

wuffur 24.07.11 в 11:31

0

После того, как это будет сделано, мы сможем получать информацию о фрейме из Ogre::Root, с помощью FrameListener функции frameStarted, frameRenderingQueued и frameEnded.

proVIDec 08.07.11 в 12:31

0

После того, как это будет сделано, мы сможем получать кадровое собитий из Ogre::Root, с помощью функций FrameListener frameStarted, frameRenderingQueued и frameEnded.

wuffur 24.07.11 в 11:33

0

КАК ЭТО РАБОТАЕТ?

proVIDec 27.06.11 в 10:27

0

ИТАК, КАК ЭТО РАБОТАЕТ?

wuffur 24.07.11 в 11:33

0

Давайте посмотрим на Ogre::Root::renderOneFrame:

proVIDec 27.06.11 в 10:28

0

Давайте заглянем в Ogre::Root::renderOneFrame:

wuffur 24.07.11 в 11:34

0

Здесь вы можете видеть, что Ogre::Root, когда осуществляет рендеринг фрейма, создает событие FrameStarted до обновления всех частей рендеринга.

А затем создает событие FrameEnded, когда обновление завершено.

proVIDec 08.07.11 в 13:18

0

Здесь вы можете видеть, что Ogre::Root, когда осуществляет рендеринг кадра, создает событие FrameStarted до обновления всех объектов рендеринга.

А затем выводит событие FrameEnded, когда завершено обновление.

wuffur 24.07.11 в 11:35

0

Чтобы увидеть где Ogre::Root создает событие FrameRenderingQueued, мы взглянем на отрывок из Ogre::Root::_updateAllRenderTargets:

proVIDec 08.07.11 в 13:19

0

Чтобы увидеть где Ogre::Root выводит событие FrameRenderingQueued, мы взглянем в отрывок из Ogre::Root::_updateAllRenderTargets:

wuffur 24.07.11 в 11:35

0

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

proVIDec 08.07.11 в 13:21

0

Там вы можете увидеть, что он создает событие FrameRenderingQueued после обновления частей рендринга, но до того, как поменяет местами буферы объектов рендеринга.

wuffur 24.07.11 в 11:36

0

Пока, это все, что вам нужно знать о внутренней работе кадровых контроллеров.

proVIDec 03.07.11 в 03:44

0

Перед тем как продолжить, убедитесь, что можете скомпилировать приложение.

proVIDec 27.06.11 в 10:29

1
Минутку...

Следующая страница →