Как Blueprints облегчают жизнь или о том, как вылечить глубоко больной проект за один день

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

Вообще, все проекты уникальны, даже если выполнены одним человеком. Вы найдете сотню одинаковых zombie survival'ов, но изнутри все они отличаются как ссаная тряпка и принцесса австрийская.

"Куда бежать? Что делать? Кого спросить?" - воскликнет слабый духом. А грустный программист откроет гугл, или, если он уже достаточно стар, сразу Profiler:

Нехитрый функционал нашего любимого движка как бы намекает нам стараться как можно меньше разбираться, что за чудо предстает перед нами каждый раз, когда открывается новое окно очередного developer tool'а. Поэтому минуем все невзгоды чтения документации и переходим к главному действу, определяющему наш с вами статус и занятость по жизни. Будем думать.

В моем случае stat.game ругался на TickTime (ну а, что вы собственно ожидали при стабильном и низком FPS?), а профайлер сузил область поиска до SlatePrepass:

Как Blueprints облегчают жизнь или о том, как вылечить глубоко больной проект за один день

Обычно на этом этапе остается только погуглить и найти решение похожей или точно такой же проблемы, но случай оказался тяжелый. Запущенный я бы даже сказал. Множество благотворителей от бога, которые стремятся обелить карму до того, как обретут достаточное для этого количество знаний, заполонили AnswerHub и мою проблему нивелировали. Вкратце: "Васян, кто ж профайлер запускает в редакторе?! Там же виджеты! Вот у тебя 22 мс и сожрало." В. Каждом. Фрейме. Лютый редактор, да?

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

Long story short, если поиск в гугле и профайлер не помог, придется устроить локальную спецолимпиаду по программированию и отключать куски кода в надежде, что какой-то покажется вам подозрительным и его отключение поднимет фпс. Лучше всего начинать бомбить глобально. Я, например, тупо выключил все виджеты (есть даже такая функция RemoveAllWidgets).

Сразу же мой фпс встал с колен и пошел захватывать Ближний Восток . Я получил прирост втрое. И это при совершенно обычном на первый взгляд GUI с пачкой слотов внизу экрана и подсказками в уголке. Ага, что дальше? Если вы сильно умный, то ответ возможно уже знаете, если вы такой же грустный и обычный, то идем смотреть используемые виджеты (поиск по всему коду функции CreateWidget).

На первый взгляд вам может открыться удивительный мир tick getter'ов и тонна математики на Event Tick'е, но если это не так? Если отключение очевидных функций не дает нужного эффекта? Мы должны воспользоваться способом любимым всеми электронщиками (знаю по себе, дорогой). Запускаем тест на перегрев!

Кто не знает как это работает, косячную микросхему часто никто не жалеет и запускает прям так, еще и напруги поддав чутка. Где задымится или завоняет, значит там и проблема. Так и в realtime коде, сломайте что-то важное и проверьте что будет, почитайте warnings, errors, вообще, откройте Log. Очень полезно!

И вот тут мы наконец и приходим к моим любимым blueprint'ам. На этапе поиска бага и ломании программы, нам нужно делать как можно больше итераций в минуту и при этом записывать результаты. Гусары-программисты остудите свои шишки! Мы реалтайм кодеры - народ простой, автоматическими тестами не пользуемся. Поэтому ваяем какие нибудь простенькие PrintString макро с задержками и вешаем на них всю гроздь инициализаций подозрительных нам классов или их функций.

Как Blueprints облегчают жизнь или о том, как вылечить глубоко больной проект за один день

И далее от общего к частному: находим нужный класс, затем нужную функцию, затем нужный нод:

Как Blueprints облегчают жизнь или о том, как вылечить глубоко больной проект за один день

На все про все минут 30. А уж когда мы нашли нужный "предохранитель" переключение которого и влияет на наш фпс, остается лишь немного подумать, а если не поможет - погуглить. В случае с этим проектом, проблема была в диком количестве виджетов со сложным деревом, которые никто не удосуживался прятать по уму. Ибо Hidden ничего не говорит движку и он продолжает чекать каждый слот и его родительских слотов на видимость в SWidget::SlatePrepass(), что и привело к постоянному перегрузу Game Thread.

Результат: прячьте виджеты юзая Collapsed , а не Hidden! А еще лучше не создавайте простыню из 2000 сложных виджетов в одном Scroll Box'е :)

На DTF теперь можно подписываться на юзеров. У меня в планах есть несколько статеек по геймдеву таких как:

  • "Проблемы кодинга в выпущенных проектах" или "Отсутствие свободы, куча засохшего говна вместо кода и ответственность "последнего" на проекте"
  • "Целесообразность диалогов и разнообразия текста в современных RPG"
  • "Какие шансы у вашей игры стать успешной"

Так что, подписывайтесь, вдруг поможет :D

2121
6 комментариев

А можно пояснение для тех, кто в танке и не UE программист? Сам подход поиска нагрузки довольно интересный, только не понял, к чему цепляется блупринт и что он делает

Ответить

Прошу прощения, мои статьи по UE4 расчитаны на достаточно высокий уровень. То есть я ожидаю, что люди имеют представление о фреймворке Unreal, о коде, о  Blueprints VM и могут склепать на коленке рабочую игру.

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

3
Ответить

Комментарий недоступен

2
Ответить

"Какие шансы у вашей игры стать успешной"У меня в черновиках валяется похожее, правда там сразу в названии спойлер xD

Ответить