Как управлять разрешением экрана (площадью отрисовки)

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 17 мар 2020, 14:07

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


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

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

► Как решить проблему

Отрисовка кадра происходит по всей площади экрана, вне зависимости от настроек проекта. Например, если в параметрах проекта указан размер окна 1280x720, а у пользователя экран 1920x1080, то графический процессор будет отрисовывать кадр площадью 1920x1080. Так в чём же хитрость? Хитрость в том, что вы можете программно изменить разрешение экрана.

За это отвечает параметр "canvas size". То есть, вы просто программно уменьшите площадь отрисовки, что снизит нагрузку на графический процессор. Если вы играли в компьютерные игры, то это то же самое, что изменить разрешение экрана в настройках игры. Жертвуя качеством картинки вы выигрываете в производительности.

► Как это сделать:

▪ В свойствах проекта обязательно ставим Fullscreen scaling > Low quality.

 Что такое Fullscreen scalling
Hight quality — отрисовка кадра происходит по всей площади экрана. Например, если в параметрах проекта указан размер окна 1280x720 (параметр Window Size), а у пользователя экран 1920x1080, то графический процессор будет отрисовывать кадр площадью 1920x1080 (и, соответственно, увеличится нагрузка, требуемая для отрисовки кадра).

Low quality — отрисовка кадра происходит в соответствии с размером окна в настройках проекта, а после кадр просто растягивается по всему экрану. При этом, если, например, разрешение экрана пользователя 640x360, а в настройках проекта 1280x720, то графический процессор будет отрисовывать кадр площадью 640x360.


1. Изменение разрешения на старте уровня. On start of layout > set canvas size. Важно чтобы вы меняли разрешение экрана пропорционально, иначе часть экрана просто будет обрезана.

Одно из решений — это сделать специальную переменную, значением от 0.25/0.5/1 (назовём её Scale). И умножать эту переменную на размер экрана пользователя.

    ▪ On start of layout > set canvas size :
    Scale*ViewportRight(0);
    Scale*ViewportBottom(0)

И обязательно добавляем ниже ещё одно действие:
    ▪ Set Layout scale to Scale*1

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

Например, событие "Every X seconds", а ниже подсобытие с условием "fps < 45" и действиями "set canvas size", "set layout scale" аналогично тому, как это было показано выше. А также, действие, которое меняет значение переменной Scale. То есть, вы сможете изменять разрешение прямо по ходу игры, в зависимости от того, как сильно падает fps.

Только не увлекайтесь и не делайте эту проверку слишком часто, потому как при изменении canvas size графический процессор полностью перерисовывает экран, что на короткое время вызывает вызывает замирание экрана (так называемые "фризы").

► Другие способы применения

Можете добавить настройки графики, чтобы игроки сами смогли выбрать наиболее подходящий вариант. В общем, вариантов реализации много — выбирайте то, что вашей игре подходит больше.

► Исходник

ResizePerfomance.capx
(268.38 КБ) Скачиваний: 129
Версия C2 r277


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

 Показать события
Изображение
У цьому полі, синьому, як льон
Де тільки ти і ні душі навколо...
Аватара пользователя

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 17 мар 2020, 17:22

Важный момент. Поскольку увеличение производительности происходит за счёт сокращения площади текстур, используемых GPU при отрисовке кадра, то переменная Scale должна принимать такие значения: 1, 0.5 или 0.25. При значении менее 0.25 картинка становится уже через чур мыльной. При значениях Scale от 0.5 до 1 (или от 0.25 до 0.5), разницы в производительности вы не увидите, так как при отрисовке кадра по прежнему используются текстуры с более высоким разрешением.
У цьому полі, синьому, як льон
Де тільки ти і ні душі навколо...
Аватара пользователя

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 08 июл 2020, 09:44

А при изменении размера окна спрайты не "съедут"?
я проповедник лени
Аватара пользователя

Участник
Сообщений: 146
Я тут с 13 фев 2020
Откуда: Москва
Двиг: c2
Репутация 33 [ ? ]

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 25 июл 2020, 16:28

ViGaCi писал(а):▪ Set Layout scale to Scale*1

ViGaCi писал(а):Scale*1

Зачем умножать на 1? :lol:
Аватара пользователя

Игродел
Сообщений: 1422
Я тут с 06 июл 2015
Репутация 362 [ ? ]

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 26 июл 2020, 16:16

Ребята, я не особо так вникал в пример так что сори. Просто добавил создание 50к этих желтых рендор индикаторов. У кого комп не тянет или наоборот можете добавить или уменьшить их количество. С отрисовкой 50к у меня грузит 6,7 сек. Короче получилось что при значительной потере качества почти нет прироста в произв_нагрузке итд. Вполне возможно данный крештест не подходит, может 50к это слишком итд но при 5к изменений в произв. так же не наблюдается. И даже уменьшение scale с 1 до 0,25 почти не повышает произв (полностью убив графику) :( Единственное наблюдаемое улучшение - уменьшение использованной памяти (пример с 50к: scale 1 до 0.25 Уменьшилось с 22,8мб до 19,4мб)

Изображение
Тест с 50к.

Кажется мне что на практике все это будет бесполезно...
ResizePerfomance_CrashTest1.capx
(268.56 КБ) Скачиваний: 98
Изображение Изображение Изображение
Аватара пользователя

Игродел
Сообщений: 1534
Я тут с 25 ноя 2014
Откуда: TLV
Двиг: Construct 2
Лицензия: Personal
Репутация 183 [ ? ]

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 28 июл 2020, 13:21

nagval333 писал(а):Ребята, я не особо так вникал в пример так что сори. Просто добавил создание 50к этих желтых рендор индикаторов. У кого комп не тянет или наоборот можете добавить или уменьшить их количество. С отрисовкой 50к у меня грузит 6,7 сек. Короче получилось что при значительной потере качества почти нет прироста в произв_нагрузке итд. Вполне возможно данный крештест не подходит, может 50к это слишком итд но при 5к изменений в произв. так же не наблюдается. И даже уменьшение scale с 1 до 0,25 почти не повышает произв (полностью убив графику) :( Единственное наблюдаемое улучшение - уменьшение использованной памяти (пример с 50к: scale 1 до 0.25 Уменьшилось с 22,8мб до 19,4мб)

Изображение
Тест с 50к.

Кажется мне что на практике все это будет бесполезно...


Ну вот смотри. В случае полноэкранного режима, разрешение, которое указано в настройках проекта (WindowSize) - это не разрешение экрана, а как бы "захватываемая площадь" игрового пространства. Реальное разрешение игры напрямую зависит от разрешения экрана пользователя. Чем больше разрешение экрана - тем больше площадь текстур, которые хранятся в видеопамяти. А чем больше площадь текстур - тем мощнее должен быть графический процессор(GPU), чтобы отрисовывать кадр. Для 60 ФПС кадр должен отрисовываться за 0.016 сек (1/60). Если время на отрисовку кадра > 0.016 сек, то ФПС падает.

Изображение

В этом уроке описан способ (своего рода костыль), с помощью которого можно программно изменить площадь текстур. В случае с 50k объектами, проседание ФПС происходит уже по другой причине.
Последний раз редактировалось ViGaCi 28 июл 2020, 13:29, всего редактировалось 1 раз.
У цьому полі, синьому, як льон
Де тільки ти і ні душі навколо...
Аватара пользователя

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 28 июл 2020, 13:27

Bishop писал(а):
ViGaCi писал(а):▪ Set Layout scale to Scale*1

ViGaCi писал(а):Scale*1

Зачем умножать на 1? :lol:

Там изначально формула была, потом упростил, а умножение на единицу просто забыл убрать :biggrin:
У цьому полі, синьому, як льон
Де тільки ти і ні душі навколо...
Аватара пользователя

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 02 сен 2020, 21:27

ViGaCi, Поэкспериментировал маленько... Возникли вопросы. Вот ты в исходнике используешь Fullscreen scalling = Low
Я добавил в текст отображение параметра OriginalWindowWidth (и Height) - это вроде как размер Canvas Size, или аналогия Window Size в свойствах проекта.
Записал гифку с твоим примером. OriginalWindowWidth (и Height) меняется в соответствии с Canvas Size c 1280x720 на 640х360. При этом ощутимо портится картинка, как ты и говорил.
Изображение
Я поставил Fullscreen scalling = High и записал гифку. По параметрам показывает тоже самое, но картинка НЕ испортилась. То есть площадь отрисовки уменьшилась и сохранилась чёткость. Зачем тогда Low использовать ?
Изображение
P.S. на FPS не смотри, у меня куча софта было открыто
---
Более того, используя Low показатель ImageMemoryUsage показывает бОльшее использование памяти. При Scale=1 оно равно 21.83 Мб, а при Scale=0.5 оно равно 18.93
Используя Fullscreen scalling = High показатель ImageMemoryUsage при любом скейле = 18.48
Изображение Изображение Изображение
Аватара пользователя

Игродел
Сообщений: 2606
Я тут с 26 сен 2013
Откуда: Екб
Двиг: C2
Репутация 335 [ ? ]

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 07 сен 2020, 17:01

AferisT, честно скажу, уже не помню почему именно такие параметры выставлял. Эта тема — скорее эксперимент, чем практическое руководство к действию. Странно что у тебя увеличился FPS, когда изменил значение с Low на High. Насколько я помню, там само увеличение FPS происходило как раз за счёт ухудшения графики. А ты только на превью проверял? После экспорта результаты могут отличаться.
У цьому полі, синьому, як льон
Де тільки ти і ні душі навколо...
Аватара пользователя

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

Сообщение Как управлять разрешением экрана (площадью отрисовки)
» 07 сен 2020, 18:04

ViGaCi, не, я написал, что на фпс не стоит обращать внимание. В момент записи гифки куча стороннего софта была открыта, а ноут слабенький. Без него 60 фпс будет и там и там.
Попозже экспортирую эти 2 варианта на ПК и посмотрю, будут ли результаты отличаться...
Изображение Изображение Изображение
Аватара пользователя

Игродел
Сообщений: 2606
Я тут с 26 сен 2013
Откуда: Екб
Двиг: C2
Репутация 335 [ ? ]



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

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

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

Наверх