𝐑𝐨𝐨𝐭𝐓𝐨𝐨𝐥 𝐁𝐥𝐨𝐠
Почему в час ночи вместо работы в UE я должен разбираться почему он падает нафиг И сюрприз сюрприз - падает из-за Race Condition в сборщике мусора (на скрине FGCReferenceTokenStream и UGCObjectReferencer) Когда объект еще не успел удалиться и сборщик мусора…
Помните как у меня слетал GC Анрила из-за поломки vtable?
Так вот. Нашел я решение. почти...
Хорошие новости: Я смог увеличить время срабатывания GC до космических цифр, и теперь ближайшие 272 млрд лет он меня не потревожит
Плохие новости: Теперь память НЕ будет очищаться. И раз в час (наверное) у меня Анрил просто тупо будет лагать и вылетать из-за нехватки память
То есть буквально движок будет ходить под себя и захлебывается в собственным же дерьме
Лучший просто, братец Тим Суини, продолжай!
Так вот. Нашел я решение. почти...
Хорошие новости: Я смог увеличить время срабатывания GC до космических цифр, и теперь ближайшие 272 млрд лет он меня не потревожит
Плохие новости: Теперь память НЕ будет очищаться. И раз в час (наверное) у меня Анрил просто тупо будет лагать и вылетать из-за нехватки память
Лучший просто, братец Тим Суини, продолжай!
❤2🤣2❤🔥1👍1😁1👀1
void Subleq(int* Memory)
{
int PC = 0; // Program Counter
while(PC >= 0)
{
const int A = Memory[PC + 0];
const int B = Memory[PC + 1];
const int C = Memory[PC + 2];
memory[B] -= Memory[A];
if(Memory[B] <= 0) PC = C;
else PC += 3;
}
}
👀2
Нет, мне определенно надо ехать в казино
Чтобы вы понимали: Шанс поймать ICE (Internal Compiler Error) обычному рядовому программисту - менее 0.01%
Для embedded - уже чуть выше, но в пределах 1-2%
А я уже как второй день словил АЖ 2 ICE В ОДНОМ ПРОЕКТЕ СУКА
2 раза ломать компилятор от своего же кода - это определенно талант
Чтобы вы понимали: Шанс поймать ICE (Internal Compiler Error) обычному рядовому программисту - менее 0.01%
Для embedded - уже чуть выше, но в пределах 1-2%
А я уже как второй день словил АЖ 2 ICE В ОДНОМ ПРОЕКТЕ СУКА
2 раза ломать компилятор от своего же кода - это определенно талант
❤🔥5👻1
В общем, что-то лежал, рефлексировал, и подумал
А ведь действительно произошло то, что говорят "всё новое - хорошо забытое старое"
Вспомнил про новую технологию из UE5 под названием Nanite - когда мы берем меш, разбиваем его на кластеры по 64-128 полигонам, и нумеруем их по ID
А дальше просто из камеры, по каждому пикселю, пускаем луч. И если тот попал в полигон - записываем в специальный буфер (VisBuffer) ID Меша, Кластера и Полигона (а затем на втором рендер-пассе раскрашиваем/растеризуем их, но не суть)
К чему все это? Так к тому, что эти последовательные 2 шага.... Чертовски напоминают мне Wolfenstein 3D аж из 1992 года!
Ведь вспомните - тогда математика на процессорах была чертовски дорога. Проходиться циклом по каждой стенке/псевдо-полигону, проецировать его точки, считать матрицы, а потом еще закрашивать - непозволительная роскошь...
И тогда молодой Кармак придумал - а что если просто пускать луч из камеры, находить стену, расстояние до нее, и сразу же красить? Так и родился легендарный метод под названием "Рейкастинг"!
И в чем моя мысль: Если так посудить... Nanite - это идеальное продолжение идеи Кармака, возведенная в абсолют!
Вместо 2д лучей - 3д. А вместо прямого "сделал пересечение - покрасил" у нас сначала запоминание пересечений во временный буфер (VisBuffer), а уже затем - покраска по этому буферу
всё новое - хорошо забытое староe ;P
А ведь действительно произошло то, что говорят "всё новое - хорошо забытое старое"
Вспомнил про новую технологию из UE5 под названием Nanite - когда мы берем меш, разбиваем его на кластеры по 64-128 полигонам, и нумеруем их по ID
А дальше просто из камеры, по каждому пикселю, пускаем луч. И если тот попал в полигон - записываем в специальный буфер (VisBuffer) ID Меша, Кластера и Полигона (а затем на втором рендер-пассе раскрашиваем/растеризуем их, но не суть)
К чему все это? Так к тому, что эти последовательные 2 шага.... Чертовски напоминают мне Wolfenstein 3D аж из 1992 года!
Ведь вспомните - тогда математика на процессорах была чертовски дорога. Проходиться циклом по каждой стенке/псевдо-полигону, проецировать его точки, считать матрицы, а потом еще закрашивать - непозволительная роскошь...
И тогда молодой Кармак придумал - а что если просто пускать луч из камеры, находить стену, расстояние до нее, и сразу же красить? Так и родился легендарный метод под названием "Рейкастинг"!
И в чем моя мысль: Если так посудить... Nanite - это идеальное продолжение идеи Кармака, возведенная в абсолют!
Вместо 2д лучей - 3д. А вместо прямого "сделал пересечение - покрасил" у нас сначала запоминание пересечений во временный буфер (VisBuffer), а уже затем - покраска по этому буферу
всё новое - хорошо забытое староe ;P
❤🔥4👀1
80286 в Unreal Engine
АААХ ЗЛА НЕ ХВАТАЕТ... UNREAL ENGINE...
Для контекста: В мультиплеерной архитектуре GameState - хранит состояние игры (напр. время матча), а PlayerState - состояние игрока (напр. его здоровье)
Так вот, при переходе между уровнями, Анрил имеет возможность "перенести" данные у PlayerState между уровнями
А вот GameState сука!... нет
И знаете как выкручиваться? Ага, брать заводить в GameInstance (экземпляр игры) временные переменные, копировать туда, а после - восстанавливать их обратно..
И знаете что это мне напоминает?
Гребанный 80286!
Когда инженеры Intel добавили защищенный режим (пра-пра-дед многозадачности), ОС могла зайти туда.... Но не могла выйти! И что сделали программисты MS-DOS?
Использовали энергонезависимую память ПК (CMOS, от Биоса) чтобы записать туда "текущую задачу", затем через PS/2 порта клавиатуры отправил сигнал на перезагрузку. Процессор перезагружался, и из CMOS памяти подтягивал данные обратно!
Конечно, я люблю когда история повторяется, но черт побери...
АААХ ЗЛА НЕ ХВАТАЕТ... UNREAL ENGINE...
Для контекста: В мультиплеерной архитектуре GameState - хранит состояние игры (напр. время матча), а PlayerState - состояние игрока (напр. его здоровье)
Так вот, при переходе между уровнями, Анрил имеет возможность "перенести" данные у PlayerState между уровнями
А вот GameState сука!... нет
И знаете как выкручиваться? Ага, брать заводить в GameInstance (экземпляр игры) временные переменные, копировать туда, а после - восстанавливать их обратно..
И знаете что это мне напоминает?
Гребанный 80286!
Когда инженеры Intel добавили защищенный режим (пра-пра-дед многозадачности), ОС могла зайти туда.... Но не могла выйти! И что сделали программисты MS-DOS?
Использовали энергонезависимую память ПК (CMOS, от Биоса) чтобы записать туда "текущую задачу", затем через PS/2 порта клавиатуры отправил сигнал на перезагрузку. Процессор перезагружался, и из CMOS памяти подтягивал данные обратно!
Конечно, я люблю когда история повторяется, но черт побери...
💯3❤1
Yo, гайс
https://ascii-city-p1-k7m4k5.grownowgames.workers.dev
Не благодарите )
(но автора поддержите!)
Не благодарите )
(но автора поддержите!)
❤4🔥1🙏1
Знаете, я так подумал
А ведь для ARG с какими-нибудь экзешниками, лучше всего прятать секреты не в коде.... а прямо в заглушку DOS!
Исторически для обратной совместимости (когда был переход между 16- и 32- битными системами) в начале любого .exe или .dll файла пишут небольшой код, с тексом "This program cannot be run in DOS mode."
Что он делает? Вызывает консоль, печатает туда текст, и останавливает программу (так как она для 32 битных систем)
Сейчас конечно это исторический костыль..... но для ARG - самый раз ))
Пока все пойдут через Ghidra читать .data и .text участки, секрет будет лежать в начале файла...
Буквально лучший способ спрятать код - оставить его на самом видном месте :P
А ведь для ARG с какими-нибудь экзешниками, лучше всего прятать секреты не в коде.... а прямо в заглушку DOS!
Исторически для обратной совместимости (когда был переход между 16- и 32- битными системами) в начале любого .exe или .dll файла пишут небольшой код, с тексом "This program cannot be run in DOS mode."
Что он делает? Вызывает консоль, печатает туда текст, и останавливает программу (так как она для 32 битных систем)
Сейчас конечно это исторический костыль..... но для ARG - самый раз ))
Пока все пойдут через Ghidra читать .data и .text участки, секрет будет лежать в начале файла...
Буквально лучший способ спрятать код - оставить его на самом видном месте :P
❤2💯1
𝐑𝐨𝐨𝐭𝐓𝐨𝐨𝐥 𝐁𝐥𝐨𝐠
"Игнорируем ошибку с кодом 2 из UBT (Unreal Builder Tool). Это не ошибка" И кто мне там затирал что в Анриле нет Легаси? Пока мы изучали Легаси, они его писали
Ну кстати говоря, вспомнил про этот enum из движка. Результат компиляции между UHT, UBT, и Эдитором
И тут видно что код 2 = UpToDate, что означает "Код уже обновлен, перекомпилировать нечего"
По факту - это не ошибка, а просто полезный маркер. Но как мы знаем в ОС (и вообще везде) код 0 означает успешное завершение. А все что отличается от 0 - ошибка
Вот такой костыль.
И тут видно что код 2 = UpToDate, что означает "Код уже обновлен, перекомпилировать нечего"
По факту - это не ошибка, а просто полезный маркер. Но как мы знаем в ОС (и вообще везде) код 0 означает успешное завершение. А все что отличается от 0 - ошибка
Вот такой костыль.
if(Result == 2) return 0; :D❤2
Я всегда знал что у Apple все не так как у людей!
По необъяснимым причинам, пока мы не сможем отладить шейдеры и на самом деле понять, что к чему, нам нужно брать модуль (abs) от аргумента функции sqrt (квадратного корня) только для функций в этом шейдерном файле
Насколько нам могут объяснить поставщики (разработчики видеокарт/драйверов), Metal имеет слегка отличающуюся точность в некоторых результатах, а это значит, что мы передаем в sqrt отрицательные и нулевые значения
Теперь это должно быть актуально только для Metal 1.2 и более ранних версий
🤩3🍌1