𝐑𝐨𝐨𝐭𝐓𝐨𝐨𝐥 𝐁𝐥𝐨𝐠
194 subscribers
561 photos
48 videos
5 files
59 links
ニャン
Download Telegram
Вот так, по сусекам на скворечник, собрал простой воксельный рендер на чистом Vulkan

Первое успешное использование Vulkan, ахах

Не прям чтобы круто получилось, но мне нравится

И использовал я... Ни за что не догадаетесь: Compute Shaders))
🔥1
Хо-хо
Ну, вот так я и поизучал етот ваш Vulkan

Разобрался с дескрипторами, бррр. Такая душнота...

Зато своими ручками собрал красивую фабрику дескрипторов и пайплайнов, ибо почему бы и нет?

Теперь я понимаю за что еще люблю C++ - за непревзойденную выразительность, и одновременно, близость к металлу <3
💯1
This media is not supported in your browser
VIEW IN TELEGRAM
Бл

Надеюсь разработчики Анрила, точнее, те кто занимались UMG/Slate, когда чпокают свою жену, то чпокают не прямо, а через "высокоуровневую обертку"

Кто придумал эту связку Slate и UMG, покажите мне их!

Сука, я заплачу за свет и воду, и буду варить их в котле, индивидуально, КАЖДОГО

А для особо самоуверенных привяжу к стулу и буду палками тыкать Immediate-Mode UI фреймворками по типу ImGui
😈2❤1😁1
Прикол

Сидел значит в Rider, работал, скомпилировал код

Услышал в наушниках отчетливый звук из Анрила что код успешно скомпилировался

Смотрю на панель панель задач

А там нет открытого Анрила 💀



СлУхОвЫе ГаЛлЮцИнАцИи...
❤3😁1
2 варианта записи одного и того же в C++

Вроде бы и там и там условие...
Вроде бы 2 похожих блока...
Вроде бы 2 функции вызываются...

...или нет?
❤1🤯1💯1
𝐑𝐨𝐨𝐭𝐓𝐨𝐨𝐥 𝐁𝐥𝐨𝐠
2 варианта записи одного и того же в C++ Вроде бы и там и там условие... Вроде бы 2 похожих блока... Вроде бы 2 функции вызываются... ...или нет?
Как элегантный if ломает ноги персонажу

Казалось бы, переписал громоздкие переменные в красивое условие if(Left() || Right())

Меньше строк, код чище! Но персонаж начнет хромать. Почему?

Все из-за механизма short-circuit evaluation (короткое замыкание) в С++ (который плотно отражен в ассемблере)

Компилятор просто экономит такты процессора: если в условии A || B левое условие выполнилось A = true, то результат всего true || B уже и так ясен - и выполнять правый блок B просто не имеет смысла

Но мы забыли, что наши функции - пишут данные по ссылке внутри ([&] DistanceRight)

В итоге получаем красивый баг:
- Мы создали 2 float переменных, но не проинициализировали их (в них может быть мусор, космическое число, и тд.)
- Левое условие выполнилось, записало результат в переменную, и вернула true
- Компилятор радостно прыгает внутрь if, скипнув вызов для правого условия...
- И в DistanceRight остаётся лежать мусор из стека!
- Из-за чего математика в FMath::Max() начнет честно сравнивать левое значение с мусором... и персонаж будет улетать в стратосферу

Мораль сей басни такова
Красивый код - это круто, но side-эффекты внутри ленивых || и && - это классический выстрел в ногу. В буквальном смысле - правую ankle_r
❤1🔥1
У каждого подрастающего подростка в конце концов есть 1 выбор:
❤3❤‍🔥1
Интересный факт

Читая на завтрак исходники Unreal Engine, заметил что в откровенных комментариях в коде движка такие слова как fuck, shit, stupid, harm, pain, tired и даже табуированное suicide, чаще всего появляются в модулях связанных с рендерингом в UE

А на втором месте, как ни странно - низкоуровневый код работы с памятью (контейнеры, аллокаторы, специфичный код на каждое железо, и тд.)

Заметьте: Больше всего боли в рендеринге, и менеджементе памяти

Я конечно ни на что не намекаю.... но думаю вы, двиглоделы, понимаете в каких местах нужно закупаться побольше магнием
🙏1👀1
НИКОГДА НЕ СОЗДАВАЙ АССЕТ С ИМЕНЕМ "DummyCookedFilename" В АНРИЛ ЭНДЖАЙН В 3 ЧАСА НОЧИ

Причина? Прекрасные люди из прекрасной конторы, когда писали кукинг систему (времена UE3), была проблема - Кукинг система требует полный список файлов. А если заранее некоторые ассеты были запеченные в .pak файле, то открывать их ради списка - самоубийство

Тогда они решили - а давайте просто запеченные файлы для кукинг системы будем называть "DummyCookedFilename"?

Ну ля, молодцы, что сказать. Теперь если я подсуну кому-нибудь в проект ассет с таким названием, то при запаковке, ууу.....

Видите макрос check? Вот он заставит упасть ваш движок, если кукинг система встретит ассет с таким названием. И даже ошибку толком не непишет. А отловить такое - хаха, ну удачи))
❤‍🔥1🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
"То что в ООП было Релизно, в ECS еще Дебаг"

Решил вечерком потыкать злополучный ECS и что могу сказать... мне нравится. Нет, мне правда нравится

Даже не то скорость, а само... ощущение. Ощущение снова чувствовать железо. Обычно я убегал в эскапизм тыкать AVR, ибо я любил ее из-за непередаваемого ощущения железа в руках

А сейчас... потыкав ECS, я испытал это же чувство! Когда нет виртуальных таблиц, лишних прыжков, аллокаций. Каждый байт жестко контролируешь именно ты. И это.... прекрасно

Кстати когда впервые запускал ECS то вспомнился клип: Can You Hear The Speed
❤1💯1
in C you can do everything.
❤1
Епрст. Пока писал компилятор, буквально ОСОЗНАЛ одну историческую штуку из C

В общем, помните из C этот странный синтаксис?
void foo(void) {
// ....
}

foo();


Но почему в скобках в foo мы пишем (void)?

Конечно, официально говорят, чтобы функция принимала 0 аргументов

Но пока писал однопроходный компилятор, заметил 1 штуку: Вот читаю я посимвольно... Увидел foo, увидел скобку, как мне понять что функция объявляется или вызывается, не заглядывая в аргументы? (так как компилятор однопроходный)

Правильно: Проверить после скобки, что там? Если int - значит дальше мы встретим переменные, значит, объявляем функцию. А если не так - (если просто переменная или число) - вызываем эту функцию

Но что если.... у меня 0 аргументов? Если у меня ()? Как мне понять где объявление, а где вызов? Ха, правильно - поставить (void)!

В общем, ясно одно: Если тебе кажется что в C эта вещь бесполезна, значит ты не понимаешь зачем эта вещь вообще нужна
❤1💯1
Выбор очевиден
👀1
"Временный PhysX код чтобы сделать перенос кода из движка легче"

Ооох это так мило 🥹
❤‍🔥1😁1