LifeEXE | Unreal Engine | CG
1.89K subscribers
384 photos
470 videos
423 links
Download Telegram
📕 Всем привет! 📕

Хорошая бесплатная книга по стандартным алгоритмам. Идеально подходит как справочник:
🔗 https://github.com/HappyCerberus/book-cpp-algorithms

PDF-версия доступна в README или в релизах:
🔗https://github.com/HappyCerberus/book-cpp-algorithms/releases/tag/v1.0.1

💡 Напоминаю, что стандартная библиотека STL строится на трёх фундаментальных концептах:
🔤Структуры данных (контейнеры)
🔤Итераторы (способ обхода контейнеров)
🔤Алгоритмы (операции над данными в контейнерах)

🎮 В Unreal Engine мы чаще всего используем TArray, TMap, TSet, TList. Это проприетарные контейнеры, оптимизированные под систему памяти, Garbage Collector и рефлексию UE.

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

🔽🔽🔽🔽🔽🔽🔽🔽

✏️ Я написал отдельную статью про контейнеры и алгоритмы в Unreal Engine для подписчиков на Boosty и Patreon:
🔤Статья на Boosty
🔤Статья на Patreon

В статье на примерах рассматриваем предикаты и проекции (способ указать алгоритму, по какому полю объекта нужно выполнять операцию).

🔤🔤🔤🔤🔤🔤🔤

🤝 Поддержать:
Patreon | Boosty | PayPal

Ресурсы:
GitHub | Itch | X | Wiki | LifeEXE School

#lifeexe #lifeexecode #unrealengine #ue5 #cpp #stl
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥291252👍2🦄1
This media is not supported in your browser
VIEW IN TELEGRAM
📕 Всем вечерний привет! 📕

Небольшая статья по созданию симуляции океана на основе модели Тессендорфа ⬇️

🔗 Oceans: Theory to Implementation

Автор пошагово разбирает весь процесс — от теории до практической реализации:

🔤Генерация спектра волн
🔤Обратное преобразование Фурье
🔤Создание карт смещения и нормалей
🔤Рендеринг, шумы, нормали и PBR освещение

👨‍💻 Материалы включают псевдокод на C++/HLSL

#learn #ocean #theory #cpp #hlsl #gamedev #lifeexe #lifeexecode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3576👍3🦄11
🆓 Всем привет, всем привет! 🆓

Вышел бесплатный open-source плагин для Unreal Engine, который позволяет распределять «тяжёлые» задачи на несколько кадров ⬇️

📱 Gameplay Work Balancer

💡 Вместо того чтобы выполнять сложную операцию за один кадр и получить потенциальный лаг, вы можете разбить её на части. Это особенно актуально для таких задач, как:

🔤Массивный спаун
🔤Процедурная генерация
🔤Обработка больших массивов данных
🔤Инициализация или очистка VFX/SFX
🔤Сложные расчеты AI

GWB не делает задачи асинхронными и не переносит их в другие потоки — они выполняются в основном игровом потоке, просто распределяются по кадрам (time-slicing).

🔤

Если стоит задача не раздробить вычисления, а управлять операциями, требующими ожидания, то имеется другой плагин для написания асинхронного кода ⬇️

📱 ue5coro

Плагин добавляет в движок полноценную поддержку C++20 корутин ⬇️

📕 coroutines

#gameplay_work_balancer #gwb #ue5coro #plugin #free #coroutine #cpp #unrealengine #ue5 #gamedev #lifeexe #lifeexecode
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3414🦄41
📕 Всем привет, всем привет! 📕

В эфире рубрика выходного дня: Воскресный C++ 🦊

Numeric limits в стандарте C++ и в Unreal Engine
На Boosty и Patreon расширенная статья с множеством интерактивных примеров в Compiler Explorer


🔤🔤🔤🔤🔤🔤🔤🔤 🔤

std::numeric_limits в C++ — это стандартный шаблонный класс, который предоставляет информацию о свойствах числовых типов, например:

🔤Минимальные и максимальные значения.
🔤Точность в десятичных знаках.
🔤Специальные значения: infinity, quiet_NaN, signaling_NaN и другие.

Полная спецификация на cppreference.com

Простейший пример использования:
#include <limits>
#include <print> // C++23

int main()
{
std::println("Max int: {}", std::numeric_limits<int>::max());
std::println("Min double: {}", std::numeric_limits<double>::min());
std::println("Lowest float: {}", std::numeric_limits<float>::lowest());
std::println("Double epsilon: {}", std::numeric_limits<double>::epsilon());
return EXIT_SUCCESS;
}


Ключевые особенности
⬇️

Безопасность
🔤Использование шаблонов позволяет компилятору проверять корректность типов на этапе компиляции, предотвращая ошибки.

Вместо «магических чисел» (например, 2147483647 для int), вы используете std::numeric_limits<int>::max(). В итоге код становится более читаемым и переносимым (платформонезависимым).

Портируемость
🔤Работает с любым числовым типом — int, float, double, uint64_t, а также с пользовательскими числовыми типами, если для них существует специализация шаблона numeric_limits .

Чистота кода
🔤Сразу видно, что речь о границе типа.

Когда реально нужен ⬇️

🟢 Для инициализации переменных максимальным или минимальным значением типа. Например, при поиске минимума/максимума в массиве.
🟢 Для проверки переполнения или выхода за пределы диапазона.
🟢 Для шаблонного кода, где тип неизвестен заранее.
🟢 Спецзначения: бесконечность и NaN.

💡 Дополнительно полезно почитать про:
🔤Saturation arithmetic
🔤std::add_sat


🔤🔤🔤🔤🔤🔤 🔤🔤🔤🔤🔤🔤

В Unreal Engine имеется собственный шаблон TNumericLimits<T> — это аналог std::numeric_limits, реализованный в движке.

Заголовочный файл находится по адресу: Runtime/Core/Public/Limits.h

Применение абсолютно аналогичное, как и в стандартном C++:
#include "Math/NumericLimits.h"
#include "Logging/StructuredLog.h"

DEFINE_LOG_CATEGORY_STATIC(LogNumLimitsTest, All, All);

void NumLimitsTest()
{
const int32 MaxInt = TNumericLimits<int32>::Max();
const int32 MinInt = TNumericLimits<int32>::Min();

const float MaxFloat = TNumericLimits<float>::Max();
const float MinFloat = TNumericLimits<float>::Min();

UE_LOGFMT(LogNumLimitsTest, Display, "Int32: Min={0}, Max={1}", MinInt, MaxInt);
UE_LOGFMT(LogNumLimitsTest, Display, "Float: Min={0}, Max={1}", MinFloat, MaxFloat);
}


💡Согласно последним рекомендациям, в коде проектов под Unreal Engine можно использовать и стандартный std::numeric_limits — читаем раздел Use of standard libraries. Поэтому можно выбирать любой подходящий под вашу конкретную ситуацию шаблон.

Всем чистого кода 🤘

🔤🔤🔤🔤🔤🔤🔤

🤝 Поддержать:
Patreon | Boosty | PayPal

Ресурсы:
GitHub | X | LifeEXE School | Itch | Wiki | Курс по UE

#code #cpp #code_hints #lifeexeEDU #unrealengine #ue5 #gamedev #lifeexe #lifeexecode #best_practice #numeric_limits #clean_code
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥241692🦄1
📕 Всем привет, всем привет! 📕

В эфире рубрика выходного дня: Воскресный C++ 🦊

Написал большую статью на тему:
«Asserts в стандарте C++ и в Unreal Engine»

❗️ На Boosty и Patreon полная версия с множеством примеров!


По традиции сначала разбираем как все работает на чистом
C++, а потом смотрим, что происходит в Unreal Engine
.

🔤🔤🔤🔤🔤🔤

Assertions — это утверждения, проверяющие предположения программиста о корректности кода. Они помогают выявлять ошибки и документировать инварианты.

Инвариант — это условие, которое должно быть истинным всегда в определённом контексте.

Зачем нужны assertions?
🔤Раннее выявление логических ошибок
🔤Документация ожиданий внутри кода
🔤Обеспечение корректности API

Виды assertions
🔤Времени выполнения — runtime assertions
🔤Времени компиляции — compile-time assertions

🔤🔤🔤🔤🔤🔤🔤🔤 🔤

В стандартном C++ основной инструмент для реализации утверждений — это макрос препроцессора assert, определенный в заголовочном файле <cassert> :

🔤Если выражение истинно — ничего не происходит, и выполнение программы продолжается.
🔤Если выражение ложно — макрос assert выводит диагностическое сообщение в стандартный поток ошибок stderr и немедленно завершает программу путем вызова функции std::abort() ➡️

double div(double numerator, double denominator) 
{
assert(denominator != 0.0);
return numerator / denominator;
}


Стандартный макрос assert не имеет встроенного параметра для пользовательских сообщений. Однако существуют две распространенные идиомы для добавления диагностики, которая будет выведена в диагностическом сообщении в случае сбоя ➡️

assert(divisor != 0 && "Divisor cannot be 0");
assert(("Divisor cannot be 0", divisor != 0));


Распространенная ошибка при использовании assert — это включение в проверяемое выражение кода с побочными эффектами.

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

⚠️ Пример того, как делать НЕЛЬЗЯ:
assert(InitializeSubsystem());


✔️ Правильный подход — всегда отделяем действие от проверки:
[[maybe_unused]] const bool bSuccess = InitializeSubsystem();
assert(bSuccess);


🔤🔤🔤🔤🔤🔤 🔤🔤🔤🔤🔤🔤

Unreal Engine расширяет стандартный макрос assert , добавляя дополнительные возможности к рантайм проверкам, Имеются следующие семейства: check, verify, ensure.

🔤🔤🔤🔤🔤

Семейство check является прямым эквивалентом стандартного assert в Unreal Engine. Сбой check указывает на критическую ошибку в программе, и выполнение немедленно останавливается ➡️

void AMyActor::CalculateJumpVelocity(AActor* JumpTarget, FVector& JumpVelocity)
{
check(JumpTarget != nullptr);
}


Остальные макросы данного семейства: check, checkf, checkSlow, checkfSlow, checkCode, checkNoEntry, checkNoReentry, checkNoRecursion, unimplemented

🔤🔤🔤🔤🔤🔤

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

Полный список макросов: verify, verifyf, verifySlow

🔤🔤🔤🔤🔤🔤

Данное семейство макросов используется для сообщения о нефатальных ошибках. Программа не завершает работу, а отправляет отчет со стеком вызовов в Crash Reporter и продолжает выполнение: ensure, ensureAlways, ensureMsgf, ensureAlwaysMsgf

🔤🔤🔤🔤🔤 🔤🔤🔤🔤

🔤Можно проверить на этапе компиляции → static_assert
🔤Критическая ошибка + нет побочных эффектов → check
🔤Критическая ошибка + есть побочные эффекты → verify
🔤Дорогая проверка только для отладки → checkSlow
🔤Некритическая ошибка, продолжаем работу → ensure
🔤Недостижимый код → checkNoEntry или unimplemented
🔤Защита от рекурсии → checkNoRecursion
🔤Защита от повторного вызова → checkNoReentry

В статье на Boosty и Patreon подробнее про каждый из макросов и static_assert


Всем чистого кода 🤘

🔤🔤🔤🔤🔤🔤🔤

🤝 Поддержать:
Patreon | Boosty | PayPal

Ресурсы:
GitHub | X | LifeEXE School | Itch | Wiki | Курс по UE

#code #cpp #code_hints #lifeexeEDU #unrealengine #ue5 #gamedev #lifeexe #lifeexecode #best_practice #assert #clean_code
Please open Telegram to view this post
VIEW IN TELEGRAM
21🔥3810👍95🦄11
📕 Всем привет, всем привет! 📕

Поздравляю с началом нового учебного года! 👩‍🎓

Забирайте бесплатный купон на 100 мест на мой курс «Unreal Engine — полное руководство по разработке на С++»


🔗 https://www.udemy.com/course/unrealengine/?couponCode=00250F448AD817219C30

📣 Распространение купона приветствуется! 📣

🔤🔤🔤🔤🔤

Статистика по курсу на сегодня следующая ⬇️

6️⃣9️⃣0️⃣0️⃣студентов

1️⃣5️⃣0️⃣0️⃣ отзывов

Студенты из 7️⃣6️⃣ стран, знающие 1️⃣9️⃣ языков

3️⃣.3️⃣7️⃣9️⃣.8️⃣6️⃣3️⃣ минут просмотров6️⃣ лет

‼️ Курс находится на 15 месте среди всех курсов на русском языке по разработке программного обеспечения на Udemy — на первой странице!

Всем спасибо за отзывы и прохождение!

🔤🔤🔤🔤🔤🔤🔤

🤝 Поддержать:
Patreon | Boosty | PayPal

Ресурсы:
GitHub | X | LifeEXE School | Itch | Wiki | Курс по UE

#code #cpp #lifeexeEDU #unrealengine #ue5 #gamedev #lifeexe #lifeexecode #udemy #course #shooter #free #coupon
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥76216❤‍🔥32🦄11
🤘 Всем пятничный йоу! 🤘

Детей без присмотра не оставляем 🤱

#пятничное #friday #cpp #unrealengine #ue5 #gamedev #lifeexe #lifeexecode #meme #humor
Please open Telegram to view this post
VIEW IN TELEGRAM
😁371562🦄1
This media is not supported in your browser
VIEW IN TELEGRAM
📱 Всем привет, всем привет! 📱

Вышла Visual Studio 2026 Insiders — так теперь называется preview сборка. Скачать бесплатную Community версию можно по ссылке ⬇️

🔗 Visual Studio 2026 Insiders

Внутри:
🔤Обновленный интерфейс
🔤Улучшения редактора
🔤Подсветка C++ атрибутов
🔤.NET 10 и C# 14 поддерживаются «из коробки»
🔤Ещё более глубокая AI-интеграция 🙂 конечно же

Подробнее можно почитать в блоге ⬇️

🔗 Visual Studio 2026 Insiders is here!

💡 В Release Notes больше информации о фичах. Появился, например, встроенный Code coverage. Видео на данную тему имеется на моём канале ⬇️

🔗 Тестирование в Unreal Engine. Метрики тестирования. Тестовое покрытие. OpenCppCoverage + Jenkins

и также в тему⬇️

🔗 ТОП-50 горячих клавиш Visual Studio для навигации, редактирования кода и дебагинга

#vs #code #cpp #gamedev #lifeexe #lifeexecode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥239👍6🦄11
🤘 Всем привет, всем привет! 🤘

С днём программиста всех причастных! 👨‍💻

И да.. стандарт 🔤1️⃣2️⃣8️⃣ уже на подходе..

#day256 #code #cpp #programmer_day #gamedev #lifeexe #lifeexecode #humor
Please open Telegram to view this post
VIEW IN TELEGRAM
30😁26🔥9🎉8🤯4👍33🦄2
Media is too big
VIEW IN TELEGRAM
👨‍💻 Всем вечерний привет! 👨‍💻

В новый Unreal Engine 5.7 завезли ИИ ассистента — плагин AIAssistant, который находится по адресу: Engine\Plugins\Experimental\AIAssistant

Плагин элементарный: он просто открывает веб-морду Epic Developer Assistant в отдельном окне редактора движка, и, кстати, работает без логина:
🔗 https://dev.epicgames.com/community/assistant/embedded

😐 Но код конечно интересный — пробежался по исходникам.
Всё выглядит так, что разработчики, создавая плагин для интеллекта искусственного решили пренебречь интеллектом естественным.


Лапидарно — несколько моментов, которые прямо бросаются в глаза 👀

🚨 Структура — всё в кучу, как в гостях у Облонских: и бизнес-логика, и Slate UI, и конфиги, и тесты.

💡 Один из способов организации кода плагина можно посмотреть в моём open-source UnrealOpenAIPlugin — простейшее разделение исходников на 3 модуля:

🔤Core классы — ядро
🔤Пользовательский интерфейс — Slate/UMG
🔤Тесты

🔴 Использование TSet в простейшем случае для 14 символов? Возможно, конечно автор изучал структуры данных на данном коде — кто знает:
FString FAIAssistantConfig::GetMainUrlAsRegexString() const
{
static const TSet<FString::ElementType> CharactersToEscape{
'.', '*', '+', '?', '(', ')', '[', ']', '{', '}', '^', '$', '|', '\\',
};
FString Escaped;
Escaped.Reserve((MainUrl.Len() * 2) + 2 /* Allow for regex anchors */);
Escaped += FString::ElementType('^');
for (const FString::ElementType Character : MainUrl)
{
if (CharactersToEscape.Contains(Character))
{
Escaped += FString::ElementType('\\');
}
Escaped += Character;
}
Escaped += FString::ElementType('$');
Escaped.Shrink();
return Escaped;
}


💡 TSet тут избыточен — создаётся хеш-таблица с бакетами и метаданными для всего нескольких статических символов. Хватит switch/if или простейшей строки-набора:
static const FString CharsToEsc = TEXT(".+*?()[]{}^$|\\");


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

🔴 FString::ElementType в данном случае только усложняет читаемость — можно смело использовать TCHAR.

🟢 Напоминаю, что тип FString имеет методы Append и AppendChar, которые аккуратно избавят от громоздких конструкций вида += FString::ElementType
⬇️
Escaped += FString::ElementType('^');

⬇️
Escaped.AppendChar('^');


💡 Сама функция GetMainUrlAsRegexString привязана к классу. Очевидно, её можно освободить или оформить как часть библиотеки утилит, передавая MainUrl параметром. Это разблокирует (помимо славы выдающегося архитектора ПО):

🔤Переиспользование
🔤Простоту тестирования — изолированные unit-тесты
🔤Композицию — можно комбинировать функции
🔤Single Responsibility Principe (SRP) — принцип единственной ответственности: функция делает ровно свою работу, а не «висит» на конфиг-классе, к которому относится лишь косвенно

🔴 Тесты написаны в старых нотациях IMPLEMENT_SIMPLE_AUTOMATION_TEST, хотя Automation Spec уже давно доступен. Ничего критичного, но зачем тянуть старое в новом плагине.

💡В курсе по тестированию на канале мы рассматриванием оба подхода.

🔤🔤🔤🔤🔤🔤🔤

🤝 Поддержать:
Patreon | Boosty | PayPal

Ресурсы:
GitHub | X | LifeEXE School | Itch | Wiki | Курс по UE

#code #cpp #plugin #unrealengine #ue5 #gamedev #lifeexe #lifeexecode #ai #ai_assistant #tests #code_review
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3410🦄642😁21👍1