Как работает производительность Construct 2

другие уроки, мануалы, советы по Construct 2

Сообщение Как работает производительность Construct 2
» 31 июл 2020, 12:42

В этом уроке будут описаны фундаментальные принципы, как работает производительность в Construct 2. Знания этих вещей позволит вам понимать причины проседаний FPS (актуально для мобильных устройств) и избегать типичных ошибок.

1. Железо

Итак, производительность игры зависит от работы следующих основных компонентов: CPU (центральный процессор), GPU (графический процессор) и память (оперативная/видеопамять).

Центральный процессор (CPU) — обрабатывает логику игры (работа с листом событий, проверка коллизий, работа поведений и т.д.).

Графический процессор (GPU) — отрисовывает (рендерит) кадр (всё что находится за пределами экрана не расходует ресурсы ГП).

Видеопамять (VRAM) — используется графическим процессором для хранения и быстрого доступа к фрагментам изображений (текстурам), необходимым для отрисовки кадра. А также хранит готовый для вывода на экран кадр. Большинство мобильных устройств не имеют видеопамяти вообще (используется оперативная память, доступ к которой намного медленнее).

2. Основы

Что такое "текстуры"

Наверняка каждый человек слышали слово "текстура", но далеко не каждый понимает что это такое. Текстура - это перекодированное изображение, которое хранится в видеопамяти и используется GPU для отрисовки кадра. GPU не может напрямую работать с изображениями, ему требуется сперва перекодировать изображение в текстуру и поместить её в память.

На размер текстуры не влияет ни формат, ни размер исходного изображения. Важна только площадь. Изображение кодируется в специальный формат ARGB. То есть, каждый пиксель изображения хранит четыре параметра: прозрачность 0-255, красный 0-255, зелёный 0-255 и синий цвет 0-255.

Каждый пиксель текстуры занимает 4 байта информации. Представим, что у нас есть исходное изображение с разрешением FullHD (1920x1080), заполненное однотонной заливкой. Исходный вес нашей картинки - около 7 Кб. Теперь, считаем размер текстуры: 1920x1080x4 = 8 294 400 байт, т.е. около 8Мб.

Звуки

Аудиофайлы из папки "Sounds" полностью распаковываются в памяти. Это позволяет воспроизводить звуки мгновенно, без какой-либо задержки, гарантируя, что нужный звук будет воспроизведен в нужное время. Как в случае с изображениями, сжатие аудиофайла хоть и помогает сократить время загрузки, но никак не уменьшает использование памяти.

В настройках проекта есть параметр "Preload sounds". Если этот параметр отключен, то загрузка игры потребует меньше времени, но при первом воспроизведении каждого звука будет происходить задержка (т.к. необходимо некоторое время для декодирования аудиофайла). От этой задержки можно избавиться, если вы будете вручную делать предзагрузку звука (preload) через события. Конечно, не стоит рассматривать этот способ как вариант экономии памяти, поскольку помещённые в память звуки со временем всё равно будут накапливаться.

Музыка

В отличии от звуков (папка Sounds), музыка (папка Music) не загружается предварительно в память, а транслируется по ходу воспроизведения (звуковой движок создаёт небольшой буфер воспроизведения фиксированной длины). Благодаря чему обеспечивается низкое использование памяти (независимо от длины дорожки). Однако воспроизведение не всегда может начаться немедленно, так как может потребоваться дождаться окончания буферизации/декодирования первого блока.

Загрузка сцены

Construct 2 загружает в память только те изображения, которые используются в текущей сцене (Layout). Это касается всех кадров и всех анимаций для каждого спрайта, который находится на сцене. Другими словами, спрайты либо полностью загружаются в память, либо не загружаются вовсе - они никогда не загружаются частично. Когда вы переходите на другую сцену (другой Layout), все загруженные изображения, которые не используются на следующей сцене, выгружаются из памяти.

Количество Layout'ов, общее количество объектов в проекте никак не влияет на производительность (влияет только на время первоначальной загрузке игры).

3. Как устроены события

Что такое тики

Точно так же как фильмы состоят из отдельных кадров, в Construct 2 время состоит из тиков. Каждый тик происходит проверка и выполнение событий, изменение параметров объектов на сцене и отрисовка кадра для вывода на экран.

Для понимания, например, у вас есть пуля, которая летит со скоростью 1000 пикселей в секунду. На самом же деле, никуда она не летит, а просто меняет своё местоположение каждый тик на определённое количество пикселей.

Как происходит обработка листа событий

Каждый тик игровой движок читает и обрабатывает лист событий. События читаются последовательно, сверху вниз (проверка условий и выполнение действий так же происходит последовательно, сверху вниз). Условия в событиях могул быть TRUE или FALSE. То есть, соответствуют действительности на момент текущего тика или нет. Если какое-либо из условий в событии оказывается FALSE, движок просто пропускает обработку текущего события и всех подсобытия этого события.

 Посмотреть пример
Изображение

Например, у вас есть событие с условием "слой 1 является видимым" и ниже подсобытие для проверки коллизии объектов. Если событие #1 является FALSE (т.е. слой 1 не является видимым), то движок не будет тратить ресурсы на проверку коллизии между объектами из события #2.


Что происходит за один тик

1. Центральный процессор(CPU) обрабатывает логику игры, читает лист событий и, при необходимости, вносит изменения в параметры объектов на сцене. Проще говоря, обновляет состояние всей сцены.

2. После того, как CPU обновил состояние сцены, за дело берётся графический процессор (GPU). Его задача — отрисовать всё что находится на экране. Всё что находится за пределами экрана (а также объекты и слои с параметром invisible) не расходуют ресурсы графического процессора.

3. Далее происходит вывод готового кадра на экран. При этом, экран всегда обновляется 60 раз в секунду (частота обновления монитора, Гц) вне зависимости от того, успел ли ГП отрисовать новый кадр или нет. Поскольку Construct 2 поддерживает вертикальную синхронизацию, готовый кадр выводится на экран только после полной его отрисовки.

Изображение

Процесс обработки сцены и отрисовки графики происходит как два параллельных процесса. То есть, центральный процессор (CPU) занимается только тем, что обрабатывает сцену, а графический процессор (GPU) только тем, что отрисовывает кадры.

Что такое FPS

FPS - это показатель количества кадров, которые подготовил графический процессор (GPU) за последнюю секунду реального времени. При этом, экран обновляется строго 60 раз в секунду независимо ни от чего (это физическое ограничение, постоянная частота обновления монитора в Гц). Construct 2 имеет вертикальную синхронизацию (VSync). То есть, кадр будет показан пользователю только после того, как будет полностью готов.

Игровая логика Construct 2 зависима от показателя FPS. И это совершенно логично, потому как иначе получались бы ситуации, когда центральный процессор подготовил 60 кадров, из которых графический процессор может отрисовать только 30 (половина мощностей CPU потратилась бы впустую). Или обратная ситуация, CPU подготавливает 30 кадров, а GPU рисует 60 (тогда GPU приходилось бы тратить ресурсы на отрисовку одного и того же кадра).

4. Почему у вашей игры низкая производительность

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

Итак, если у вас в проекте нет супертяжёлых циклов, вы не изменяете параметры для тысяч объектов каждый тик, но у вас всё равно случаются просадки FPS, то с максимальной вероятностью, причина этих просадок - очень плохая оптимизация игры под слабые графические процессоры (GPU).

Напомню, что GPU каждый тик отрисовывает кадр. Всё что находится за пределами экрана - не расходует его ресурсы. Также, он не отрисовывает невидимые (параметры visible/invisible) объекты и слои (исключение составляет параметр opacity, т.е. даже если opacity=0, то отрисовка таких слоёв и объектов по-прежнему происходит).

5. Оптимизация GPU

1. Избегайте ситуаций, когда в кадре имеются большие области перекрытия между объектами. Дело в том, что кадр отрисовывается по принципу "сзаду наперед" (по Z-оси). То есть, сначала отрисовываются самые нижние объекты, потом пиксели перерисовываются объектами, которые находятся выше и т.д. Мобильные устройства очень ограничены в том, сколько раз можно перерисовывать одни и те же пиксели поверх друг друга для одного кадра и сохранять при этом 60 ФПС.

Помните, что хоть пользователь и не видит те области, которые перекрывают объекты, GPU всё равно расходует ресурсы на отрисовку. Это верно даже в том случае, когда у вас один объект полностью скрыт за другим.

2. Избегайте использование тяжёлых WebGL эффектов. Такие эффекты как, например, Blur, хоть и выглядят зрелищно, но являются очень прожорливыми. Особенно, если в кадре несколько объектов с тяжёлыми эффектами перекрывают друг друга. Конечно, никто вам не говорит, что нужно вообще отказаться от эффектов. Нет. Речь идёт о том, чтобы подходить к этому вопросу с умом. Например, не использовать WebGL эффекты для обработки статического эффекта на объекте. Для этого случая вы спокойно можете в графическом редакторе добавить нужный эффект. Пользователь разницы не увидит, но для производительности разница будет огромная.

Ещё один момент - нужно отключать неиспользуемые эффекты на слоях и объектах. Важный момент - именно отключать, а не менять значения параметров. Например, эффект Blur = 0 по прежнему нагружает GPU, хоть и для пользователя разницы нет никакой. Тоже самое касается и невидимости объектов и слоёв. Напомню, что если объект/слой имеет параметр opacity=0, то GPU по-прежнему будет тратить ресурсы на отрисовку. Делаете объекты/слои невидимыми (set visible/invisible) и тогда GPU будет не будет тратить на них ресурсы вообще.
Аватара пользователя

Редактор
Сообщений: 171
Я тут с 01 авг 2017
Репутация 47 [ ? ]

Сообщение Как работает производительность Construct 2
» 31 июл 2020, 13:24

Отличный урок!
Аватара пользователя

Участник
Сообщений: 210
Я тут с 17 сен 2017
Откуда: Прямиком из сталкера
Двиг: Scirra/Box2D
Лицензия: Крутая лиц
Skype: Himan111
Репутация 1 [ ? ]



Вернуться в Другие уроки по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх