^ Где-то в офисах Epic Games
Почитал
Вздохнул
Сделал пометку
ООП умирает. Если и писать движок, то ориентированный исключительно на ECS
Также многопоточка. Она тоже нужна. А лучше всего - когда математически описана графами (наука рулит, сэр!...)
Так, в пример графам, Render Graph (RDG) - незаменимая штука для Vulkan и DX12
Почитал
Вздохнул
Сделал пометку
ООП умирает. Если и писать движок, то ориентированный исключительно на ECS
Также многопоточка. Она тоже нужна. А лучше всего - когда математически описана графами (наука рулит, сэр!...)
Так, в пример графам, Render Graph (RDG) - незаменимая штука для Vulkan и DX12
Вот так, по сусекам на скворечник, собрал простой воксельный рендер на чистом Vulkan
Первое успешное использование Vulkan, ахах
Не прям чтобы круто получилось, но мне нравится
И использовал я... Ни за что не догадаетесь:Compute Shaders))
Первое успешное использование Vulkan, ахах
Не прям чтобы круто получилось, но мне нравится
И использовал я... Ни за что не догадаетесь:
🔥1
Хо-хо
Ну, вот так я и поизучал етот ваш Vulkan
Разобрался с дескрипторами, бррр. Такая душнота...
Зато своими ручками собрал красивую фабрику дескрипторов и пайплайнов, ибо почему бы и нет?
Теперь я понимаю за что еще люблю C++ - за непревзойденную выразительность, и одновременно, близость к металлу <3
Ну, вот так я и поизучал етот ваш Vulkan
Разобрался с дескрипторами, бррр. Такая душнота...
Зато своими ручками собрал красивую фабрику дескрипторов и пайплайнов, ибо почему бы и нет?
Теперь я понимаю за что еще люблю C++ - за непревзойденную выразительность, и одновременно, близость к металлу <3
💯1
Бл
Надеюсь разработчики Анрила, точнее, те кто занимались UMG/Slate, когда чпокают свою жену, то чпокают не прямо, а через "высокоуровневую обертку"
Кто придумал эту связку Slate и UMG, покажите мне их!
Сука, я заплачу за свет и воду, и буду варить их в котле, индивидуально, КАЖДОГО
А для особо самоуверенных привяжу к стулу и буду палками тыкать Immediate-Mode UI фреймворками по типу ImGui
Надеюсь разработчики Анрила, точнее, те кто занимались UMG/Slate, когда чпокают свою жену, то чпокают не прямо, а через "высокоуровневую обертку"
Кто придумал эту связку Slate и UMG, покажите мне их!
Сука, я заплачу за свет и воду, и буду варить их в котле, индивидуально, КАЖДОГО
А для особо самоуверенных привяжу к стулу и буду палками тыкать Immediate-Mode UI фреймворками по типу ImGui
😈2❤1😁1
Прикол
Сидел значит в Rider, работал, скомпилировал код
Услышал в наушниках отчетливый звук из Анрила что код успешно скомпилировался
Смотрю на панель панель задач
А там нет открытого Анрила 💀
СлУхОвЫе ГаЛлЮцИнАцИи...
Сидел значит в Rider, работал, скомпилировал код
Услышал в наушниках отчетливый звук из Анрила что код успешно скомпилировался
Смотрю на панель панель задач
А там нет открытого Анрила 💀
СлУхОвЫе ГаЛлЮцИнАцИи...
❤3😁1
2 варианта записи одного и того же в C++
Вроде бы и там и там условие...
Вроде бы 2 похожих блока...
Вроде бы 2 функции вызываются...
...или нет?
Вроде бы и там и там условие...
Вроде бы 2 похожих блока...
Вроде бы 2 функции вызываются...
...или нет?
❤1🤯1💯1
𝐑𝐨𝐨𝐭𝐓𝐨𝐨𝐥 𝐁𝐥𝐨𝐠
2 варианта записи одного и того же в C++ Вроде бы и там и там условие... Вроде бы 2 похожих блока... Вроде бы 2 функции вызываются... ...или нет?
Как элегантный if ломает ноги персонажу
Казалось бы, переписал громоздкие переменные в красивое условие if(Left() || Right())
Меньше строк, код чище! Но персонаж начнет хромать. Почему?
Все из-за механизма short-circuit evaluation (короткое замыкание) в С++ (который плотно отражен в ассемблере)
Компилятор просто экономит такты процессора: если в условии
Но мы забыли, что наши функции - пишут данные по ссылке внутри ([&] DistanceRight)
В итоге получаем красивый баг:
- Мы создали 2 float переменных, но не проинициализировали их (в них может быть мусор, космическое число, и тд.)
- Левое условие выполнилось, записало результат в переменную, и вернула true
- Компилятор радостно прыгает внутрь if, скипнув вызов для правого условия...
- И в DistanceRight остаётся лежать мусор из стека!
- Из-за чего математика в FMath::Max() начнет честно сравнивать левое значение с мусором... и персонаж будет улетать в стратосферу
Мораль сей басни такова
Красивый код - это круто, но side-эффекты внутри ленивых || и && - это классический выстрел в ногу. В буквальном смысле - правую ankle_r
Казалось бы, переписал громоздкие переменные в красивое условие 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
Интересный факт
Читая на завтрак исходники Unreal Engine, заметил что в откровенных комментариях в коде движка такие слова как
А на втором месте, как ни странно - низкоуровневый код работы с памятью (контейнеры, аллокаторы, специфичный код на каждое железо, и тд.)
Заметьте: Больше всего боли в рендеринге, и менеджементе памяти
Я конечно ни на что не намекаю.... но думаю вы, двиглоделы, понимаете в каких местах нужно закупаться побольше магнием
Читая на завтрак исходники Unreal Engine, заметил что в откровенных комментариях в коде движка такие слова как
fuck, shit, stupid, harm, pain, tired и даже табуированное suicide, чаще всего появляются в модулях связанных с рендерингом в UEА на втором месте, как ни странно - низкоуровневый код работы с памятью (контейнеры, аллокаторы, специфичный код на каждое железо, и тд.)
Заметьте: Больше всего боли в рендеринге, и менеджементе памяти
Я конечно ни на что не намекаю.... но думаю вы, двиглоделы, понимаете в каких местах нужно закупаться побольше магнием
🙏1👀1
НИКОГДА НЕ СОЗДАВАЙ АССЕТ С ИМЕНЕМ "DummyCookedFilename" В АНРИЛ ЭНДЖАЙН В 3 ЧАСА НОЧИ
Причина? Прекрасные люди из прекрасной конторы, когда писали кукинг систему (времена UE3), была проблема - Кукинг система требует полный список файлов. А если заранее некоторые ассеты были запеченные в .pak файле, то открывать их ради списка - самоубийство
Тогда они решили - а давайте просто запеченные файлы для кукинг системы будем называть "DummyCookedFilename"?
Ну ля, молодцы, что сказать. Теперь если я подсуну кому-нибудь в проект ассет с таким названием, то при запаковке, ууу.....
Видите макрос
Причина? Прекрасные люди из прекрасной конторы, когда писали кукинг систему (времена UE3), была проблема - Кукинг система требует полный список файлов. А если заранее некоторые ассеты были запеченные в .pak файле, то открывать их ради списка - самоубийство
Тогда они решили - а давайте просто запеченные файлы для кукинг системы будем называть "DummyCookedFilename"?
Ну ля, молодцы, что сказать. Теперь если я подсуну кому-нибудь в проект ассет с таким названием, то при запаковке, ууу.....
Видите макрос
check? Вот он заставит упасть ваш движок, если кукинг система встретит ассет с таким названием. И даже ошибку толком не непишет. А отловить такое - хаха, ну удачи))❤🔥1🔥1😁1