{"id":3844,"url":"\/distributions\/3844\/click?bit=1&hash=4d7fce000a2ec2f7e5f8a0040eb16bc6a9d510f51acd726f741f57860d5c603e","title":"\u0415\u0441\u0442\u044c \u043b\u0438 \u0432 \u043c\u0438\u0440\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0435\u0447\u043d\u043e\u0435? \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0435\u0441\u0442\u0435","buttonText":"\u041f\u0440\u043e\u0439\u0442\u0438","imageUuid":"2b8bc26b-601b-5389-a8cc-d98f6166a132","isPaidAndBannersEnabled":false}
Gamedev
Maltsev Denis

Баланс C++ и Blueprints в UE4

Все в кучке: С++, Blueprints и результат http://www.rionix.com

В продолжение моего прошлого поста:

В этот раз поговорим про С++ и Blueprints и о том, как они могут повлиять на память и производительность игры. И, как обычно, категорически приветствуется обсуждение статьи в комментариях! Делимся своим опытом и становимся лучше 😁

C++ vs Blueprints

Можно ли написать игру используя только Blueprints? Можно. Можно ли написать игру используя только C++? Можно. А что тогда выбрать? А выбирать не надо, надо использовать оба языка. Главное - правильно соблюсти баланс.

Можно писать на чем-нибудь другом? Конечно: Python, C #, SkookumScript, Lua и др. Вот только, за исключением питона - это неофициальные плагины. Да и на питоне можно писать код только для редактора, но не самой игры. Это плохо? С точки зрения эпиков - С++ и блюпринты покрывают все потребности разработчиков. Я с ними согласен. Вы - решайте сами.

С++ - сложнааааа!!! В общем случае - да 😃 Если говорить об UE4, то не сложнее C # в Unity. Если не лезть глубоко внутрь исходников движка, то ужасы С++ обойдут стороной. Основная сложность любого движка заключается в его структуре, в понимании взаимодействия его модулей. UE4 не исключение.

Особенности работы движка

  • Если что-то подгружаем в С++ (ConstructorHelpers), то это будет загружено при старте модуля. Грубо говоря, в момент старта игры. Неважно, используется это или нет, создан этот объект или нет. И висеть все будет в оперативке или видеопамяти на протяжении всей работы модуля.
  • Зависимости (references). Например, меш зависит от материала(ов), а материал зависит от текстур. Когда мы грузим меш, подтягиваются и все его зависимости. Ням-ням-ням и кирпичик из 8-ми вершин, тянет за собой пару-тройку текстур в 4К.
  • Чтобы вызвать маленькую функцию из какого-нибудь блюпринта, движок загружает его весь. Благодаря зависимостям, это может потянуть за собой половину проекта, включая текстуры и звуки.
  • Блюпринты сильно медленнее С++, даже нативизированные. Часто звучат такие цифры: от 7 до 30 раз.

C++ и Blueprints

Даже если вы решили писать игру только на Blueprints, создавайте именно С++ проект. В скором времени вы убедитесь, что многие вещи гораздо проще решить с использованием С++. А переконвертировать Blueprint проект в С++ не так и просто.

Первое и основное правило - если что-то можно написать на С++, пишите на С++. Основная прелесть в том, что зависимостей в С++ нет. Нужно вызвать метод класса - не проблема, нужно скастовать к другому типу - все хорошо, кастуем. Blueprints такое не прощают.

Одно условие - не надо в конструкторе загружать ассеты. Откуда взялось такое условие? Дело в том, что для каждого AActor автоматически создается его default версия. И, естественно, для нее вызывается конструктор.

Эм... а блюпринты куда? А блюпринты грузятся только тогда, когда они нужны. И в этом их прелесть - ассеты подтянутся, только тогда, когда блюпринт начали использовать (в другом блюпринте или поместили на уровень). Поэтому, часто разбивают код так: всю логику работы выносят в базовый класс на С++, а настройки, меши, материалы и эффекты - в блюпринты-наследники. Даже если этот блюпринт-наследник будет единственным.

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

Блюпринты великолепны для прототипирования. Вот только с усложнением кода, становится все сложнее разбираться в получившейся "лапше". Как только идея устаканилась, старайтесь перенести ее на С++. Анализ кода, поиск и читаемость - не лучшие стороны блюпринтов:

Надо сводить к минимуму зависимость блюпринтов друг от друга. Зависимость Controller и Character обоснована - они не могут работать друг без друга. Но, ситуация, когда А тянет за собой В, который тянет C и D и все дальше и глубже, приведет к печальным последствиям. Причем простейший "Cast to" уже введет зависимость и начнет грузить другой блюпринт! Интерфейсы или взаимодействие на уровне С++ помогут разрулить ситуацию.

Циклические зависимости могут привести проект в полностью нерабочее состояние. У меня такое тоже было... Пришлось переписывать весь код игры.

Я написал блюпринт и хочу использовать его переменную или вызвать его функцию в С++. Это возможно? Если коротко, то: Да. Однако, по словам эпиков: "Если бы вы видели этот код, то никогда не захотели бы его использовать". Так что правильный ответ: Нет. Хотите что-то использовать в С++ из блюпринтов - объявите это в С++.

Производительность блюпринтов. Ее достаточно для игровой логики. Что-то сложнее, лучше выносить в С++. Крайне не рекомендуется делать блюпринты с Tick'ом. "Тикать" лучше на С++. С другой стороны, нет ничего страшного, если блюпринт изредка включает свой тик на короткое время, или тикает не каждый кадр, а пару раз в секунду. Также стоит помнить, что Tick - это просто таймер по умолчанию. Вынос "тикающего" кода в другие таймеры или Timeline не исправит ситуацию.

Все блюпринты, унаследованные от AActor, создаются по умолчанию с включенным Tick. Это можно поправить настройками проекта (Can Blueprints Tick by Default). Но лучше всего перепроверять вручную соответствующие галочки. Ну и консольная команда "dumpticks" в помощь.

Что еще посмотреть или почитать?

Я не рассказал про hard references и soft references. Исправляюсь тут:

Отличный пример того, как правильно сбалансировать С++ и Blueprints, показан в демо-проекте Action RPG:

И советую посмотреть эти видео:

Blueprints In-depth - Part 1 | Unreal Fest Europe 2019
Blueprints In-depth - Part 2 | Unreal Fest Europe 2019

PS: Еще, я не рассказал про блюпринты и совместную работу. Но это тема для отдельного разговора...

0
79 комментариев
Написать комментарий...
Eugen Dubovik

Автор продолжай ) не хватает как раз базовых статей на эту тему

Ответить
Развернуть ветку
Maltsev Denis
Автор

Я постараюсь сделать статью с подборкой на видео-туториалы и статьи для начала разработки. Если до этого, никто меня не опередит, конечно.

Ответить
Развернуть ветку
1 комментарий
Dmitriy Vergasov

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

Ответить
Развернуть ветку
3 комментария
Eugene Korneev

С++ в анриле не настолько сложный, насколько геморный. Апиха богатая, располагает к правильной архитектуре приложения, но все эти кучи макросов перед каждым методом, которые еще и не автокомплитятся в ide, просто выводит из себя))
Поэтому стараюсь делать так, как и пишет автор – сначала писать логику на bp (в тех случаях, когда это возможно), и лишь когда она ±фиксируется, переписывать тяжелые ее куски на плюсы.

А статья хорошая, ссылки полезные, спасибо :)

Ответить
Развернуть ветку
Dmitriy Vergasov

Что имеешь в виду под "не автокомпилятся в ide"?

Ответить
Развернуть ветку
2 комментария
Let 'er Rip

Ну дак блупринты в основном расчитаны как раз на тех, кто в программирование особо вникать не хочет. Смысл советовать им юзать С++ и Блупринты, если те, кто сидит на блупринтах скорее всего не могут в С++, а те кто может, так и делает. Сложна.

Ответить
Развернуть ветку
Maltsev Denis
Автор

Иногда код на блюпринтах получается чище, понятнее и элегантнее, чем на С++.

Ответить
Развернуть ветку
Darkusoid

Самый прикол в том, что блюпринты это тоже самое программирование(алгоритмы), просто без синтаксиса плюсов и более наглядно что ли..

Ответить
Развернуть ветку
1 комментарий
gammaclone

Я могу и в блупринты, и в С++
Всё равно в некоторых местах просто удобнее использовать блупринты

Ответить
Развернуть ветку
Воинский торшер

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

Ответить
Развернуть ветку
Материализм и эмпириокритицизм

Хмм, вообще, как я понял из кучи статей, БП - для геймдизайнеров, а не разработчиков (условно). Чтоб было удобно жонглировать параметрами, ассетами и т.п.

Ответить
Развернуть ветку
Александр Дымов

Не совсем понимаю зачем использовать функцию другого объекта. Есть же компоненты, библиотеки макросов и функций в конце концов. Закидывает туда все универсальные и вызываешь из любого места.
Тик, насколько я понимаю, тоже нифига не дефолтный таймер, а вполне себе время между кадрами. По крайней мере есть товарищи у которых во время просадки ФПС объекты зависящие от тика сходили с ума. Поправьте, если есть какие ссылки на доки, позязя.
Касаемо макаронных Монстров - это просто ошибки новичков. Обычный код тоже легко сделать нечитаемым, если не комментить и не придерживаться стандартов и гайдстайлов. Ну и лично меня лапша мотивирует мыслить функционально.

Ответить
Развернуть ветку
Maltsev Denis
Автор

Библиотеки функций - прямой путь к циклическим зависимостям и референсам на полпроекта. Удачки 😁
Тики - смотрите реализацию на С++. Обычный таймер.
Очень часто реальный код в тексте читабельнее, понимательнее и искательнее на порядки лучше макарон. 😉

Ответить
Развернуть ветку
2 комментария
Волшебный дебаркадер

Вот буквально полтора месяца назад начали пилить проект на UE, програмиста не было, поэтому начал разбираться с блупринтами. Буквально за неделю уже что-то начало работать. Сейчас начал копать про оптимизацию и тоже наткнулся на то, что эпики рекомендуют использовать блупринты для логики, завязанной на ивентах, а не на тике. При этом весь AI моба завязан на тике.

Учить плюсы неохота, но я слышал, что есть плагины, которые конвертят логику из блупринтов в плюсы. Кто-нибудь ими пользовался и может поделиться опытом? Т.е. понятно, что это гораздо хуже, чем писать код руками, но в каких-то пределах они выдают результат приемлемого качества?

Ответить
Развернуть ветку
Maltsev Denis
Автор

Это называется нативизация. Есть в опциях проекта.
https://docs.unrealengine.com/en-US/Engine/Blueprints/TechnicalGuide/NativizingBlueprints/index.html

Ответить
Развернуть ветку
Maltsev Denis
Автор

Так и не понял как писать в статье C# слитно 😊

Ответить
Развернуть ветку
Valery Kirichenko

Можно скопировать откуда-нибудь и вставить в редактор

Ответить
Развернуть ветку
1 комментарий
Ehecatl Tlaskala

Можете порекомендовать книгу по UE4 для начинающего?

Ответить
Развернуть ветку
Maltsev Denis
Автор
Ответить
Развернуть ветку
Фёдор Дубовик

Хороший материал, надеюсь такого будет побольше.

Ответить
Развернуть ветку
Remus Croft

Насколько сложно трансфернуться из Юньки на УЕ? Опыта 5 лет.

Ответить
Развернуть ветку
Король Ночи

выдели месяц, должно хватить на основы

Ответить
Развернуть ветку
splinefx

А зачем?

Ответить
Развернуть ветку
1 комментарий
Nikolas Ilnickiy

что лучше юнити или унриал

Ответить
Развернуть ветку
Честной пёс_анон

Что лучше, пепси или кола?

Ответить
Развернуть ветку
6 комментариев
Неизвестный бинокль

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

Ответить
Развернуть ветку
quintus silenius

Смотря для чего лучше. В общем случае на этот вопрос невозможно ответить)

Ответить
Развернуть ветку
I offer you this
Даже если вы решили писать игру только на Blueprints, создавайте именно С++ проект.

БП проект конвертится в ЦПП проект созданием любого цпп класса.

Ответить
Развернуть ветку
Dmitriy Vergasov

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

Ответить
Развернуть ветку
2 комментария
Maltsev Denis
Автор

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

Ответить
Развернуть ветку
Виталий Кулаков

А можно подробнее, о возможности писать на шарпе вместо плюсов? Собственно именно то, что Юнити позволяет Шарп, а Анриал требует плюсы - определяет мой выбор в пользу Юнити. Уверен, что не только мой, далеко не только мой. Собственно, если можно писать на шарпе под Анриал, то это повод хоть сходить, посмотреть на этот движок.

Ответить
Развернуть ветку
Maltsev Denis
Автор

У меня небыло опыта работы на C# в UE4. Я советую посмотреть именно на С++, от него, считай, только синтаксис остался. Не должно быть больших проблем с переходом.
Но, если С++ совсем не нравится, то ИМХО лучше остаться на Unity. Для него это родной язык и значит меньше проблем будет.

Ответить
Развернуть ветку
Эд Ов
Также стоит помнить, что Tick - это просто таймер по умолчанию.

Не стоит вводить людей в заблуждение. Таймер работает совсем иначе, у них есть timer manager который содержит массив этих таймеров и тригерятся таймеры только когда подошло их время. Если не ставить таймер меньше 0,016 секунд, то таймер будет дешевле, ибо когда актор тикающий он обрабатывается особым образом и общий тик не произойдет пока все тикающие акторы не тикнут(даже если в тике ничего не вызывается).

Ответить
Развернуть ветку
Maltsev Denis
Автор

Ссылки, пруфы, пояснения? Лично я ничего не понял.

Ответить
Развернуть ветку
15 комментариев
Eugene Korneev

"не автокоМПЛИтятся" – практически все время их приходится вспоминать самому и подглядывать в доки :)

И да, я полностью согласен, хорошо, что макросы есть) Я больше про то, что "благодаря" плюсам, более красивого решения и нельзя было придумать. Плюсы не сложный язык, он просто не элегантный))

Ответить
Развернуть ветку
Dmitriy Vergasov

Юзай ассист или решарпер, если ты про всплывающие подсказки. Хотя на 19 студии вроде и intellisense справляется нормально, но это не точно, не проверял.

Ответить
Развернуть ветку
1 комментарий
Eugene Korneev

эх, не туда коммент упал

Ответить
Развернуть ветку
Александр Дример

Интересно было почитать, как раз сам собираюсь вкатиться в UE4 этим летом, долго выбирал между юнькой и уе, но выбрал второе, т.к. на плюсах работаю гораздо дольше и отзывы товарища о юнити были не совсем лестные

Ответить
Развернуть ветку
Varingait

Лучший. Продолжай пожалуйста

Ответить
Развернуть ветку
Egor Semenikhin

Пишу только на плюсах. Перенос из блюпринтов в плюсы это двойная работа. Единственный минус - нужно часто рестартовать редактор.

Ответить
Развернуть ветку
Опасный Женя

Я конечно вовремя но с 4.22 добавили live++, очень сильно экономит время

Ответить
Развернуть ветку
1 комментарий
Антон Антонов
Даже если вы решили писать игру только на Blueprints, создавайте именно С++ проект. В скором времени вы убедитесь, что многие вещи гораздо проще решить с использованием С++. А переконвертировать Blueprint проект в С++ не так и просто.

Ерунда.

Ответить
Развернуть ветку
qwertyuiop

Iono ç
IojobXalDz
69!₽
On
OnoobojxxOfCuuuuuuuuusuuusuuusuUuuuuuuuuuuuuuuuuuusuuuuuuuuuuuuusscdddddxbdbxbd/==

Ответить
Развернуть ветку
Читать все 79 комментариев
null