Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Графика Android-игр

Графика – это крупный модуль, который отвечает за прорисовку изображений (растров) на экране. Каким образом это происходит?

Все современные дисплеи основаны на растре — это двухмерная таблица из элементов изображения, так называемых пикселов. Таблица имеет заданную ширину и высоту, которая выражается числом пикселов в столбце и строке. Если очень постараться, то пикселы можно рассмотреть на экране вашего компьютера.

Пиксел имеет два атрибута: цвет и позиция в таблице, которая обозначается в дискретной координатной системе двухмерными координатами. В это случае дискретность обозначает, что каждая координата выражена целым числом. Отсчет координат начинается с левого верхнего угла и значения растут, соответственно, по оси x слева направо, по оси y — сверху вниз. Стартовый пиксел имеет координаты (0; 0), пиксел справа от него (1; 0), снизу — (0; 1) и т. д.

Почему же ось системы координат на дисплее направлена вниз? Дело в том, что память VRAM или RAM однонаправлена, линейна и представляет собой одномерный массив. На рисунке показано, каким образом таблица 3×2 пиксела представлена в VRAM. Собственно, такая система осталась со времен начал компьютерной графики.

Растровая таблица, как и количество координат, имеет границы. Максимальная координата x равна ширине таблицы минус 1, координаты y — высота минус 1. За пределами экрана расположены координаты с отрицательными значениями.

Дисплей получает от графического процесса непрерывный поток информации, кодирует цвет каждого пиксела экранной таблицы таким образом, как это определяет программа или ОС при управлении прорисовкой дисплея. Состояние экрана обновляется несколько десятков раз в секунду – эта величина выражается в герцах и именуется частотой обновления. У ЖК-дисплеев она обычно равняется 60 Гц в секунду; у плазменных панелей и ЭЛТ-мониторов еще выше.

У графического процессора имеется доступ к специальной области памяти – видеопамяти (или VRAM), внутри которой зарезервирована область (фреймбуфер) для хранения каждого пиксела, который отображается на экране (фрейме). И каждому пикселу здесь присвоен свой адрес. Для того чтобы внести изменения на экране, нужно изменить цветовые значения в данной области VRAM.

Что такое цвет?

В плане физики цвет — это реакция сетчатки глаза и коры головного мозга на электромагнитные волны, которые отличаются друг от друга длиной и интенсивностью. Мы можем воспринимать волны в диапазоне 400-700 нм. Этот сегмент называется видимой частью спектра, которая заключена между красным и фиолетовым цветами.

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

Цветовые модели

Существует разные модели для передачи цвета (например, CMYK и YUV), но в большинстве API для программирования стандартной является аддитивная цветовая модель RGB. Red (Красный), Green (Зеленый), Blue (Синий) – это базовые цвета, которые представлены в каждом пикселе. Они светятся с разной интенсивностью (от нуля до максимума) и, смешиваясь, создают заданный оттенок.

Цифровое кодирование цветов

Как кодируется в компьютерной памяти триплет цветов RGB? Для обозначения цветовых компонентов можно использовать беззнаковые целые числа, которые будут показывать интенсивность каждого компонента в диапазоне от 0 до 255. Таким образом можно закодировать 16 777 216 цветов – этого вполне достаточно.

Форматы изображения и сжатие

В ходе разработки игры художник предлагает изображения, которые созданы с помощью специального ПО (Photoshop, Pain.NET, Gimp) и могут храниться в разных форматах.

Дело в том, что если хранить на диске растровые картинки в виде набора байтов, то они займут очень много места. Наиболее подходящие для хранения изображений форматы — JPEG и PNG. В первом случае степень сжатия выше, но при этом теряется часть данных. PNG, напротив, не теряет данные и воспроизводит изображение со 100% точностью. Какой формат выберете вы, во многом будет зависеть от числа файлов, их качества и емкости хранилища. Но не забывайте о том, что при загрузке изображения в память его придется декомпрессировать, а значит, понадобится место для размещения ее полной растровой таблицы.

Альфа-наложение и смешивание

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

В таком случае применяется альфа-смешивание, а точнее, его подвид – альфа-маскировка. Программа по обработке изображений позволяет определить как RGB-значения пиксела, так и полупрозрачность, которую также можно кодировать от 0 (полная прозрачность) до 255 (непрозрачность). То есть для того чтобы исчезли белые пикселы фона, нужно установить для них значение прозрачности 0. Это не поддерживается в формате JPEG, поэтому используется формат PNG.

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

  • загружал изображения с диска и хранил в памяти для последующей прорисовки;

  • очищал фреймбуфер с цветом, чтобы удалять содержимое предыдущего кадра;

  • устанавливал определенный цвет для конкретного положения пиксела во фреймбуфере;

  • прорисовывал линии и прямоугольники во фреймбуфере;

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

  • рисовал картинки со смешиванием и без;

  • получал размеры фреймбуфера.