Разработка эмулятора игрового автомата
Обзор рынка существующих эмуляторов на Android OS. Используемые языки и программное обеспечение: ассемблер, С++, Java, XML, Visual Studio 2015. Технические характеристики эмулируемой системы. Эмуляция памяти, видеочипа, аудиочипа и устройства ввода.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 28.05.2018 |
Размер файла | 265,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
СОДЕРЖАНИЕ
- Введение
- 1. Постановка задачи
- 1.1Характеристика предметной области
- 1.2Формулировка задачи
- 2. Обзор рынка сферы развлечений на Android OS
- 2.1Обзор рынка существующих эмуляторов на Android OS
- 2.2Ключевые особенности Android OS
- 3. Используемые языки и программное обеспечение
- 3.1Ассемблер (язык программирования)
- 3.2C++ (язык программирования)
- 3.3Java (язык программирования)
- 3.4XML (язык разметки)
- 3.5Visual Studio 2015 (среда разработки)
- 4. Описание разработанного приложения
- 4.1Термины и понятия
- 4.2Технические аспекты эмуляции
- 4.3Технические характеристики эмулируемой системы
- 4.4Описание алгоритма работы приложения
- 4.5Описание интерфейса приложения
- 4.6Эмуляция процессора Hitachi 6417709S SH3
- 4.7Эмуляция памяти
- 4.8Эмуляция видеочипа
- 4.9Эмуляция аудиочипа
- 4.10Эмуляция устройств ввода
- Заключение
- Список использованных источников
- Введение
- В настоящее время в эпоху стремительного прогресса в области информационных технологий каждый день создаются новые архитектурные решения, которые зачастую несовместимы с решениями вчерашнего дня. Программные продукты созданные в прошлом необходимы и сегодня, но не любое программное средство возможно перенести на новую архитектуру, потому что отсутствует исходный код приложения, либо требуется неоправданно много времени на модификацию исходного кода в целях возможности сборки на новую архитектуру.
- Один из способов, решающих проблему переносимости приложений на бинарном уровне является эмуляция архитектуры предыдущего поколения. В сфере развлечений такой подход используется повсеместно, особенно популярен данный подход у компаний, производящих аппаратные и программные продукты одновременно. Например, Sony выпуская очередную консоль стремилась обеспечить программную совместимость с консолями предыдущего поколения. В первых версиях, предназначенных для японского рынка, совместимость PlayStation 2 с PlayStation (PSX) достигнута благодаря аппаратной совместимости в результате схожести архитектур консолей, но в последующих версиях обратная совместимость обеспечена с помощью программной эмуляции. Аналогичный подход использован для поддержания продаж портативной Sony PSP, также PlayStation 3. Компания Microsoft также применяла эмуляцию консоли предыдущего поколения выпуская Xbox 360, но все же безусловным лидером применения технологии эмуляции в области развлечения является компания SEGA. Выпущенные компанией SEGA игровые приложения переиздавались и переиздаются по сегодняшний день, часто используя данную технологию. Компания также включает игровые приложения прошлого как часть игрового контента в новых релизах. Так, в одном из самых популярных игровых приложений для Sega Dreamcast Shenmue встроена эмуляция нескольких игр с игровых аркадных автоматов этой компании.
- Опыт лидеров рынка доказывает и указывает на востребованность и наличие коммерческой выгоды от применения технологии эмуляции в сфере развлечений.
- Целью данной дипломной работы является создание эмулятора аркадного автомата компании Sega для постоянно набирающей популярность операционной системы Android, созданной компанией Google, операционная система основана на исходном коде Linux.
- Предметом исследования является программное средство, обеспечивающие возможность запуска приложений, созданных для иной архитектуры. Объектом - пользователи, имеющих потребность в данном решении.
- В разделе 1 сформулирована задача.
- В разделе 2 предоставлен обзор конкурентных решений и предоставлено описание операционной системы Android.
- В разделе 3 рассмотрены средства разработки, указаны причины применений данных средств.
- В разделе 4 рассмотрено готовое решение: предоставлено описание интерфейса, описаны использованные приемы при разработке модулей приложения. На примерах предоставлено описание ключевых элементов каждого и модулей.
- В заключении подведен итог проделанной работы, сделаны выводы о проделанной работе.
1. ПОСТАНОВКА ЗАДАЧИ
1.1 Характеристика предметной области
В условиях быстрорастущего числа пользователей операционной системы Android у пользователей возникает потребность как в количественном, так и в качественном росте приложений, направленных на развлечение. Разработка абсолютного нового и успешного игрового приложения в современном мире может занимать не один год. Поэтому многими участникам рынка предприняты попытки переноса своих лучших игровых проектов на данную платформу, выпущенных много лет назад как на игровые консоли, так и на персональные компьютеры. Процесс переноса даже уже готового приложения требует больших ресурсов и не всегда приносит коммерческую прибыль. В этой связи в данной работе рассмотрим метод программной эмуляции как средство переноса приложений на операционную систему Android. Данный метод позволяет переносить не одно взятое приложение, а одновременно все приложения, выпущенные для иной аппаратной архитектуры.
1.2 Формулировка задачи
Разработать приложение эмулирующее работу аркадного автомата компании Cave для операционной системы Android.
Приложение должно удовлетворять следующим требованиям
· Совместимость с Android OS версии не ниже 2.3.3;
· Отсутствие ошибок в работе;
· Удобный и практичный интерфейс.
2. ОБЗОР РЫНКА СФЕРЫ РАЗВЛЕЧЕНИЙ НА ANDROID OS
2.1 Обзор рынка существующих эмуляторов на Android OS
На сегодняшний день рынок эмуляторов консолей и аркадных игровых автоматов для Android OS достаточно насыщен.
Рассмотрим эмуляторы игровых домашних систем в зависимости от поколений:
· Наиболее популярные игровые системы второго поколения Atari 2600/5200 представлены эмуляторами Atari 2600.emu, Droid 800.
· Третье поколение игровых систем, которое по-настоящему открыло миру рынок домашний игровых систем представлено множеством эмуляторов: Nintendo Famicom/NES представлено эмуляторам Mojo NES, NES.emu Nesoid и т.д., Sega Master System представлено DroidGear, Gearoid, MD.emu и и т.д.
· Четвертое поколение в лице наиболее известных игровых систем от компании Sega (Mega Drive/Genesis) представлено эмуляторами Gensoid, MD.emu, от компании Nintendo (Super Nintendo) - Snes9x EX, SNESDroid, SNesoid и т.д.
· Пятое поколение игровых систем известно в первую очередь появлению в игровой индустрии компании Sony с игровой системой PlayStation (PSX) наиболее совершенными эмуляторами данной консоли являются FPse и EPSXE.
Но начиная с пятого поколения консолей архитектуры игровых систем существенно усложнились, в связи с чем для иных представителей данного поколения (Panasonic 3DO, Nintendo 64, Sega Saturn) отсутствуют совершенные эмуляторы способные к безошибочному запуску всех созданных ранее приложений.
· Шестое и последующие поколения помимо сложности архитектур ограничили возможности полноценной эмуляции систем высокими техническими характеристиками аппаратной составляющей: частота и количество процессоров, высокопроизводительные видеосистемы, сложные устройства ввода и т.д.
Одновременно с эмуляторами домашних игровых систем, рынок приложений эмуляторов для Android OS представлен несколькими эмуляторами аркадных игровых систем, являющиеся портами, без существенных изменений, аналогичных приложений для Windows OS: FBA4droid, MAME4droid, как следствие, зачастую недостаточная скорость работы многих игровых приложений запускаемых данными эмуляторами.
Подводя итог, можно сделать вывод несмотря на то, что рынок эмуляторов хоть и насыщен и даже перенасыщен, но представленные на сегодня решения охватывают архитектуры домашний игровых систем до четвертого поколения, а рынок аркадных игровых автоматов неконкурентоспособен поскольку существующие решения не удовлетворяют требованиям потенциальных пользователей.
2.2 Ключевые особенности Android OS
Android OS - мобильная операционная система компании Google. В июле 2005 года корпорация Google купила компанию Android Inc. 5 ноября 2007 года компания официально объявила о создании Open Handset Alliance (OHA) и анонсировала открытую мобильную платформу Android, а 12 ноября 2007 года альянс представил первую версию пакета для разработчиков Android «Early Look» SDK и эмулятор Android. 23 сентября 2008 года официально вышла первая версия операционной системы, а также первый полноценный пакет разработчика SDK 1.0, Release 1.
Система Android - это программный стек для мобильных устройств, который включает операционную систему, программное обеспечение промежуточного слоя (middleware), а также основные пользовательские приложения (е-mаil-клиент, календарь, карты, браузер, контакты и др.) [1].
Архитектуру Aпdroid принято делить на четыре уровня:
· уровень ядра;
· уровень библиотек и среды выполнения;
· уровень каркаса приложений;
· уровень приложений.
Уровень ядра
Ядро является слоем абстракции и между оборудованием и остальной частью программного стека. На этом уровне располагаются основные службы типа управления процессами, распределения памяти и управления файловой системой.
Ядро Android основано на ядре Linux версии 2.6, но сама система Android не является Linuх-системой в чистом виде, имеет некоторые отличия и содержит дополнительные расширения ядра, специфичные для Android, - свои механизмы распределен и я памяти, взаимодействие между процессами и др.
Основные компоненты уровня ядра:
· драйвер меж процессного взаимодействия (IPC Driver);
· драйвер управления питанием (Android Power Management);
· набор драйверов для оборудования, входящего в состав мобильного устройства.
Рассмотрим кратко основные компоненты ядра Android.
Драйвер IPC
Приложения и службы могут работать в защищенных отдельных процессах, которые должны общаться между собой и иметь доступ к общим данным.
Платформа Android обеспечивает механизм IPC (Inter-process Communication), который является основным механизмом взаимодействия между процессами [1].
Драйвер IPC обеспечивает следующую функциональность:
· взаимодействие процессов;
· создание и обработку пулов потоков в процессах;
· подсчёт и отображение ссылок на объекты в других процессах;
· синхронные запросы между процессами.
Управление энергопотреблением
Система управления энергопотреблением (Android Power Management) разработана на основе стандартного драйвера управления я питанием Linux, но оптимизирована для мобильных устройств с учетом и х специфических особенностей.
Драйверы оборудования
Программный стек Android разработан с учетом необходимой гибкости, включая работу со многими дополнительными компонентам и, и мающимися в мобильных устройствах. Эти компоненты в значительной степени полагаются на доступность определённых аппаратных средств на данном устройстве.
Они предоставляют дополнительную функциональность для мобильных устройств (сенсорный экран, камера, GPS, акселерометр и т. д.).
Встроенные драйверы включают в себя поддержку работы с оборудованием мобильного устройства. Набор драйверов может быть различным в зависимости от производителя и модели устройства. Поскольку новое вспомогательное оборудование для мобильных устройств постоянно появляется на рынке, драйверы для них должны быть написаны на уровне ядра Linux для обеспечения поддержки оборудования, также, как и для настольных Linux-cиcтeм.
Преимущества использования ядра Linux как основы Android в том, что ядро системы позволяет верхним уровням программного стека оставаться неизменными, несмотря на различия в используемом оборудовании. Конечно, хорошая практика программирования требует, чтобы пользовательские приложения корректно завершали свою работу в случае вызова ресурса, являющегося недоступным, например, камеры, не присутствующей в данной модели смартфона.
Уровень библиотек
Следующий уровень над ядром Linux является набором библиотек С/С++ типа OpenGL, WebKit, FreeType, SSL, библиотеки поддержки libc, базы данных SQLite и мультимедиа библиотек (Media Framework). Системная библиотека базируется на Berkeley Software Distribution (BSD) и разработана для мобильных устройств на основе Linux [2].
Следующий уровень над ядром Linux включает набор библиотек С/С++, используемых различным и компонентами ОС. Для разработчиков доступ к функциям этих библиотек реализован через использование Application Framework - каркаса приложений. Библиотеки этого уровня по своему функциональному назначению можно разделить на следующие группы:
· системная библиотека С;
· менеджер поверхностей;
· функциональные библиотеки С/С++.
Среда выполнения
Среда выполнения обеспечивает библиотеки ядра Dalvik Virtual Machine (виртуальная машина Dalvik), которые предоставляют требуемую функциональность для Jаvа-приложений.
Прикладное программное обеспечение, запускаемое на мобильном устройстве, исполняет виртуальная машина Dalvik, которая хоть и является аналогом виртуальной машины Java, существенно от нее отличается. Dalvik относится к классу регистровых машин (регистры процессора используются как первичные модули хранения данных), идеально подходящих для работы на процессорах RISС-архитектуры, к которым относятся и процессоры ARM, применяемые в мобильных устройствах, тогда как стандартная виртуальная машина Java компании Sun Microsystems - стековая.
Созданные с помощью стандартного Jаvа-компилятора сlаss-файлы преобразуются в байт-код Dalvik (*.dex) транслятором dx, входящим в состав SDK.
Изнутри работающий Android выглядит как набор виртуальных машин Dalvik, в каждой из которых исполняется прикладная задача.
Виртуальная машина Dalvik, на которой построена вся операционная система Google Android, дает разработчикам приложений удобный механизм для написания приложений, которым не принципиален объем используемой памяти мощность процессора [2].
3. ИСПОЛЬЗУЕМЫЕ ЯЗЫКИ И ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
3.1 Ассемблер (язык программирования)
Assembler -- язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.
Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данных через метки с символьными именами и директивы [4].
Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.
Различают два основных синтаксиса языка: AT&T и Intel. Основное отличие между которыми заключено в порядке следования источника и приемника у мнемоник.
Достоинства:
· отсутствие избыточности кода, меньшее количество команд и обращений в память. Как следствие -- большая скорость с одновременно меньшим размером кода;
· максимальная оптимизация с учетом всех особенностей конвейера платформы, кэша инструкций, использование специальных инструкций и т.д
· возможность создания самомодифицирующегося кода.
Недостатки:
· большие объемы листинга, большое число дополнительных мелких задач;
· низкая читабельность кода, трудность поддержки (отладка, расширение функционала);
· сложность реализации парадигм программирования и любых других сколько-нибудь сложных конвенций;
· сложность совместной разработки;
· малое количество доступных библиотек, их малая совместимость;
· непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора;
· отсутствие возможности мультиплатформенной разработки приложений.
В разрабатываемом приложении необходимость использования данного языка обусловлена оптимизацией кода с помощью набора команд NEON процессоров, построенных на архитектуре ARM, участка кода отвечающего за эмуляцию видеочипа.
3.2 C++ (язык программирования)
Си++ (англ. C++) -- компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; объектно-ориентированную. Разработка языка началась в 1979 году. Целью создания C++ было дополнение C новыми возможностями. Основное нововведение по сравнению с C является поддержка объектно-ориентированного программирования через классы. C++ предоставляет все четыре возможности ООП -- абстракцию, инкапсуляцию, наследование и полиморфизм [5].
Кроме того, в язык C++ по сравнению с C добавлена:
· поддержка обобщённого программирования через шаблоны функций и классов;
· стандартная библиотека C++ состоит из стандартной библиотеки C (с некоторыми модификациями) и библиотеки шаблонов (Standard Template Library, STL), которая предоставляет обширный набор обобщенных контейнеров и алгоритмов;
· дополнительные типы данных;
· обработка исключений;
· виртуальные функции;
· пространства имён;
· встраиваемые (inline) функции;
· перегрузка (overloading) операторов;
· перегрузка имён функций;
· ссылки и операторы управления свободно распределяемой памятью.
Множество символов языка включает:
· прописные буквы латинского алфавита;
· строчные буквы латинского алфавита;
· арабские цифры;
· разделители: , . ; : ? ! ' " | / \ ~ _ ^ ( ) { } [ ] < > # % & - = + *
Остальные символы могут быть использованы только в символьных строках, символьных константах и комментариях. Язык C++ различает большие и маленькие буквы, таким образом, name и Name - разные идентификаторы.
Литералы в языке C++ могут быть:
1. Целые:
· десятичные: 10, 132, -32179;
· восьмеричные (предваряются символом «0»): 010, 0204;
· шестнадцатеричные (содержат префиксы «0х»): 0хА, 0x84, 0x7db3.
2. Вещественные: 15.75, 1.575e1, .75, -.125
3. Символьные: 'a', 'e', '.', '?', '2'.
4. Строковые: "строка".
Основные типы в C++ подразделяются на две группы: целочисленные типы и типы с плавающей точкой.
В C++ нет стандарта на диапазоны значений арифметических типов (в стандарте языка оговариваются лишь минимально допустимые значения). Диапазоны диктуется эффективностью использования вычислительных возможностей компьютера.
К целочисленным типам относятся типы, представленные следующими именами основных типов:
· char;
· short;
· int;
· long.
Имена целочисленных типов могут использоваться в сочетании с парой модификаторов типа:
· signed;
· unsigned.
Данные модификаторы изменяют формат представления данных, но не влияют на размеры выделяемых областей памяти.
Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения, при этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления знака. Если этот бит установлен в 0, то значение переменной считается положительным. Если бит установлен в 1, то значение переменной считается отрицательным.
Модификатор типа unsigned указывает, что переменная принимает только неотрицательные значения.
К плавающим типам относятся, представленные следующими именами типов:
· float;
· double.
Плавающие типы используются для работы с вещественными числами, которые представляются в форме записи с десятичной точкой.
В разрабатываемом приложении необходимость использования данного языка обусловлена: скоростью разработки приложения, а также скоростью выполнения конечного приложения, благодаря компиляции кода в машинный код процессора на котором предполагается запуск приложения.
3.3 Java (язык программирования)
Java -- объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года [6].
Программы на Java транслируются в байт-код, выполняемый на виртуальной java-машине (JVM) -- программе, обрабатывающей байт-код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байт-код, в отличие от текста, обрабатывается значительно быстрее [7].
Применяемый способ выполнения программ обеспечивает независимость приложения от операционной системы и оборудования, что позволяет осуществлять перенос приложение на любое устройство на котором присутствует виртуальная машина. Использование виртуальной машины также изолирует приложения от устройства обеспечивая высокую безопасность.
Из недостатков применения виртуальной машины необходимо отметить существенное снижение скорости выполнения приложения.
Синтаксис языка Java много общего с C и C++. В Java определены унарные и бинарные арифметические, логические и битовые операции, несколько операций присваивания, тренарная условная операция, явные и неявные операции приведения типов (причем все перечисленные операции имеют такие же обозначения и приоритеты, что и соответствующие операции C/C++). Как и в C++ в Java определены управляющие операторы if, if-else, break, switch, return, while, do-while, for, continue (все перечисленные операторы имеют семантику аналогичную семантике соответствующих операторов C/C++). В Java, аналогично С++, определены классы, имеющие закрытую (private), ограниченно доступную (protected) и общедоступную (public) области.
Java имеет также существенные отличия от C++:
В языке нет указателей; все объекты программы расположены в куче и доступны по объектным ссылкам, которые представляют объекты во всех структурах, в которые могут входить объекты в качестве компонентов. При работе с кучей программист не может пользоваться взаимным расположением объектов в памяти. Это решение исключило непосредственный доступ к памяти и усложнило работу с элементами массивов и, чем снизило эффективность Java-программ по сравнению с C++-программами.
В Java пересмотрена и концепция C/C++ динамического распределения памяти. Исключена функция освобождения динамически выделенной памяти free(). В Java разработана и реализована система автоматического освобождения динамически выделенной памяти.
Необходимо также отметить, что в куче размещаются все данные Java-программы. Это означает, что хотя в Java и определены данные простых типов (byte, short, int, long, char, float, double, boolean) переменные этих типов могут быть лишь атрибутами объектов. Отсюда следует, что если нужно завести переменную, например, целого типа (int), то необходимо завести объект класса Int, который имеет один атрибут типа int и два метода - соответственно чтения значения этого атрибута и записи в него нового значения. эмулятор язык программный ассемблер
В Java отсутствует свойственные языку C++ файлы заголовки и механизм препроцессорной обработки.
В разрабатываемом приложении применение данного языка обусловлено особенностями архитектуры Android OS. Несмотря на возможность создания полностью нативного приложения под данную ось, элементы управления приложения эффективнее все же реализовывать с помощью языка Java.
3.4 XML (язык разметки)
XML - расширяемый язык разметки; Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров. XML разработан как язык с простым формальным синтаксисом, удобным для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, нацелен на использование в Интернете. Пример простейшего XML- представлен в Листинге 1.
Листинг 1 - Пример XML - документа
<?xml version="1.0"?>
<list_of_items>
<item id="1"><first/>Первый</item>
<item id="2">Второй <sub_item>подпункт 1</sub_item></item>
<item id="3">Третий</item>
<item id="4"><last/>Последний</item>
</list_of_items>
Документ имеет общие черты с HTML-разметкой: инструкции, заключенные в угловые скобки, называются тэгами и служат для разметки основного текста документа. Тело документа XML состоит из элементов разметки и непосредственно содержимого документа - данных. XML - тэги предназначены для определения элементов документа, их атрибутов и других конструкций языка.
XML- документы должны удовлетворять следующим требованиям:
· В заголовке документа помещается объявление XML, в котором указывается язык разметки документа, номер его версии и дополнительная информация;
· Все тэги документа должны быть иметь как открывающий тэг, так и закрывающий тэг;
· В XML учитывается регистр символов;
· Значения атрибутов заключатся в кавычки;
· Вся информация, располагающаяся между начальным и конечными тэгами, рассматривается в XML как данные, включая пробелы, переводы строк, табуляцию и т.д.;
Содержимое XML- документа состоит из:
· секций CDATA;
· директив анализатора;
· комментариев;
· спецсимволов;
· текстовых данных.
В разрабатываемом приложении применение данного языка обусловлено особенностями разработки под архитектуру Android OS: с помощью XML верстки в данном приложении описаны элементы интерфейса.
3.5 Visual Studio 2015 (среда разработки)
Среда разработки Visual Studio 2015 представляет собой полный набор средств разработки для создания веб-приложений ASP.NET, XML (веб-службы), настольных приложений и мобильных приложений. Visual Basic, Visual C# и Visual C++ используют единую интегрированную среду разработки (IDE), которая позволяет совместно использовать средства и упрощает создание решений на базе нескольких языков. Кроме того, в этих языках используются функциональные возможности платформы .NET Framework, которая позволяет получить доступ к ключевым технологиям, упрощающим разработку веб-приложений ASP и XML (веб-службы) [8].
Visual Studio 2015 содержит:
· Редактор исходного кода с поддержкой технологии IntelliSense и возможностью простейшего рефакторинга кода;
· Встроенный отладчик может работать как отладчик уровня исходного кода, так и как отладчик машинного уровня;
· Редактор форм для упрощения создания графического интерфейса приложения;
· веб-редактор;
· дизайнер классов;
· дизайнер схемы базы данных.
Visual Studio 2015 позволяет создавать и подключать сторонние дополнения (плагины) для расширения функциональности, включая добавление поддержки систем контроля версий исходного кода (Subversion и Visual SourceSafe), добавление новых наборов инструментов (например, для редактирования и визуального проектирования кода напредметно-ориентированных языках программирования) или инструментов для прочих аспектов процесса разработки программного обеспечения (например, клиент Team Explorer для работы с Team Foundation Server) [9].
Visual Studio 2015 как среда разработки выбрана для разработки приложения, потому что содержит непревзойденный по удобству и функционалу интерфейс, совместно с отладчиком позволяющим получить информацию о любом состоянии программы начиная от содержимого регистров процессора, заканчивая просмотром участка памяти по указанному адресу. Присутствует возможность отладки приложения как на физическом устройстве, так и с помощью специально оптимизированного эмулятора, скорость работы последнего не сравнимо выше аналогичных приложений.
4. Описание разработанного приложения
4.1 Термины и понятия
Эмуляция -- комплекс программных, аппаратных средств или их сочетание, предназначенное для копирования (или эмулирования) функций одной вычислительной системы (гостя) на другой, отличной от первой, вычислительной системе (хосте) таким образом, чтобы эмулированное поведение как можно ближе соответствовало поведению оригинальной системы (гостя) [10].
Программный эмулятор состоит из следующих основных частей:
1. Эмуляция процессора - эмулирует работу каждой команды процессора и всех компонентов процессора (контролёров прямого доступ к памяти (DMA), таймеров (TMU), блока управления памятью (MMU) и т.д.).
Эмуляция команд процессора возможна двумя способами:
· Интерпретация - покомандное выполнение исходного кода программы интерпретатором без предварительной компиляции.
· Динамическая рекомпиляция - покомандный предварительный анализ, компиляция с последующим выполнением кода.
2. Эмуляция прерываний системы - получает от устройств системы и выставляет/снимает прерывания у процессора.
3. Эмуляция памяти - осуществляет трансляцию физических адресов памяти эмулируемой системы отправляя/получая данные из оперативной/постоянной памяти и устройств, расположенных в адресном пространстве системы.
4. Эмуляция устройств - эмулирует работу каждого из устройств системы (видео/аудио чипов, устройств вводы/вывода информации и т.д.).
4.2 Технические аспекты эмуляции
Эмуляция процессора
Основная задача данного компонента системы это эмуляция работы каждой команды процессора эмулируемой системы. Схематически процесс приведен на рисунке 4.1:
Рисунок 4.1 - Блок схема эмуляции команд процессора
Рассмотрим данный процесс на примере эмуляции процессора с x86-32 архитектурой.
Память заполнена данными: 0x33С040.
Исходя из того, что набор команды у x86-32 имеет CISC-архитектуру неизвестна длина каждой команды, следовательно, читаем данные из памяти по одному байту. Первый байт 0x33 - согласно документации, это соответствует команде XOR. Параметры данной команды задаются с помощью ModR/M байта. Получаем следующий байт 0xC0.
Из документации известно ModR/M байт состоит из трех полей:
1) Поле MOD - биты 6 и 7 задают способ адресации;
2) Поле REG - биты 3, 4 , 5 определяет номер регистра, либо уточняют код операции
3) Поле R/M - биты 0, 1, 2 определяют либо номер регистра либо совместно с полем MOD определяют способ адресации.
В данном случае байт 0xC0 определяет, поле MOD равное трём, поля REG и R/M имеют нулевые значения, что соответствует операции с источником и назначением в регистрах процессора с порядковым номером ноль (регистр EAX).
Команда декодирована полностью, этапы чтения/декодирования завершены, в результате необходимо исполнить команду XOR EAX, EAX, что соответствует операции «исключающее или» с регистром EAX.
По окончании этапа исполнения, читаем следующий байт 0x40 в результате декодирования получаем команду INC EAX, что соответствует увеличению значения, содержащегося в регистре EAX на 1.
Аналогичным образом строится процесс эмуляции всех команд процессора.
Эмуляция прерываний системы.
Прерывание - сигнал, который сообщает процессору о наступлении какого-либо события. Прерывания применяются для снижения нагрузки на центральный процессор. Предположим, что в момент, когда контролер прямого доступа осуществляет чтение данных с внешнего устройства данных в оперативную память системы одновременно процессор может производить иные расчеты, но по окончании передачи данных контроллер по средствам прерывания просигнализирует процессор об окончании работы. В отсутствии механизма прерываний процессору в момент работы контролера пришлось бы ожидать окончания работы контролера и не осуществлять никаких иных расчетов.
Процесс эмуляции прерывания зависит от механизма обработки прерываний в каждой конкретной системе, но общие принцип эмуляции сводится к хранению текущих статусов от каждого устройства и отправки статусов в процессор по мере возможности обработать прерывание процессором. В свою очередь процессор, получая и обрабатывая прерывания, сообщает инициатору прерывания об окончании обработки таким образом снимая с ожидания данное прерывание.
Эмуляция памяти
Во время эмуляции процессора, устройств, контролеров прямого доступа к памяти и так далее возникает необходимость в трансляции адресов эмулируемой системы с целью отправки/получения данных в/из оперативной или постоянной памяти, устройств.
Схематически процесс трансляции адрес представлен на рисунке 4.2:
Рисунок 4.2 - Блок схема трансляции адресов памяти
Рассмотрим процесс трансляции памяти на примере системы с разбиением адресного пространства на области согласно данным приведенным в таблице 4.1:
Таблица 4.1 - Разбиение адресного пространства абстрактной архитектуры
Компонент системы |
Начальный адрес |
Конечный адрес |
|
Постоянная память |
0x00000000 |
0x00FFFFFF |
|
Оперативная память |
0x01000000 |
0x01FFFFFF |
|
Устройство |
0x02000000 |
0x03FFFFFF |
Предположим, от процессора поступило задание на чтение данных по адресу 0x00001000, исходя из имеющегося разбиения адресного пространства определим: необходимо прочитать значение из постоянной памяти, аналогично получив задание на запись данных по адресу 0x02001000, отправим запрос в устройство.
Эмуляция устройств
Взаимодействие процессора с устройствами осуществляется с помощью предусмотренных протоколов через аппаратные регистры. Во время эмуляции устройства необходимо предоставлять ответы процессору аналогичные ответам, предоставляемым эмулируемыми устройствами на физической системе, а также в зависимости от назначения устройства осуществлять: вывод/ввод информации (видео/аудио чипы и т.д.), чтение данных (носители информации) и т.д.
Эмуляцию устройства удобно рассмотреть на примере получения данных с CDROM, использующем ATAPI протокол. ATAPI протокол в упрощенном виде представляет собой управление с помощью 12 байтных пакетов данных отправляемых процессором с помощью записи шести двойных слов в управляющий регистр.
Например, отправив последовательность:
0xbe - идентификатор команды;
0x00 - формат диска;
0x00000000 - адрес сектора с которого начать чтение;
0x00 - зарезервировано;
0x0001 - число секторов для чтения;
0x10 - формат чтения данных;
0x0000 - зарезервировано.
CDROM прочитает один сектор начиная с указанного начального адреса во внутренний буфер устройства.
Аналогично во время эмуляции от эмулятора требуется обработать данные поступающие в управляющие регистры и предоставить ожидаемый ответ процессору.
4.3 Технические характеристики эмулируемой системы
Процессор: Hitachi 6417709S SH3 102.4MHz - суперскалярный 32-битный процессор с RISC-архитектурой с длиной команды 16-бит. Содержит 16 основных регистров + 8 переключаемых регистров для целочисленных вычислений. Объем кэш-памяти процессора составляет 16 кбайт.
Процессор не содержит аппаратного набора инструкций для вычислений с плавающей точкой. Поддерживается возможность программирования до трех таймеров (TMU) и четырех каналов прямого доступа к памяти (DMA). Присутствует аппаратная поддержка трансляции виртуальных адресов в физические (MMU).
Объем оперативной памяти 16 Мбайт.
Видеочип построен на программируемой логической интегральной схеме Altera Cyclone EP1C12 FPGA с 64 мегабайтами памяти. Поддерживается формирование изображения на основе спрайтов с возможностью наложения полупрозрачных объектов и альфа тестом.
Конечное изображение формируется в растр размером 320*240, либо 240*320 точек на дюйм.
Аудиочип построен на основе Yamaha YMZ770C-F, основная задача данного чипа выборка и декодирование выбранного звукового семпла. Семплы в кодированном виде хранятся в постоянной памяти системы. Аудио поток выводится в моно фонетическом режиме с частой дискредитации 16000 Гц.
Устройство ввода - допускается подключение игровых манипуляторов, либо «mahjong» клавиатуры.
Носитель информации - данные приложений хранятся на флэш-носителях.
4.4 Описание алгоритма работы приложения
Исходя и ранее представленных характеристик эмулируемой системы, а также необходимости взаимодействия пользователя с приложение определим необходимые и достаточные компоненты системы:
1) Интерфейс приложения;
2) Эмуляция процессора Hitachi 6417709S SH3;
3) Эмуляция памяти;
4) Эмуляцию видеочипа;
5) Эмуляцию аудиочипа;
6) Эмуляция устройств ввода;
Взаимодействие компонентов системы проиллюстрировано на рисунке 4.3:
Рисунок 4.3 - Блок схема взаимодействия основных модулей приложения
4.5 Описание интерфейса приложения
Открытие приложения вызывает диалоговое окно, содержащее перечень игровых приложения доступных для запуска. Наличие приложений доступных для запуска проверяется по адресу «sdcard/cave/roms». Диалоговое окно выбора приложения представлено на рисунке 4.4:
Рисунок 4.4 - Диалоговое окно выбора приложения
Элементы управления запускаемым приложением расположены на основном экране, исчезают в случае продолжительного времени отсутствия активности со стороны пользователя. Элементы управления проиллюстрированы на рисунке 4.5:
Рисунок 4.5 - Элементы управления приложением гостем
В контекстном меню возможно задать управление приложением с помощью внешнего контроллера. Диалоговое окно переназначения кнопок для внешнего контролера представлено на рисунке 4.6:
Рисунок 4.6 - Диалоговое переназначения управления на внешний контроллер
Кроме того, возможно изменить размеры элементов управления на основном экране. Диалоговое окно изменения размера элементов управления приложением гостем представлено на рисунке 4.7:
Рисунок 4.7 - Диалоговое изменения размера элементов управления
4.6 Эмуляция процессора Hitachi 6417709S SH3
Эмуляция процессора игры реализована двумя методами:
1) Интерпретация кода;
2) Динамическая рекомпиляция кода в нативный код системы на которой происходит запуск эмулятора.
Первый подход имеет следующие преимущества и недостатки:
Преимущества:
· Высокая точность эмуляции;
· Низкая трудоемкость отладки и тестирования эмулятора.
Недостатки:
· Требуются существенные вычислительные мощности. Основанная причина высоких требований к вычислительным возможностям, обусловлена высокой избыточностью алгоритма: покомандная эмуляция требует каждый раз считывать, декодировать и выполнять команд.
Пример эмуляции одной команды первым методом подробной рассмотрен в листинге 4.1.
Листинг 4.1 - Эмуляции процессора методом интерпретации
int CSH3Interpreter::SingleStepInner(u32 pc)
{
// получение кода текущей инструкции
// из памяти по текущему указателю на код
u32 instCode = sh3->MemReadInst(pc);
if(!(sh3->Exceptions)) { // в случае если было исключение на чтении
// инструкции пропускаем этап
// декодирования и эмуляции
ExecuteInstruction(this, instCode); // вызов декодера и эмуляции
// текущей инструкции
sh3OpInfo *opinfo = GetOpInfo(instCode);
// возврат времени работы текущей инструкции
return opinfo->numCycles;
}
return 1;
}
void CSH3Interpreter::add(u32 code)
{
// получения номера регистра источника
u32 m = ((code >> 4) & 0x0f);
// получение номера регистра получателя
u32 n = ((code >> 8) & 0x0f);
// эмуляция инструкции согласно полученных параметров
sh3->r[n] += sh3->r[m];
}
Второй подход имеет следующие преимущества и недостатки:
Преимущества:
· Высокая скорость работы (в 8 - 10 раз выше первого подхода).
Недостатки:
· Высокая трудоемкость реализации и отладки;
· Платформеннозависимость.
Отличия второго подхода заключаются в кэшировании обработанных данных. В процессе эмуляции после этапа декодирования в промежуточный буфер сохраняются машинные команды процессора, на котором происходит запуск эмулятора, соответствующие декодированному коду. Повторное выполнение кода сразу исполняет сохраненный код. Кроме того, процесс рекомпиляции кода организован группами команд, что снижает количество обращений к оперативной памяти, сохраняя промежуточные результаты вычислений в регистрах процессора на котором исполняется код, автоматически назначая соответствие между регистрами эмулируемой архитектуры и архитектуры, на которой запущен эмулятор. Содержимое регистров сохраняется в конце каждой группы команд. Количество команд в группе устанавливается равное количеству команд от текущей команды перехода до следующей команды перехода. Блоки команд связываются командной перехода если в момент компиляции известен адрес перехода. Кроме того, рассматриваемый процессор построен на RISC-архитектуре с длиной команды 16 бит, что не допускает кодирование команд с 32 битными константами в качества источника, учитывая данное ограничение команды, оперирующие с константными значениями просчитываются на этапе компиляции.
Поэлементно метод динамической рекомпиляция рассмотрен в листингах 4.2-4.5.
Процесс эмуляции осуществляется с поиска точки входа в обработчик. Обработчик также скомпилирован кодом программы исходя из условий, в которых запущено приложение.
Листинг 4.2 - Эмуляции процессора методом динамической рекомпиляции.
Точка входа.
void CSH3Dynarec::Run()
{
/* получение точки входа в сгенерированный код*/
CompiledCode pExecAddr = (CompiledCode)dyna_manager.enterCode;
pExecAddr(); // переход по полученному адресу
sh3->TestCounters();
sh3->CheckInterrupt();
}
Далее осуществляется переход в сгенерированный предварительно обработчик, который проверяет наличие уже сгенерированного кода для текущего указателя на код и вызов данного блока, в случае отсутствия производится предварительная компилятор кода:
Листинг 4.3 - Эмуляции процессора методом динамической рекомпиляции.
Обработчик определения точки входа в текущий блок.
/* сохранение регистров изменение которых недопустимо ф-ий согласно принятым стандартов, а также сохранение адреса возврата из обработчика в стэк */
push{r4, r5, r6, r7, r8, r9, r10, r11, lr}
/* загрузка в регистра r5 адрес структуры описывающей текущее состояние эмулируемого процессора */
movwr5, #14384; 0x3830
movtr5, #58244; 0xe384
/* получение указателя обработчика текущей группы инструкции при наличии, по текущему указателю на код */
start:
ldrr0, [r5, #2256]; 0x8d0
bicr1, r0, #224, 8; 0xe0000000
lsrr1, r1, #16
movwr2, #33728; 0x83c0
movtr2, #58246; 0xe386
movtr2, #58246; 0xe386
ldrr1, [r2, r1, lsl #2]
tstr1, r1
beqskip
uxthr0, r0
ldrpc, [r1, r0, lsl #2]
/* в случае отсутствия кода для текущего указателя на код, предварительно вызывается компилятор кода */
skip:
movwr0, #33700; 0x83a4
movtr0, #58246; 0xe386
ldrr1, [r5, #2256]; 0x8d0
movwr2, #16320; 0x3fc0
movtr2, #58236; 0xe37c
blxr2
bstart
pop{r4, r5, r6, r7, r8, r9, r10, r11, pc}
Компилятор, вычисляет размер текущей группы инструкций и переводит код эмулируемого процессора в машинный код процессора на котором запускается компилятор.
Листинг 4.4 - Эмуляции процессора методом динамической рекомпиляции.
Компиляция текущего блока.
void CSH3Dynarec::CompileBlock(u32 addr)
{
// добавление нового описателя текущей группы инструкций
SSH3BlockCacheEntry *b = GetBlockCache()->AllocateBlock();
bool broken_block = false;
state.skipnext = false;
state.DelaySlot = false;
state.isLastInstruction = false;
state.block_flags = 0;
code_buffer.clear();
// вычисление начального и конечного адресов
// текущей группы инструкций
Analyze(addr, broken_block);
int size = code_buffer.size();
sh3CodeOp *ops = code_buffer.first();
b->addr = addr & 0x1fffffff;
b->endAddr = b->addr + size*2;
GetBlockCache()->InitBlock(b, (CompiledCode)AlignCode16());
/* если блок выполняет пустой цикл ожидания пропускаем */
if(state.block_flags & SH3_BLOCK_IDLE)
{
u32 destination = ops[0].address + (size<<1);
MOV32ItoR(R0, destination);
STR(R5, R0, offsetof(CSH3, pc));
MOV(R0, 0);
STR(R5, R0, offsetof(CSH3, icount));
B(dyna_manager.TestCounters);
}
else
{
gpr.Start();
for (int i = 0; i < size; i++)
{
state.compilerPC = ops[i].address;
state.op = &ops[i];
state.instructionNumber = i;
if (i == (size - 1)) {
state.isLastInstruction = true;
} else {
state.next_inst = ops[i + 1];
}
/* компиляция текущей инструкции */
if (!ops[i].skip) {
CompileInstruction(ops[i]);
}
if (state.skipnext) {
state.skipnext = false;
i++;
}
if (state.cancel)
break;
}
}
clearcache((void*)((u32*)b->entry)[0], GetCodePtr());
}
Листинг 4.5 - Эмуляции процессора методом динамической рекомпиляции.
Пример компиляции команд процессора.
void CSH3Dynarec::movi(u32 code)
{
u32 i = ((code >> 0) & 0xff);
u32 n = ((code >> 8) & 0x0f);
// сохранения загружаемого значения
// в целях последующего анализа
gpr.SetImmediate32(n, (u32)(s32)(s8)i);
}
void CSH3Dynarec::shl(u32 n, u32 val)
{
if (gpr.R(n).IsImm())
{
// если регистр вычислен то сохраняем
// результат сдвига для дальнейшего анализа
gpr.SetImmediate32(n, gpr.R(n).Imm32() << val);
} // записываем машинный аналог данной инструкции в буфер
else
{
gpr.Lock(n);
gpr.BindToRegister(n, true, true);
MOV(gpr.RX(n), Operand2(gpr.RX(n), LSL, val));
gpr.UnlockAll();
}
}
После выполнения компиляции код в среднем 4-6 инструкций приходится на одну инструкции эмулируемого процессора, кроме того образуется высокая избыточность кода на сохранении/загрузке регистров одного процессора в регистры другого процессора. Сравнительная характеристика представлена в таблице 4.2.
Таблица 4.2 - Сравнение входного и выходного потоков после компиляции
Группа команд процессора Hitachi 6417709S SH3 |
Результат компиляции кода в машинные коды процессора с архитектурой ARM |
|
MOV.L @R1+, R0 DT R3 MOV.L R0, @R2 BF/S h'00000092 ADD #h'04, R2 |
MOV.L @R1+, R0 ldrr6, [r5, #2124] movr0, r6 bicr2, r0, #224, 8 rsbr2, r2, #805306368 ldrr7, [r2, #-4] addr6, r6, #4 DT R3 ldrr8, [r5, #2132] subsr8, r8, #1 ldrr0, [r5, #2216] orreqr0, r0, #1 bicner0, r0, #1 strr0, [r5, #2216] MOV.L R0, @R2 ldrr9, [r5, #2128] movr0, r9 movr1, r7 bicr2, r0, #224, 8 rsbr2, r2, #805306368 strr1, [r2, #-4] BF/S h'00000092 ldrr0, [r5, #2216] tstr0, #1 movweqr0, #146 movwner0, #156 strr0, [r5, #2256] ADD #h'04, R2 addr9, r9, #4 Сохранения изменений strr7, [r5, #2120] strr6, [r5, #2124] strr9, [r5, #2128] strr8, [r5, #2132] |
4.7 Эмуляция памяти
Карта памяти рассматриваемой системы представлена в таблице 4.3.
Таблица 4.3 - Адресное пространство центрального процессора
Начальный адрес |
Конечные адрес |
Назначение |
|
0x00000000 |
0x003fffff |
Постоянная память (bootrom) |
|
0x0c000000 |
0x0cffffff |
Оперативная память |
|
0x10000000 |
0x10000007 |
Порты взаимодействия с флеш-накопителем |
|
0x10400000 |
0x10400007 |
Порты взаимодействия с аудиочипом |
|
0x10C00000 |
0x10C00007 |
Порты взаимодействия с eeprom |
|
0x18000000 |
0x18000057 |
Порты взаимодействия с видеочипом |
|
0xf0000000 |
0xffffffff |
Внутренние управляющие регистры процессора |
Поскольку в системе присутствует ограниченное количество устройств трансляция адреса при выборе адресата на чтение/запись осуществляется, проверкой текущего адреса на вхождение в один из выше указанных диапазонов. Поскольку большая часть операций с памятью соответствуют обращению к оперативной памяти данный соответствующий диапазон проверяется первым.
Также поскольку эмулируемая система использует big-endian адресацию, в отличии от little-endian от принятой в Android OS оперативная память эмулируемой системы располагается в обратном порядке.
Также в режиме динамической рекомпиляции процессора все обращения к оперативной памяти осуществляются, минуя модуль трансляции памяти. Данное упрощение достигается благодаря применению менеджера памяти и генерации исключений системой на которой запускается эмулятор. Память, используемая в качестве оперативной памяти, выделяется по абсолютному адресу.
Компилятор, выполняя компиляцию обращения к памяти прибавляет к текущему адресу базу оперативной памяти (см. листинг 4.6).
Листинг 4.6 - Трансляция памяти
bicr2, r0, #224, 8 ; 0xe0000000 ; сброс незначимой части адреса
rsbr2, r2, #805306368 ; 0x30000000 ; прибавление базы к адресу
strr1, [r2, #-4] ; запись данных
В случае если адрес не соответствует диапазону оперативной памяти операционной системой выдается исключение, потому что происходит обращение в адресное пространство недоступное приложению, исключение перехватывается эмулятором, вышеприведенный код в обработчике заменятся на вызов модуля, транслирующего адрес, по возвращению из обработчика исключений код выполняется повторно, но уже вызывается модуль трансляции памяти (см. листинг 4.7).
Листинг 4.7 - Обработчик исключений обращений к памяти
void CSH3Dynarec::ExceptionHandler (
int signal,
siginfo_t *info,
void *context
)
{
//получение адреса исключения
u8 *arm_pc = (u8*)(((ucontext_t*)context)->uc_mcontext.arm_pc -= 8);
ARMXCompiler emit(arm_pc);
u32 opcode = ((u32*)(arm_pc))[2];
// определение причины исключения
// запись/чтение/размерность данных
if((opcode&0x0e000000)==0 && (opcode&0x80) && (opcode&0x10))
{
if( opcode&0x00100000 ) {
ARMReg dest = (ARMReg)((opcode >> 12) & 0xf);
// замена текущего кода на
// вызов модуля транслирующего адрес
if(opcode & 0x20) {
emit.BL(mainSH3.dyna.dyna_manager.memRead16);
emit.MOV(dest, R0);
emit.NOP(1);
} else {
emit.BL(mainSH3.dyna.dyna_manager.memRead8);
emit.MOV(dest, R0);
emit.NOP(1);
}
} else {
emit.MOV32ItoR(R2, reinterpret_cast<u32>(&MemWrite16));
emit.BL(R2);
}
} else if((opcode&0x0c000000)==0x04000000) {
if( opcode&0x00100000 ) {
if( opcode&0x00400000 ) {
ARMReg dest = (ARMReg)((opcode >> 12) & 0xf);
emit.BL(mainSH3.dyna.dyna_manager.memRead8);
emit.MOV(dest, R0);
emit.NOP(1);
} else {
ARMReg dest = (ARMReg)((opcode >> 12) & 0xf);
emit.BL(mainSH3.dyna.dyna_manager.memRead32);
emit.MOV(dest, R0);
emit.NOP(1);
}
} else {
if( opcode&0x00400000 ) {
emit.MOV32ItoR(R2, reinterpret_cast<u32>(&MemWrite8));
} else {
emit.MOV32ItoR(R2, reinterpret_cast<u32>(&MemWrite32));
}
emit.BL(R2);
}
}
clearcache(arm_pc, arm_pc+12); // сброс кэша инструкций
}
4.8 Эмуляция видеочипа
Взаимодействие с видеочипом осуществляется с помощью пакетов. В первом двойном слове каждого отправляемого пакета нижние 4 бита указывают на вид пакета, расшифровка битов представлена в таблице 4.4.
Таблица 4.4 - Заголовок управляющего пакета видеочипа
Идентификатор пакета |
Результат обработки |
|
0x0 и 0xf |
Окончание обработки пакетов направленных на обработку видеочипу |
|
0xC |
Активация/деактивация ограничения обработки кадра |
|
0x2 |
Загрузка данных из оперативной памяти в память используемую видеочипом |
|
0x1 |
Рендеринг кадра |
Пакет 0x1 содержит дополнительные информационные поля в заголовке, представленные в таблице 4.5.
Таблица 4.5 - Структура пакета, отвечающего за рендеринг кадра
Номера бит в заголовке |
Результат обработки |
|
24-31 |
Альфа компонента цвета для цвета в сохраненного в буфере кадра |
|
16-23 |
Альфа компонента цвета для текущего цвета |
|
13-15 |
Режим обработки цвета хранимого в буфере кадра |
|
9-12 |
Режим обработки цвета текущего цвета |
|
7 |
Включение альфа теста |
|
6 |
Включение альфа блендинга |
|
5 |
Отражение текущего элемента по вертикали |
|
4 |
Отражение текущего элемента по горизонтали |
Видеочип поддерживает режимы блендинга, представленные в таблице 4.6.
Таблица 4.6 - Поддерживаемые режимы блендинга видеочипом
Режим |
Результат |
|
0 |
Все компоненты цвета умножаются на 0 |
|
1 |
Все компоненты цвета умножаются на 1 |
|
2 |
Покомпонентное умножение на текущий цвет |
|
3 |
Цвет покомпонентно умножается на инвертированный текущий цвет |
|
4 |
Все компоненты цвета умножаются на альфу текущего цвета |
|
5 |
Все компоненты цвета умножаются на инвертированную текущего цвета |
|
6 |
Все компоненты цвета умножаются на альфа компоненту цвета хранимого в буфер кадра |
|
7 |
Все компоненты цвета умножаются на инвертированную альфа компоненту цвета хранимого в буфер кадра |
В целях снижения нагрузки на центральный процессор рендеринга кадра осуществляется методом выбора узкоспециализированной функции формирования кадра на основании указанных параметров в пакете. Функции генерируются компилятором используя метод условной компиляции. Данный подход приводит к генерации большого объема однотипного кода, но одновременно с этим исключает проверки в критическом участке программы.
...Подобные документы
Обзор существующих популярных программ для просмотра погоды на ОС Android. Операционные системы современных смартфонов. Ключевые особенности Android, технология Java. Разработка программной части, выбор языка, описание алгоритма, ее логической структуры.
курсовая работа [911,5 K], добавлен 16.04.2014Разработка программного обеспечения для платформы Android версии 2.3: информационное приложения для поклонников футбольной команды, с возможностью просмотра событий, статистики и иной информации о команде и ее успехах. Листинг JsonDataManager.java.
дипломная работа [4,1 M], добавлен 24.04.2013Обзор рынка мобильных приложений, социальных сетей, аналогов. Обзор инструментов разработки: Android Studio, Microsoft visual С# 2012, PostgreeSQL, API Открытых данных Вологодской области, API Социальных сетей. Программный код, разработка интерфейса.
дипломная работа [2,6 M], добавлен 10.07.2017Архитектура операционной системы Android. Инструменты Android-разработчика. Установка Java Development Kit, Eclipse IDE, Android SDK. Настройка Android Development Tools. Разработка программы для работы с документами и для осуществления оперативной связи.
курсовая работа [2,0 M], добавлен 19.10.2014Разработка программы – сетевого эмулятора, позволяющего представить в графическом виде топологию маршрутизируемой сети. Сравнительный анализ существующих программных эмуляторов сетей и сетевого оборудования. Моделирование протоколов маршрутизации.
дипломная работа [512,2 K], добавлен 26.09.2014Преимущества операционной системы Android. Проектирование интерфейса приложений. Визуальные редакторы и средства кроссплатформенной разработки. Оптимизация игрового процесса, выбор фреймворка и библиотек. Классификация и характеристика игр по жанрам.
дипломная работа [2,6 M], добавлен 10.07.2017Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.
дипломная работа [4,5 M], добавлен 19.01.2017Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.
курсовая работа [167,8 K], добавлен 18.01.2017Требования к MS Office 2007. Набор средств разработки Visual Studio Tools for Office как альтернатива VBA. Разработка СУБД на базе MS Access. Разработка надстройки "Электронные компоненты" для PowerPoint на языке C# в среде MS Visual Studio 2010.
дипломная работа [5,2 M], добавлен 03.05.2013Изучение существующих подходов к использованию компьютерных игр в образовательном процессе. Разработка и реализация проекта игрового обучающего приложения на мобильной платформе. Выбор платформы и средств реализации игрового обучающего приложения.
дипломная работа [3,4 M], добавлен 12.08.2017Архитектура уровня команд платформы Java, формат файла класса Java. Компилятор ассемблероподобного языка, позволяющий создавать файлы классов, корректно обрабатываемые реальной JVM, поддерживающий все команды байт-кода Java и важнейшие возможности JVM.
курсовая работа [292,6 K], добавлен 17.09.2008Разработка клиент-серверного игрового приложения на примере игры в шашки для мобильных устройств на базе операционной системы Android. Обзор мобильных платформ. Экраны приложения и их взаимодействие. Графический интерфейс, руководство пользователя.
курсовая работа [2,6 M], добавлен 15.06.2013Разработка и освоение в современном производстве информационной подсистемы. Создание базы данных в среде MS SQL Server 2008 и приложения в среде MS Visual Studio 2012. Процесс ввода при выборе пунктов меню. Заполнение формы с критериями на фильтрацию.
отчет по практике [834,4 K], добавлен 27.11.2013Первое устройство, работающее под управлением Android. Приложения под операционную систему Android. Формат установочных пакетов. Разработка приложений на языке Java. Шаблоны основных пакетов и компонентов Android. Сборка приложений, основанная на Gradle.
курсовая работа [492,0 K], добавлен 08.02.2016Структура и архитектура платформы Android. Основные достоинства и недостатки операционной системы Android. Среда разработки Eclipse, платформа Java. Подготовка среды разработки. Вкладка "Погода", "Курс валют", "Новости". Просмотр полной новости.
дипломная работа [1,0 M], добавлен 11.07.2014История появления "флешек". Устройство и технические характеристики USB-флеш-памяти, принцип ее действия, дополнительные опции и программное обеспечение, типы разъемов. Карты памяти, их виды и форматы. Способы организации записи информации в ячейку.
реферат [439,2 K], добавлен 21.12.2010Проблемы, связанные с отсутствием информационной системы. Проектирование логической схемы данных для выбранной предметной области на основе методологии IDEF1X. Разработка информационной системы с использованием MS SQL Server 2008 и MS Visual Studio 2010.
курсовая работа [3,0 M], добавлен 07.08.2013Освоение функций работы со структурами данных и файлами. Разработка программного обеспечения для создания, обработки сведений о сотрудниках учреждения. Реализация алгоритма программы в среде Microsoft Visual Studio 2010. Изучение руководства пользователя.
курсовая работа [3,3 M], добавлен 28.08.2012Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.
дипломная работа [1,6 M], добавлен 08.07.2015Разработка игрового проекта на игровом движке Unity 3D в среде программирования MS Visual Studio 2017. Блок-схема алгоритма работы приема сообщений с сервера на клиенте с упрощенным описанием выполняемых команд. Реализация пользовательского интерфейса.
курсовая работа [1,5 M], добавлен 10.07.2017