Перейти к содержанию

Как работает нагрузка на GPU (разбор примера)


Рекомендуемые сообщения

Специально для теста создал новый проект, добавил два тайлмапа (земля, тень), два тайловых бэкграунда для облаков и объект Player с двумя анимациями по 4 кадра в каждой и поведением Platform. Тестирование проводил на низкопроизводительном мобильном устройстве с очень слабым GPU. Для теста производительности самое то. К сожалению, отследить нагрузку на GPU не получится, т.к. выражение выдаёт "NaN", но зато есть показатель FPS. Если FPS падает — значит GPU не успевает отрисовать кадр за 0.016 (1/60) сек.

1. Начало уровня. FPS 41-42.

Screenshot_20211202-183527.png

2. Прохожу чуть дальше, FPS 54-55.

Screenshot_20211202-183538.png

3. Прыгаю на уступ, FPS 62

Screenshot_20211202-183551.png

Почему так происходит!? Для начала, разберёмся с теорией.

Основы

Базовый принцип оптимизации нагрузки на GPU — это сокращение площади отображаемой на экране (в области просмотра) графики. Есть определённый физический лимит графики (её фактической площади), которую GPU может отрисовать и уложиться в 0.016 сек (что даёт 60 FPS).

Разрешение игры

Чем выше разрешение экрана — тем больше площадь отрисовки, и тем выше нагрузка на GPU. Следует понимать, что разрешение игры и размер области просмотра это не одно и тоже. Разрешение игры (в полноэкранном режиме) равно разрешению экрана устройства игрока. Размер области просмотра не влияет на производительность. Например, если размер области просмотра 480x240, а разрешение экрана 1440 x 720, то GPU будет отрисовывать кадр в разрешении 1440 x 720.

Как происходит отрисовка кадра

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

Важно:

  • Невидимый слой/объект — это тот, у которого параметр visible установлен на "invisible". Даже если объект имеет opacity = 0, он всё равно будет отрисован.
  • Объекты отрисовываются полностью, включая прозрачные пиксели.
  • С точки зрения нагрузки, решающую роль играет площадь изображения. Не исходная, а фактическая. Спрайт 1x1 пикселей, растянутый на весь экран (например, в вашем проекте это 480x240), превращается в текстуру, которая будет имеет разрешение, равное разрешению экрана устройства.
  • Если у вас пиксель арт игра, вы можете установить параметр "Fullscreen quality" на "Low" и тем самым значительно снизить нагрузку на GPU, но об этом как-нибудь в отдельном уроке.

Посмотрим ещё раз на кадр из игры

Игровая сцена состоит из нескольких слоёв: задний фон, движущиеся облака, тайлмап и спрайт героя. На отрисовку всего, что попало в область просмотра GPU потратит ресурсы. И чем больше в кадре объектов, а точнее, чем больше площадь попавших в кадр объектов — тем выше нагрузка на GPU.

Специально для теста добавил на экран кнопки, которые отключают облака и тайлмапы.

4. Попробуем зайти в самую загруженную область на карте. Получаем 41-42 FPS.

Screenshot_20211202-190245.png

5. Теперь отключаем облака. Вы не видите на скрине облаков? Я тоже не вижу, но GPU всё равно тратит ресурсы на их отрисовку. Сделав облака невидимыми программно, получаем FPS 47-50.

Screenshot_20211202-190527.png

6. Теперь отключим тайлмап с тенью. Получаем FPS 53-55.

Screenshot_20211202-190738.png

7. А теперь, попробуем вернуть облака. Получаем FPS 46-48.

Screenshot_20211202-190901.png

8. Отключаем тайлмап земли, получаем максимальные FPS 62.

Screenshot_20211202-191355.png

Выводы

Надеюсь, вы уловили суть — причина падения FPS заключается в физических ограничениях GPU. У мобильных устройств разрешения экранов высокие, а GPU очень слабые. Если вы делаете игру для мобильных устройств, то вы уже на уровне геймдизайна должны думать о том, чтобы не допускать нахождения в кадре слишком большого количества перекрывающих друг друга объектов (повторюсь, что дело не в количестве, а в их суммарной площади).

Изменено пользователем ViGaCi
v.0.4 (исправил опечатки)
Ссылка на комментарий
Поделиться на другие сайты

нагрузку можно проверить в cpu\gpu meter и simple system (второе в мультискрине работает хорошо). некоторые смартфоны и свои инструменты предоставляют в разделе "для разработчиков"
может обновишь статью с использование изменения загруженности гпу?
а то все-таки фпс использовать для оценки нагрузки гпу - это немного не то

 

Изменено пользователем Aventiy
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Aventiy сказал:

нагрузку можно проверить в cpu\gpu meter и simple system (второе в мультискрине работает хорошо). некоторые смартфоны и свои инструменты предоставляют в разделе "для разработчиков"
может обновишь статью с использование изменения загруженности гпу?
а то все-таки фпс использовать для оценки нагрузки гпу - это немного не то

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

На скриншотах справа сверху есть нагрузка на CPU (в среднем 20-30%). Пока нагрузка на CPU ниже 100%, влияние CPU на падение FPS исключено. Конечно есть тонкости, насколько корректно C3 считает нагрузку на CPU, но этот тест явно не тот случай.

Но если есть желание - можешь самостоятельно замерить, ссылка на апк пример из урока: https://drive.google.com/file/d/1tR6O-FIENSLjuQlMBmGV1b0rgYAdJM4k/view?usp=sharing

Изменено пользователем ViGaCi
добавил ссылку
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...