Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
КРАТКОЕ СОДЕРЖАНИЕ proVIDec 28.06.11 в 10:24 ВВЕДЕНИЕ В РУКОВОДСТВО wuffur 22.07.11 в 20:24 |
|
|
В этом туториале мы познакомимся с одной полезной конструкцией - FrameListener. proVIDec 28.06.11 в 09:57 В этом руководстве мы познакомимся с одной из наиболее полезных конструкций Ogre - FrameListener. wuffur 22.07.11 в 20:24 |
||
|
К концу этого урока вы поймёте что такое FrameListeners, как использовать их для вещей которые должны обновляться каждый кадр, и как использовать небуфферизованный ввод системы OIS. cin 30.06.11 в 15:24 К концу этого руководство, вы поймёте объекты FrameListener, как их использовать там, где требуется обновление в каждом кадре, и как использовать небуферизованный ввод системы OIS wuffur 22.07.11 в 20:25 |
||
|
ДЛЯ НАЧАЛА proVIDec 28.06.11 в 10:18 |
||
|
Вот код, с которого мы начнем: proVIDec 27.06.11 в 10:34 |
||
|
Мы переписали функцию frameRenderingQueued и определили новую приватную функцию processUnbufferedInput. proVIDec 29.06.11 в 13:27 |
||
|
Давайте проведем остаток туториала, заставляя их делать что-нибудь интересное. proVIDec 28.06.11 в 06:23 |
||
|
КАДРОВЫЕ КОНТРОЛЛЕРЫ proVIDec 29.06.11 в 11:47 |
||
|
ВВЕДЕНИЕ proVIDec 27.06.11 в 10:22 |
||
|
В Ogre мы можем зарегистрировать класс который получает уведомления перед тем и после того как содержимое сцены будет отрендерено на экране. alexx_x 06.07.11 в 07:38 |
||
|
Интерфейс FrameListener определяет три функции которые могут использоваться для того чтобы получать уведомления о событиях: alexx_x 06.07.11 в 07:41 |
||
|
frameStarted: Вызывается перед тем как фрейм будет отрендерен. alexx_x 06.07.11 в 07:41 frameStarted: вызывается прямо перед тем, как кадр будет отрендерен. wuffur 23.07.11 в 04:26 |
||
|
frameRenderingQueued: Вызывается после того, как все части рендринга получат свои команды, но до того, как окно рендеринга запросит сброс их буферов. proVIDec 08.07.11 в 14:06 |
||
|
frameEnded: Вызывается как только произошел рендеринг фрейма. proVIDec 08.07.11 в 11:03 frameEnded: Вызывается сразу после того, как произошел рендеринг кадра. wuffur 23.07.11 в 04:27 |
||
|
Это работает, пока любой кадровый контроллер возвращает false из frameStarted, frameRenderingQueued или frameEnded. proVIDec 08.07.11 в 13:50 Цикл продолжается до тех пор, пока любой FrameListener возвратит ложное значение из frameStarted, frameRenderingQueued or frameEnded. wuffur 23.07.11 в 04:29 |
||
|
Возвращаемое значение для этой функции означает "остановить рендеринг". proVIDec 08.07.11 в 12:28 Возвращаемые значения для этих функций в основном означают "продолжать реднеринг". wuffur 23.07.11 в 04:29 |
||
|
Если вернется значение false, то программа закроется. proVIDec 08.07.11 в 11:04 |
||
|
Объект FrameEvent содержит две переменные, но во FrameListener можно применить только timeSinceLastFrame. proVIDec 08.07.11 в 12:34 Объект FrameEvent содержит две переменные, но только в FrameListener полезна переменная timeSinceLastFrame. wuffur 23.07.11 в 04:31 |
||
|
Эта переменная отслеживает как много времени назад это происходило, с момента последнего рендеринга кадра в frameStarted или frameEnded. proVIDec 08.07.11 в 12:33 Переменная отслеживает сколько времени заняло, с тех пор как события frameStarted или frameEnded в последний раз выводились. wuffur 23.07.11 в 04:33 |
||
|
Отметим, что в методе frameStarted, FrameEvent::timeSinceLastFrame будет содержать количество времени с последнего воспроизведения кадра в событии frameStarted (не событие frameEnded). proVIDec 08.07.11 в 15:01 |
||
|
Одна важная концепция, порядок вызова кадровых контроллеров полностью зависит от Ogre. proVIDec 08.07.11 в 14:53 Одним из важных принципов, который нужно реализовать, касающийся кадровых контроллеров из Ogre состоит в том, что порядок, в котором они вызываются полностью зависит от Ogre. wuffur 23.07.11 в 04:40 |
||
|
Вы не можете определить какой кадровый контроллер будет вызываться первым, вторым, третьим... и так далее. proVIDec 08.07.11 в 12:03 |
||
|
Если вам нужно убедиться, что кадровые контроллеры вызываются в правильном порядке, то зарегистрируйте только один контроллер и заставьте его вызывать все объекты в надлежащем порядке. proVIDec 08.07.11 в 14:09 Если вам нужно убедиться, что кадровые контроллеры вызываются в правильном порядке, тогда вам нужно зарегистровать только один контроллер и сделать так, чтобы он вызывал все объекты в определенном порядке. wuffur 23.07.11 в 19:06 |
||
|
Итак, какой же из трех методов FrameListener нужно выбрать? proVIDec 08.07.11 в 11:04 |
||
|
Это конечно зависит, от того, что вам нужно в итоге, но если вы хотите обновлять материал один раз за фрейм, то поместите его в событие frameRenderingQueued, потому что только оно одно вызывается прямо перед началом нагрузки на GPU (путем сброса буферов рендринга). proVIDec 08.07.11 в 15:49 Конечно это зависит от того, что вам нужно сделать, но если вы только хотите обновлять объекты каждый кадр, то разместите его в событие frameRenderingQueued, потому, что это событие вызывается прямо перед обработкой в GPU и становится занятой, при сбросе буферов рендеринга. wuffur 23.07.11 в 12:07 |
||
|
Или, если процитировать API документы: proVIDec 28.06.11 в 06:02 |
||
|
Плюсы данного способа связанны с тем, что команды рендринга отслеживают GPU для вызова. proVIDec 08.07.11 в 13:55 Плюсы от этих событий получаются благодаря тому факту, что команды рендеринга поставлены в очередь в GPU для того, чтобы там выполняться. wuffur 23.07.11 в 12:08 |
||
|
Это может занять некоторое время, и когда наконец это произойдет CPU может стать полезной вещью. proVIDec 08.07.11 в 13:56 Для завершения это может занять некоторое время, и когда это происходит CPU может сделать полезные вещи. wuffur 23.07.11 в 12:09 |
||
|
Как только запрос на "сброс буферов" произойдет, поток запрашивающий это будет блокирован, пока GPU не будет готов. Это все может потратить ресурсы процессора. proVIDec 08.07.11 в 14:03 Как только случится зарос на "сброс буферов", поток запрашивающий это будет заблокирован, до тех пор пока GPU не будет готов, что может заставить процессор(CPU) работать впустую. wuffur 23.07.11 в 12:11 |
||
|
Поэтому это довольно хороший способ, использовать этот обратный вызов для выполнения покадровой обработки. proVIDec 08.07.11 в 12:03 Поэтому, часто довольно хорошо использовать этот вызов, для выполнения покадровой обработки. wuffur 24.07.11 в 07:21 |
||
|
Поскольку команды для рендринга фрейма уже были выданы, то любые внесенные изменения вступят в силу только со следующего кадра, но в большинстве случаев это не заметно. proVIDec 08.07.11 в 12:40 Конечно, поскольку команды рендеринга кадра уже были выданы, и изменения, любые изменения, которые вы вносите примут действие только в следующем кадре, во многих случаях это незаметно. wuffur 24.07.11 в 07:23 |
||
|
Для обновления каждого кадра используйте функцию frameRenderingQueued, если вы хотите производительности. proVIDec 08.07.11 в 14:00 Для обновления каждого кадра используйте функцию frameRenderingQueued, если вы хотите, чтобы ваше приложение показывало высокую производительность. wuffur 24.07.11 в 11:02 |
||
|
РЕГИСТРАЦИЯ КАДРОВОГО КОНТРОЛЛЕРА proVIDec 29.06.11 в 13:14 |
||
|
Наш класс BasicTutorial4 уже FrameListener - сюрприз. proVIDec 08.07.11 в 13:23 Наш класс BasicTutorial4 уже является FrameListener - сюрприз. wuffur 24.07.11 в 11:03 |
||
|
BaseApplication содержит функцию frameRenderingQueued, мы не использовали эту функцию в предыдущем туториале. proVIDec 08.07.11 в 11:09 |
||
|
На самом деле, мы так же не использовали функцию createFrameListener. proVIDec 08.07.11 в 11:06 |
||
|
Ну и теперь мы объясним, что эта функция все таки делает. proVIDec 08.07.11 в 10:58 |
||
|
Для того, чтобы сделать полнофункциональный FrameListener, вы должны зарегистрировать его в Ogre::Root. proVIDec 08.07.11 в 15:41 Для того, чтобы сделать полностью функциональный FrameListener, вам нужно зарегистрировать его в Ogre::Root. wuffur 24.07.11 в 11:27 |
||
|
Для добавления или удаления кадрового контроллера мы можем использовать две функции: Ogre::Root::addFrameListener и Ogre::Root::removeFrameListener. proVIDec 08.07.11 в 12:07 |
||
|
Метод addFrameListener добавляет FrameListener, а метод removeFrameListener удаляет FrameListener (то есть FrameListener больше не будет получать обновления фреймов). proVIDec 08.07.11 в 14:55 Метод addFrameListener добавляет FrameListener, а метод removeFrameListener удаляет FrameListener (то есть FrameListener больше не будет получать обновлений) wuffur 24.07.11 в 11:29 |
||
|
Обратите внимание, что методы add|removeFrameListener берут только указатели на FrameListener (то есть FrameListeners не имеют имен, которые вы можете использовать). proVIDec 08.07.11 в 14:58 Обратите внимание, что методы add|removeFrameListener берут только указатели на FrameListener (то есть FrameListeners не имеют имен, которые вы можете использовать, чтобы их убрать). wuffur 24.07.11 в 11:30 |
||
|
BaseApplication использует следующий код в createFrameListener для регистрации самого себя с Ogre::Root как кадровых контроллеров: proVIDec 08.07.11 в 12:06 BaseApplication использует следующий код в createFrameListener для регистрации самого себя с Ogre::Root как кадрового контроллера: wuffur 24.07.11 в 11:31 |
||
|
После того, как это будет сделано, мы сможем получать информацию о фрейме из Ogre::Root, с помощью FrameListener функции frameStarted, frameRenderingQueued и frameEnded. proVIDec 08.07.11 в 12:31 После того, как это будет сделано, мы сможем получать кадровое собитий из Ogre::Root, с помощью функций FrameListener frameStarted, frameRenderingQueued и frameEnded. wuffur 24.07.11 в 11:33 |
||
|
КАК ЭТО РАБОТАЕТ? proVIDec 27.06.11 в 10:27 ИТАК, КАК ЭТО РАБОТАЕТ? wuffur 24.07.11 в 11:33 |
||
|
Давайте посмотрим на Ogre::Root::renderOneFrame: proVIDec 27.06.11 в 10:28 Давайте заглянем в Ogre::Root::renderOneFrame: wuffur 24.07.11 в 11:34 |
||
|
Здесь вы можете видеть, что Ogre::Root, когда осуществляет рендеринг фрейма, создает событие FrameStarted до обновления всех частей рендеринга. proVIDec 08.07.11 в 13:18 Здесь вы можете видеть, что Ogre::Root, когда осуществляет рендеринг кадра, создает событие FrameStarted до обновления всех объектов рендеринга. wuffur 24.07.11 в 11:35 |
||
|
Чтобы увидеть где Ogre::Root создает событие FrameRenderingQueued, мы взглянем на отрывок из Ogre::Root::_updateAllRenderTargets: proVIDec 08.07.11 в 13:19 Чтобы увидеть где Ogre::Root выводит событие FrameRenderingQueued, мы взглянем в отрывок из Ogre::Root::_updateAllRenderTargets: wuffur 24.07.11 в 11:35 |
||
|
Там вы можете увидеть, что он создает событие FrameRenderingQueued после обновления частей рендринга, но до замены их буферов. proVIDec 08.07.11 в 13:21 Там вы можете увидеть, что он создает событие FrameRenderingQueued после обновления частей рендринга, но до того, как поменяет местами буферы объектов рендеринга. wuffur 24.07.11 в 11:36 |
||
|
Пока, это все, что вам нужно знать о внутренней работе кадровых контроллеров. proVIDec 03.07.11 в 03:44 |
||
|
Перед тем как продолжить, убедитесь, что можете скомпилировать приложение. proVIDec 27.06.11 в 10:29 |
