Главная » Просмотр файлов » Пояснительная записка

Пояснительная записка (1226228), страница 5

Файл №1226228 Пояснительная записка (Платформа для создания приложений обучающих решению задач по начертательной геометрии) 5 страницаПояснительная записка (1226228) страница 52020-10-06СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

– OpenGL ES 2.0 – поддерживается в Android 2.2 (API 8) и выше;

– OpenGL ES 3.0 – поддерживается в Android 4.3 (API 18) и выше;

– OpenGL ES 3.1 – поддерживается в Android 5.0 (API 21) и выше.

Разработка приложений с использованием OpenGL ES версий 2.0 и 3.0 имеет много общего, т. к. версия 3.0 является расширением версии 2.0 за счёт различных дополнительных возможностей.

Использование версии OpenGL ES 1.x значительно отличается от более поздних версий OpenGl ES API, поэтому разработчикам нужно учитывать несколько факторов при выборе используемого в своём приложении API:

– быстродействие – как правило, OpenGL ES 2.0 и старше обеспечивают более высокое быстродействие графики, чем версия 1.x. Однако на быстродействие графики также оказывает влияние само устройство, т.к. графический конвейер может быть реализован по-разному на аппаратном уровне производителем устройства;

– совместимость устройств – разработчики должны учитывать типы устройств, версии системы Android и, соответственно, версии OpenGL ES API потенциальных пользователей приложения;

– удобство программирования – OpenGL ES 1.x предоставляет ограниченный набор функций, которые недоступны в OpenGL ES 2.0 и выше. Начинающие разработчики могут найти разработку с использованием версий OpenGL ES 1.x более удобной и быстрой;

– управление графическим конвейером – версии OpenGL ES 2.0 И 3.х предоставляют разработчику больше возможностей для программирования графического конвейера (например, шейдеры), благодаря чему появляется возможность создания таких эффектов, которые было бы весьма трудно реализовать с использованием OpenGL EX 1.x API;

– поддержка текстур – OpenGL ES 3.0 поддерживает сжатие текстур ETC2, в то время как версии 1.х и 2.0 поддерживают только ETC1. Использование ETC2 выгодно отличается от ETC1 поддержкой прозрачности, для реализации которой в версиях 1.х и 2.0 нужно выбирать другие форматы сжатия, поддерживаемые целевым устройством. [12]

Применение OpenGL ES имеет ряд особенностей. Для того, чтобы можно было в Activity создавать графические объекты с помощью OpenGL, необходимо создать специальное представление (View):

private GLSurfaceView glSurfaceView;

GLSurfaceView обеспечивает работу в отдельном потоке для визуализации OpenGL. Таким образом, UI поток у нас не занят. GLSurfaceView поддерживает непрерывный или по требованию рендеринг (обновление, перерисовка содержимого на экране), поддерживает настройки экрана для EGL – интерфейса между OpenGL и оконной системой Android. [10]

Прежде чем использовать методы OpenGL ES 2.0, необходимо выяснить, поддерживается ли данным устройством этот API. Для этого в метод onCreate добавляем строки:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();

return (configurationInfo.reqGlEsVersion >= 0x20000);

Обращаясь к Диспетчеру Активностей для получения данных о конфигурации устройства. Среди этих данных интересующая информация: поддерживает ли устройство OpenGL ES 2.0 – содержится в поле reqGlEsVersion, значение которого и проверяется.

Если OpenGL ES 2.0 не поддерживается, то константе supportsEs2 будет присвоено значение True. В этом случае нельзя создать экземпляр класса GLSurfaceView:

if (!supportES2()) {

Toast.makeText(this, "OpenGl ES 2.0 is not supported", Toast.LENGTH_LONG).show();

finish();

return;

Для указания версии OpenGL ES, с которой требуется работать в данном приложении используется следующая команда:

glSurfaceView.setEGLContextClientVersion(2);

Далее необходимо установить визуализатор (Renderer) – интерфейс, который отвечает за обращение к OpenGL для прорисовки изображения:

glSurfaceView.setRenderer(new OpenGLRenderer(this));

Таким образом метод setRenderer устанавливает визуализатор для отображения в представлении mGLSurfaceView. В качестве параметра при вызове это метода указан класс NewRenderer, который реализует требуемый визуализатор.

В методе onCreate также надо устанавить mGLSurfaceView в качестве представления текущей активности:

setContentView(glSurfaceView);

Когда у активности в соответствии с её жизненным циклом будут выполняться методы onResume и onPause, необходимо, чтобы соответствующие методы вызывались и у GL-поверхности:

@Override

protected void onPause() {

super.onPause();

glSurfaceView.onPause();

}

@Override

protected void onResume() {

super.onResume();

glSurfaceView.onResume();

}

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

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

– public void onSurfaceCreated(GL10 glUnused, EGLConfig config) – этот метод вызывается, когда поверхность создается. Это происходит при запуске приложения, при переключении пользователя обратно в данную активность. То есть данный метод может вызываться несколько раз во время работы приложения;

– public void onSurfaceChanged(GL10 glUnused, int width, int height) – этот метод вызывается после создания поверхности и каждый раз, когда происходит изменение размера поверхности, а также при переключении с портретной ориентации на альбомную и наоборот;

– public void onDrawFrame(GL10 glUnused) – этот метод вызывается каждый раз, когда необходимо прорисовать новый кадр.

При использовании OpenGL ES2 всё, что необходимо отобразить на экране, сначала нужно пропустить через вершинный и фрагментный (пиксельный) шейдеры. Шейдеры – это программы, в которых осуществляется почти вся логика по обработке моделей. Вершинные шейдеры занимаются обработкой каждой вершины и нахождение её координат с учетом матрицы преобразования и прочих, условий. Для этого вершинный шейдер получает все параметры вершины (координаты, цвет, данные по текстуре т.д.). Также основная программа может передать шейдеру любые другие параметры. Далее результат этих операций передаются и используются в фрагментном шейдере, который осуществляет дополнительные расчеты по каждому пикселю. [13]

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

Вершинный шейдер определен в файле с расширением XML DTD следующим образом:

attribute vec4 a_Position;

uniform mat4 u_Matrix;

void main()

{

gl_Position = a_Position;

gl_PointSize = 5.0;

}

Каждый шейдер в основном состоит из точки входа, выхода, и самой логики программы. Константа u_MVPMatrix представляет собой комбинированную матрицу, содержащую значения всех преобразований. Эта матрица используется для всех вершин при проецировании их на экран. Далее определены две константы-атрибуты: положение вершин и размер точки. Значения в них будут переданы из числового байт-буфера, который описан ранее. В нём уже содержатся данные о положении для каждой вершины. Далее определены переменные, значения которых описывают объекты, значения которых передаются в фрагментный шейдер.

В окончании программы вершинного шейдера сообщается OpenGL окончательное положение вершин, расположенных на экране, в виде нормированных координат. Это необходимо сделать по следующей причине: одной из проблем в отображении графики на устройствах с ОС Android является то, что их экраны могут сильно различаться в размерах и форме.

Загрузка программы шейдеров в OpenGL осуществляется следующим образом:

int vertexShaderId = ShaderUtils.createShader(context, GL_VERTEX_SHADER, R.raw.vertex_shader);

int fragmentShaderId = ShaderUtils.createShader(context, GL_FRAGMENT_SHADER, R.raw.fragment_shader1);

programId = ShaderUtils.createProgram(vertexShaderId, fragmentShaderId);

Далее в методе onSurfaceCreated необходимо определить указатели на атрибуты шейдера:

uColorLocation = glGetUniformLocation(programId, "u_Color");

glUniform4f(uColorLocation, 0.0f, 0.0f, 0.0f, 1.0f);

aPositionLocation = glGetAttribLocation(programId, "a_Position");

vertexData.position(0);

glVertexAttribPointer(aPositionLocation, 2, GL_FLOAT,

false, 0, vertexData);

glEnableVertexAttribArray(aPositionLocation);

Сообщить OpenGL, чтобы при визуализации он использовал созданную ранее программу.

glUseProgram(programId);

3.2 Создание анализатора файлов заданий

Одной из наиболее привлекательных черт платформы Android является использование языка программирования Java. SDK Android поддерживает не всю, но достаточно большую часть возможностей стандартной среды выполнения Java (Java Runtime Environment – JRE) [14]. Сама платформа Java уже долгое время поддерживает множество различных способов использования XML, причем большинство API для Java, ориентированных на XML, доступны в Android. Примерами таких API могут служить объектная модель документов (Document Object Model – DOM) и простой Java API для XML (Java's Simple API for XML – SAX), которые уже много лет являются частью технологии Java. Обратным примером является более новый потоковый API (Streaming API for XML – StAX), который не поддерживается в Android (при этом в состав Android входит эквивалентная по своим возможностям библиотека). В Android также недоступен API для связывания с данными XML (Java XML Binding – JAXB). Его безусловно можно реализовать для данной платформы, однако он отличается некоторой тяжеловесностью, которая проявляется в том, что множество экземпляров разных классов часто требуется для представления документов XML. В связи с этим он является менее предпочтительным при создании приложений для портативных устройств, подобных тем, на которых работает Android. [16]

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

Код анализатора разделен на два класса:

– GrphParser, который реализует высокоуровневый анализатор;

– GrphHandler, обрабатывающий события анализатора во время анализа.

Структура классов приведена ниже.

public class GrphParser {

final URL feedUrl;

public GrphParser(String feedUrl){ }

public List<Exercise> parse() { }

protected InputStream getInputStream() { }

}

public class GrphHandler extends DefaultHandler{

// Имена тегов XML

static final String PUB_DATE = "pubDate";

static final String DESCRIPTION = "description";

static final String LINK = "link";

static final String TITLE = "title";

static final String ITEM = "item";

private List<Exercise> exercises_;

public List<Exercise> getExercises(){ }

@Override

public void characters(char[] ch, int start, int length)

throws SAXException { }

@Override

public void endElement(String uri, String localName, String name) throws SAXException { }

@Override

public void startDocument() throws SAXException { }

@Override

public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { }

}

Поскольку вся логика, связанная с анализом лексем входной цепочки реализована в классе GrphHandler, метод разбора в классе GrphParser очень прост:

public List<Exercise> parse() {

try {

GrphHandler handler = new GrphHandler();

return handler.getExercises();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

Требуется реализовать методы startDocument(), startElement() и endElement(). Их реализация приведена ниже:

@Override

public void startDocument() throws SAXException {

super.startDocument();

exercises_ = new ArrayList<Exercise>();

}

@Override

public void startElement(String uri, String localName, String name,

Attributes attributes) throws SAXException {

super.startElement(uri, localName, name, attributes);

if (localName.equalsIgnoreCase(ITEM)){

this.currentExercise = new Exercise();

Характеристики

Список файлов ВКР

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7021
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее