Слушатель события обновления сцены. Кадронезависимое движение | Статья в сборнике международной научной конференции

Отправьте статью сегодня! Журнал выйдет 26 октября, печатный экземпляр отправим 30 октября.

Опубликовать статью в журнале

Автор:

Рубрика: 1. Информатика и кибернетика

Опубликовано в

III международная научная конференция «Технические науки в России и за рубежом» (Москва, июль 2014)

Дата публикации: 23.05.2014

Статья просмотрена: 126 раз

Библиографическое описание:

Бутенко, В. В. Слушатель события обновления сцены. Кадронезависимое движение / В. В. Бутенко. — Текст : непосредственный // Технические науки в России и за рубежом : материалы III Междунар. науч. конф. (г. Москва, июль 2014 г.). — Т. 0. — Москва : Буки-Веди, 2014. — С. 1-3. — URL: https://moluch.ru/conf/tech/archive/90/5710/ (дата обращения: 16.10.2024).

Приводится решение кадронезависимого движения в приложениях под Android на примере классов фреймворка PeeKaBoo. Описывается создание слушателя обновления сцены, зависящего от времени, выбранного разработчиком игры.

Ключевые слова: GLSurfaceView, Android, PeeKaBoo, кадронезависимое движение, обновление экрана, алгоритмы, программирование.

Введение

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

При движении на один пиксел, за сто кадров объект переместиться на сто пикселов за 1,66 секунды. Но запустив эту же игру на устройстве с частотой обновления экрана 48 кадров в секунду, это произойдет за 2,08 секунды [1].

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

Класс UpdateHandler

Создаем класс UpdateHandler (Листинг 1), который будет содержать две переменные (интервал обновления в миллисекундах и время с начала запуска игры, также в миллисекундах) и пять методов.

class UpdateHandler {

            private int  intervalMsec = 0;

            private long lastTimeMillis = SystemClock.uptimeMillis();

            UpdateHandler(int interval) {

                        intervalMsec = interval;

            }

            int interval() {

                        return intervalMsec;

            }

            void update(long msec) {

                        lastTimeMillis = msec;

            }

            long elapsed(long msec) {

                        return msec - lastTimeMillis;

            }

            void reset() {

                        lastTimeMillis = 0;

            }

}

Листинг 1. Класс UpdateHandler

Одноименный метод класса UpdateHandler принимает один параметер — интервал обновления, и приравнивает его значение переменной intervalMsec, а interval() возвращает это значение. update() принимает время в миллисекундах, прошедшее с начала загрузки, и приравнивает его переменной lastTimeMillis. elapsed() возвращает разницу между текущим временем от запуска игры и временем сохраненным в lastTimeMillis. reset() обнуляет lastTimeMillis.

Алгоритм работы слушателя

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

C использованием класса GLSurfaceView и его встроенного интерфейса Renderer, получаем доступ к трем абстрактным методам: onDrawFrame, onSurfaceCreated и onSurfaceChanged. Метод onSurfaceChanged вызывается при изменении экрана, onSurfaceCreated — при его создании, а onDrawFrame — при его обновлении, этот метод и поможет нам реализовать слушателя (Листинг 2) [2, 3].

public void onDrawFrame(GL10 gl) {

            if (updateIntervalMsec > 0 &&

                        SystemClock.uptimeMillis() - lastUpdateMsec > updateIntervalMsec) {

                        for (SceneUpdateListener listener : updateListeners.keySet()) {

                                   UpdateHandler handler = updateListeners.get(listener);

                                   if (handler.interval() <= 0) continue;

                                   long now = SystemClock.uptimeMillis();

                                   long elapsed = handler.elapsed(now);

                                   if (elapsed > handler.interval()) {

                                               listener.onUpdateScene(this, elapsed, gl);

                                               handler.update(now);

                                   }

                        }

                        lastUpdateMsec = SystemClock.uptimeMillis();

            }

}

Листинг 2. Алгоритм работы слушателя

Проверяем, инициализирован ли слушатель onUpdateScene (updateIntervalMsec > 0) и время прошедшее с момента последнего его вызова больше указанного при его инициализации (SystemClock.uptimeMillis() — lastUpdateMsec > updateIntervalMsec). SceneUpdateListener — это интерфейс (Листинг 3), содержащий абстрактный метод onUpdateScene, который будет в последствии переопределяться.

public interface SceneUpdateListener {

    void onUpdateScene(PeeKaBooScene scene, long elapsedMsec, GL10 gles10);

}

Листинг 3. Интерфейс для получения уведомления о события обновления сцены

updateListeners — хэш-таблица у которой, ключем является класс-слушатель SceneUpdateListener, а значением — UpdateHandler.

Важно внести возможность добавления и удаления слушателя (Листинг 4). Делаем это двумя методами: registerUpdateListener и unregisterUpdateListener.

public void registerUpdateListener(int intervalMsec, SceneUpdateListener listener) {

            UpdateHandler handler = new UpdateHandler(intervalMsec);

            updateListeners.put(listener, handler);

            int interval = intervalMsec > 100 ? intervalMsec / 100 : 1;

            if (updateIntervalMsec == 0) {

                        updateIntervalMsec = interval;

            } else {

                        updateIntervalMsec = Math.min(updateIntervalMsec, interval);

            }

}

public void unregisterUpdateListener(SceneUpdateListener listener) {

            updateListeners.remove(listener);

}

Листинг 4. Методы для добавления и удаления слушателя.

В методе registerUpdateListener создаем экземпляр класса UpdateHandler и добавляем ключ и значение в хэш-таблицу. Если интервал обновления был указан как ноль, меняем его на единицу. Если было введено число больше ста, делим это число на сто. Этим действием получаем десятые доли секунды.

В методе unregisterUpdateListener удаляем ключ из хэш-таблицы.

Получение уведомлений о события обновления сцены

Остаётся только реализовать интерфейс SceneUpdateListener, переопределить метод onUpdateScene и зарегестрировать слушателя методом registerUpdateListener (Листинг 5).

import pack.peekaboo.PeeKaBooActivity;

import pack.peekaboo.PeeKaBooScene;

public class MyActivity extends PeeKaBooActivity implements SceneUpdateListener {

            @Override

            public PeeKaBooScene onLoadScene() {

                        PeeKaBooScene scene = new PeeKaBooScene();

                        scene.registerUpdateListener(1, this);

                        return scene;

    }

            @Override

            public void onUpdateScene(PeeKaBooScene scene, long elapsedMsec,

                                                                                                                                 GL10 gles10) {

            }

Листинг 5. Пример использования слушателя события обновления сцены

В приведенном примере класс MyActivity наследуется от класса PeeKaBooActivity. Это класс фреймворка PeeKaBoo для работы с дополненной реальностью. В этом же фреймворке и применяется описанный выше алгоритм слушателя.

Заключение

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

Литература:

1.                 Марио Цехнер. Программирование игр под Android: [перевод.: Е. А. Сидорович, Е. В. Зазноба]; М.: Питер, 2013. — 688 с.

2.                 Android Developers. GLSurfaceView [Электронный ресурс]. — URL: http://developer.android.com/reference/android/opengl/GLSurfaceView.html (21.05.2014).

3.                 Android Developers. GLSurfaceView.Renderer [Электронный ресурс]. — URL: http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html (21.05.2014).

Основные термины (генерируются автоматически): время, интервал обновления, Листинг, частота обновления экрана, алгоритм работы слушателя, дополненная реальность, запуск игры, класс, разработчик игры, событие обновления сцены, удаление слушателя.

Ключевые слова

программирование, Android, алгоритмы, GLSurfaceView, игра в прятки, кадронезависимое движение, обновление экрана, PeeKaBoo

Похожие статьи

Использование библиотеки CoreUI в приложениях .NET+React.js

В данной научной работе рассматривается использование CoreUI -шаблона панели управления и библиотеки компонентов пользовательского интерфейса, в приложении.NET Core c React.js. Приводится сравнительная характеристика способов подключения библиотеки в...

Особенности разработки языковых модулей для IDE NetBeans на примере языка HAML

Исследован вопрос выбора среды разработки для Ruby on Rails проектов. Показано отсутствие готовых полноценных решений. Обосновано преимущество доработки IDE NetВeans для формирования готово рабочего места Ruby on Rails программиста. На примере HAML-п...

Разработка веб-сервиса для хранения и передачи данных

В данной статье рассматривается процесс разработки веб-сервиса для облачного хранения и передачи данных, описываются основные аспекты создания серверной части с использованием фреймворка Spring и реализации клиентской части с использованием React, а ...

Разработка веб-портала для информационной поддержки предприятия общественного питания

В данной статье представлена разработка веб-портала для информационной поддержки предприятия общественного питания. Целью разработки является повышение продуктивности работы предприятия. Были проанализированы требования к веб-порталу, разработана стр...

Разработка веб-приложения «Семейный органайзер»

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

Управление шаговым двигателем с использованием микроконтроллера ATmega16 и LabVIEW

В настоящей статье рассмотрен один из множества вариантов управления шаго-вым двигателем (ШД) Nanotec ST5918M1008. Статья будет полезна разработчикам столкнувшихся с реализацией управляющей программы для разработки алгоритмов свя-занных с шаговыми дв...

Организация многомодульной, слабосвязанной архитектуры приложения при работе с Gradle

В статье описывается подход для реализации многомодульной, слабосвязанной архитектуры в Android приложении, с использование системы сборки Gradle. Рассматриваться проблемы, которые возникают в процессе разработки, и пути их решения.

Hibernate-6: обзор изменений и преимуществ

Современное развитие технологий требует обновления фреймворков. Данная статья анализирует изменения в Hibernate при переходе с 5 на 6 версию. Рассматриваются новые возможности, изменения в API и аннотациях, а также предоставляются практические советы...

Требования к разработке специализированных меток для функционирования маркерных приложений с AR-технологией на базе платформы Vuforia

Данная статья посвящена теме разработки и корректуры маркеров для AR-приложений. В настоящей работе отображается процесс взаимодействия с алгоритмом анализа маркеров Vuforia, демонстрируется перечень требований к разработке, а также реализация коррек...

Веб-разработка на уроках информатики. Фронтенд-разработчик

В статье рассмотрена идея применение полученных знаний по информатике для открытия своего бизнеса или работа в стиле фриланс. Рассмотрена только техническая часть этого процесса. Предложена программа обучения. Обучение возможно с полного нуля до веб-...

Похожие статьи

Использование библиотеки CoreUI в приложениях .NET+React.js

В данной научной работе рассматривается использование CoreUI -шаблона панели управления и библиотеки компонентов пользовательского интерфейса, в приложении.NET Core c React.js. Приводится сравнительная характеристика способов подключения библиотеки в...

Особенности разработки языковых модулей для IDE NetBeans на примере языка HAML

Исследован вопрос выбора среды разработки для Ruby on Rails проектов. Показано отсутствие готовых полноценных решений. Обосновано преимущество доработки IDE NetВeans для формирования готово рабочего места Ruby on Rails программиста. На примере HAML-п...

Разработка веб-сервиса для хранения и передачи данных

В данной статье рассматривается процесс разработки веб-сервиса для облачного хранения и передачи данных, описываются основные аспекты создания серверной части с использованием фреймворка Spring и реализации клиентской части с использованием React, а ...

Разработка веб-портала для информационной поддержки предприятия общественного питания

В данной статье представлена разработка веб-портала для информационной поддержки предприятия общественного питания. Целью разработки является повышение продуктивности работы предприятия. Были проанализированы требования к веб-порталу, разработана стр...

Разработка веб-приложения «Семейный органайзер»

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

Управление шаговым двигателем с использованием микроконтроллера ATmega16 и LabVIEW

В настоящей статье рассмотрен один из множества вариантов управления шаго-вым двигателем (ШД) Nanotec ST5918M1008. Статья будет полезна разработчикам столкнувшихся с реализацией управляющей программы для разработки алгоритмов свя-занных с шаговыми дв...

Организация многомодульной, слабосвязанной архитектуры приложения при работе с Gradle

В статье описывается подход для реализации многомодульной, слабосвязанной архитектуры в Android приложении, с использование системы сборки Gradle. Рассматриваться проблемы, которые возникают в процессе разработки, и пути их решения.

Hibernate-6: обзор изменений и преимуществ

Современное развитие технологий требует обновления фреймворков. Данная статья анализирует изменения в Hibernate при переходе с 5 на 6 версию. Рассматриваются новые возможности, изменения в API и аннотациях, а также предоставляются практические советы...

Требования к разработке специализированных меток для функционирования маркерных приложений с AR-технологией на базе платформы Vuforia

Данная статья посвящена теме разработки и корректуры маркеров для AR-приложений. В настоящей работе отображается процесс взаимодействия с алгоритмом анализа маркеров Vuforia, демонстрируется перечень требований к разработке, а также реализация коррек...

Веб-разработка на уроках информатики. Фронтенд-разработчик

В статье рассмотрена идея применение полученных знаний по информатике для открытия своего бизнеса или работа в стиле фриланс. Рассмотрена только техническая часть этого процесса. Предложена программа обучения. Обучение возможно с полного нуля до веб-...