😢1
Forwarded from ДЕВОПСИНА | DevOps | Linux
This media is not supported in your browser
VIEW IN TELEGRAM
🔥2🤣1
#common_lisp #видео
Взял на себя труд перезаписать свой видос с Lisp-митапа про ECS-микрофреймворк
https://youtu.be/8PtqJt7MOiA
Взял на себя труд перезаписать свой видос с Lisp-митапа про ECS-микрофреймворк
cl-fast-ecs
😊https://youtu.be/8PtqJt7MOiA
YouTube
Паттерн Entity-Component-System и металингвистическая абстракция
Презентация на видео: https://lockie.gitlab.io/cl-fast-ecs-presentation-ru
Микрофреймворк CL-FAST-ECS: https://gitlab.com/lockie/cl-fast-ecs
Игра Thoughtbound, созданная на базе CL-FAST-ECS: https://awkravchuk.itch.io/thoughtbound
Подписывайтесь на мой…
Микрофреймворк CL-FAST-ECS: https://gitlab.com/lockie/cl-fast-ecs
Игра Thoughtbound, созданная на базе CL-FAST-ECS: https://awkravchuk.itch.io/thoughtbound
Подписывайтесь на мой…
👍11
#common_lisp
Попытался сделать очередной подход к снаряду кроссплатформенной изоляции окружения для Common Lisp, и чуть не заработал себе экзистенциальный кризис. CLPM г-на Эрика Тиммонса нормально работает, но при создании бинарника под виндусом крэшится из-за того, что ему почему-то не хватает памяти на кучу, а на багрепорт г-н Тиммонс не реагирует. Qlot — типичное fukamachiware, опирается на Roswell (на этом месте, в принципе, можно отправляться в магазин за верёвкой с мылом), но внезапно неплохо работает. До тех пор, пока не нужно собрать бинарник под ебучим виндусом, где Roswell даже работает, только у меня-то в CI-скриптах не виндус, а Wine, а вот под ним розвелл тупо крашится при любом действии, потому что 1) пытается установить в своих локальных целях бинарный SBCL, для чего скачивает msi-шку и ставит её
Так и живём 😢
Попытался сделать очередной подход к снаряду кроссплатформенной изоляции окружения для Common Lisp, и чуть не заработал себе экзистенциальный кризис. CLPM г-на Эрика Тиммонса нормально работает, но при создании бинарника под виндусом крэшится из-за того, что ему почему-то не хватает памяти на кучу, а на багрепорт г-н Тиммонс не реагирует. Qlot — типичное fukamachiware, опирается на Roswell (на этом месте, в принципе, можно отправляться в магазин за верёвкой с мылом), но внезапно неплохо работает. До тех пор, пока не нужно собрать бинарник под ебучим виндусом, где Roswell даже работает, только у меня-то в CI-скриптах не виндус, а Wine, а вот под ним розвелл тупо крашится при любом действии, потому что 1) пытается установить в своих локальных целях бинарный SBCL, для чего скачивает msi-шку и ставит её
msiexec
'ом, и 2) msiexec
делает вид, что всё хорошо, но на деле SBCL не ставит. Приехали. Использовать системный SBCL розвелл, конечно же, не умеет. Ну то есть как, можно ему сказать ros use sbcl/system
, но он начнёт жаловаться, что ему не хватает какого-то его дампа по имени roswell.core
, и вообще хуй пойми, откуда его взять.Так и живём 😢
🤯3🔥2😁1💩1🙈1
#анонс
Вот уже через полчаса буду по долгу службы вести открытый урок про новый стандарт языка С, C23. Велком, если интересно про такую низкоуровщину 😅
Вот уже через полчаса буду по долгу службы вести открытый урок про новый стандарт языка С, C23. Велком, если интересно про такую низкоуровщину 😅
otus.ru
Курс Программист на С: практические навыки программирования на C для разработчиков, админов и IoT-специалистов
Вы изучите синтаксис С, основы архитектуры процессора и памяти, структуры данных, основы ассемблер. Сможете писать низкоуровневые приложения и приложения под UNIX, а также понять, как С используется в играх и веб-приложениях
🔥9👍1
#common_lisp
Хоть и проспал вчерашний утренний стрим, но наконец заборол кроссплатформенную сборку игры с джема, заставив работать Qlot напрямую из лиспа, а не через Roswell. Под конец ещё выяснилось, что виндус не умеет в симлинки (напомню, что винда — абсолютно проклятая ОС), но я уже без удивления обошёл это костылём.
Теперь бы ещё сделать билд под макось 😅 Может, кто-то из подписчиков готов предоставить удалённый доступ к своему макожелезу для моих экспериментов со сборкой? Напишите мне в личку, если да)
Хоть и проспал вчерашний утренний стрим, но наконец заборол кроссплатформенную сборку игры с джема, заставив работать Qlot напрямую из лиспа, а не через Roswell. Под конец ещё выяснилось, что виндус не умеет в симлинки (напомню, что винда — абсолютно проклятая ОС), но я уже без удивления обошёл это костылём.
Теперь бы ещё сделать билд под макось 😅 Может, кто-то из подписчиков готов предоставить удалённый доступ к своему макожелезу для моих экспериментов со сборкой? Напишите мне в личку, если да)
GitHub
GitHub - lockie/lisp-jam-spring-2023: Spring Lisp Game Jam 2023 entry
Spring Lisp Game Jam 2023 entry. Contribute to lockie/lisp-jam-spring-2023 development by creating an account on GitHub.
👍1🔥1😁1
#мемасики
И снова наступает годовщина интереснейшего исторического события, связанного с предотвращением массовой резни по этническому признаку.
Всем мирного неба над головой 🕊
И снова наступает годовщина интереснейшего исторического события, связанного с предотвращением массовой резни по этническому признаку.
Всем мирного неба над головой 🕊
👍1
Media is too big
VIEW IN TELEGRAM
#common_lisp
Дожили, я своими макросами внутри макросов внутри макросов в ECS-фреймворке поломал
Дожили, я своими макросами внутри макросов внутри макросов в ECS-фреймворке поломал
Clasp
так, что он высирает многомегабайтный лог внутренней ошибки компилятора. С одной стороны, с класпом очень много вот такой возни (остальные шесть реализаций Common Lisp нормально вывозят мою макро-магию), с другой стороны, дропнуть его поддержку жалко, мало ли из этого гадкого утёнка спустя время вырастет что-то прекрасное 🦢🔥5😈1
#лытдыбр #common_lisp
Сегодня на утреннем стриме тестил производительность новой фичи в ECS-фреймворке, над которой работал всю неделю, а именно, — составных индексов. Выяснилось, что обработка каждой новой тысячи объектов в игре (например, отрисовка анимированных спрайтов 32x32) занимает 0.25 мс, причём большую часть времени программа проводит внутри сишных функций из
Сегодня на утреннем стриме тестил производительность новой фичи в ECS-фреймворке, над которой работал всю неделю, а именно, — составных индексов. Выяснилось, что обработка каждой новой тысячи объектов в игре (например, отрисовка анимированных спрайтов 32x32) занимает 0.25 мс, причём большую часть времени программа проводит внутри сишных функций из
liballegro
. По-моему, достаточно неплохо 😊Twitch
awkravchuk - Twitch
Name's Andrew. I write code in Lisp. Sometimes I play Diablo.
🔥10❤1
#лытдыбр #common_lisp
Решил всё же дропнуть поддержку компилятора Clasp в своём ECS-фреймворке
В общем, коммиты мутятся, процессорные циклы крутятся 😅
Решил всё же дропнуть поддержку компилятора Clasp в своём ECS-фреймворке
cl-fast-ecs
из за его неуловимых внутренних ошибок. Ну то есть во-первых, силушек уже никаких моих вот с пикрелейтеда нету, все макросы в коде позакомментируешь, — работает, добавляешь какой-то совершенно безобидный кусочек кода — валится. И во-вторых, камон, на данный момент времени употреблять слова Clasp и fast в одном предложении — это оксюморон какой-то, он же буквально самый медленный среди вообще всех, даже медленнее ECL, который под капотом в C транслирует.В общем, коммиты мутятся, процессорные циклы крутятся 😅
😱4👍2🥰1
#common_lisp #видео
Моя реакция, когда только что написанный код работает с первого раза 😂
https://youtu.be/uUMuEMR-c9s
Моя реакция, когда только что написанный код работает с первого раза 😂
https://youtu.be/uUMuEMR-c9s
YouTube
My honest reaction when the code I wrote works the first time 😅
Excerpt from morning weekday stream at https://twitch.tv/awkravchuk
The library: https://gitlab.com/lockie/cl-fast-ecs
The library: https://gitlab.com/lockie/cl-fast-ecs
🔥4🥰1🤔1
#лытдыбр #common_lisp
Сегодня на утреннем стриме в третий раз в своей жизни реализовывал алгоритм
Сегодня на утреннем стриме в третий раз в своей жизни реализовывал алгоритм
A*
, и опять с первого раза нормально не получилось 😅 Для прямого и ясного, как день, пути через несколько клеточек написанная мной функция возвращает гигантский путь из семи тысяч точек. Буду отлаживать завтра, наверное)😁2
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp
Не без помощи товарища на утреннем стриме наконец доделал поиск пути
Не без помощи товарища на утреннем стриме наконец доделал поиск пути
A*
-алгоритмом 😊 Путь типа того, что на видео, в отладочном режиме рассчитывается за 3 миллисекунды, так что, видимо, есть место для оптимизаций. Ну и сам путь иногда выглядит не очень естественным для живого существа из пространства с евклидовой метрикой, так что завтра буду пробовать трюки с Amit's A* Pages 😅🔥5😁1
#common_lisp #лытдыбр
Путём длительных экспериментов выяснил, что из всех дистрибутивов GNU-тый CLISP собран с поддержкой тредов, а, следовательно, и с возможностью загрузки
Путём длительных экспериментов выяснил, что из всех дистрибутивов GNU-тый CLISP собран с поддержкой тредов, а, следовательно, и с возможностью загрузки
bordeaux-threads
, только в NixOS и в Gentoo (да и то, если в последней включить юз-флаг threads
). Возможно, в Guix тоже, но только после того, как там примут патч от моего подписчика. Но в NixOS настолько древняя версия, что на неё даже Quicklisp не ставится. В общем, в порыве очередной оптимизации CI для своего ECS-фреймворка я всё перелопатил, и теперь в нём CLISP запускается из аж специального докер-образа 😅repology.org
clisp package versions - Repology
List of package versions for project clisp in all repositories
🔥5
#видео #лытдыбр
Посмотрел тут выступление крутейшего Майка Актона, одного из популяризаторов идей data-oriented programming (и ECS в частности). В докладе Майк, как водится, гнёт линию, что не нужно заниматься генерализацией и пытаться решить какие-то эфемерные общие случаи, а нужно решать те задачи, которые конкретно есть в руках в данный момент. Мысль о том, что всё течёт, всё меняется, не бывает на самом деле "future-proof" кода и уже через пять-десять лет код твоей игры (да и сама игра), скорее всего, никому не будет нужен, довольно болезненная, но глубокая 🤔
Посмотрел тут выступление крутейшего Майка Актона, одного из популяризаторов идей data-oriented programming (и ECS в частности). В докладе Майк, как водится, гнёт линию, что не нужно заниматься генерализацией и пытаться решить какие-то эфемерные общие случаи, а нужно решать те задачи, которые конкретно есть в руках в данный момент. Мысль о том, что всё течёт, всё меняется, не бывает на самом деле "future-proof" кода и уже через пять-десять лет код твоей игры (да и сама игра), скорее всего, никому не будет нужен, довольно болезненная, но глубокая 🤔
YouTube
Solving the Right Problems for Engine Programmers - Mike Acton (TGC 2017)
Mike Acton (then from Insomniac Games) talks about what engine programmers should do and how they should do them - to become better.
❤5
#лытдыбр
В принципе, начинаю понимать г-на Влада Цепеша, жившего в своё время в краях по соседству, потому что в таком климате единственный способ выжить без кондиционера — это, действительно, дрыхнуть днём в каком-нибудь тёмном подземелье с приятным могильным холодком, и только с заходом солнца выползать из него поделать дела 🫠
В принципе, начинаю понимать г-на Влада Цепеша, жившего в своё время в краях по соседству, потому что в таком климате единственный способ выжить без кондиционера — это, действительно, дрыхнуть днём в каком-нибудь тёмном подземелье с приятным могильным холодком, и только с заходом солнца выползать из него поделать дела 🫠
🔥7🤗1
#лытдыбр #common_lisp
Вообще я думал, что неплохо соображаю в классических структурах данных, но если начинаешь заниматься низкоуровневой оптимизацией с расчёсыванием кэша CPU вдоль шёрстки и вот этим вот всем, становится жарковато. В последние дней десять занимался тем, что добавлял в свой ECS-фреймворк индекс, прямо как в реляционных БД — вспомогательную структуру данных, которая позволяет быстро сделать обратный запрос, т.е. ответить на вопрос "какие сущности имеют вот это конкретное значение такого-то слота такого-то компонента?". Так вот, следите за руками:
• Хэш-таблица с цепочками в виде лисповских односвязных списков замечательно подходит, но любой поиск по такому индексу — это ужас с точки зрения кэша процессора, да и при вставке требует лишних аллокаций.
• Хэш-таблица с открытой адресацией прекрасно уложится в кэш, так как является по сути единственным плоским массивом, но малину портит тот факт, что сущности с одинаковыми значениями слота в неё вставляются чёрти как, а для кэша хорошо бы было, чтобы они шли в аккуратном возрастающем порядке; а организовать какой-нибудь бинарный поиск места для вставки не выйдет потому, что несколько probing sequences (как это по-русски, последовательности попыток?) могут пересекаться.
• Сбалансированное бинарное дерево тоже подошло бы, если бы не случай одинаковых значений слота — за логарифмическое время, мне кажется, никак не получить все сущности с одинаковыми значениями, придётся обходить вообще всё дерево за O(n), и зачем тогда вообще такой индекс нужен.
• На B+-дерево что-то боюсь замахнуться 😅
Судя по тишине в моём вопросе на SO никто индексами в ECS особо не заморачивался.
В общем, если формализовать задачу, нужна структура данных, в которую можно сравнительно быстро, хотя бы за логарифм, вставлять повторяющиеся ключи произвольного типа (значения слота компонента) со связанными с ними целочисленными значениями (сущностями) и быстро, в идеале за константное время, получать в отсортированном виде все значения, связанные с заданным ключом. Ну и в идеале чтобы эта структура не превращала кэш CPU в щепки 😂
P.S. Перечитал пост и понял, что действительно из того, что я знаю, подходит либо B+-дерево, либо хэштабличка с отсортированными цепочками. Скорее всего, на завтрашнем стриме буду делать второй вариант, хотя B+ тоже интересно, раньше никогда руками такого не делал.
Вообще я думал, что неплохо соображаю в классических структурах данных, но если начинаешь заниматься низкоуровневой оптимизацией с расчёсыванием кэша CPU вдоль шёрстки и вот этим вот всем, становится жарковато. В последние дней десять занимался тем, что добавлял в свой ECS-фреймворк индекс, прямо как в реляционных БД — вспомогательную структуру данных, которая позволяет быстро сделать обратный запрос, т.е. ответить на вопрос "какие сущности имеют вот это конкретное значение такого-то слота такого-то компонента?". Так вот, следите за руками:
• Хэш-таблица с цепочками в виде лисповских односвязных списков замечательно подходит, но любой поиск по такому индексу — это ужас с точки зрения кэша процессора, да и при вставке требует лишних аллокаций.
• Хэш-таблица с открытой адресацией прекрасно уложится в кэш, так как является по сути единственным плоским массивом, но малину портит тот факт, что сущности с одинаковыми значениями слота в неё вставляются чёрти как, а для кэша хорошо бы было, чтобы они шли в аккуратном возрастающем порядке; а организовать какой-нибудь бинарный поиск места для вставки не выйдет потому, что несколько probing sequences (как это по-русски, последовательности попыток?) могут пересекаться.
• Сбалансированное бинарное дерево тоже подошло бы, если бы не случай одинаковых значений слота — за логарифмическое время, мне кажется, никак не получить все сущности с одинаковыми значениями, придётся обходить вообще всё дерево за O(n), и зачем тогда вообще такой индекс нужен.
• На B+-дерево что-то боюсь замахнуться 😅
Судя по тишине в моём вопросе на SO никто индексами в ECS особо не заморачивался.
В общем, если формализовать задачу, нужна структура данных, в которую можно сравнительно быстро, хотя бы за логарифм, вставлять повторяющиеся ключи произвольного типа (значения слота компонента) со связанными с ними целочисленными значениями (сущностями) и быстро, в идеале за константное время, получать в отсортированном виде все значения, связанные с заданным ключом. Ну и в идеале чтобы эта структура не превращала кэш CPU в щепки 😂
P.S. Перечитал пост и понял, что действительно из того, что я знаю, подходит либо B+-дерево, либо хэштабличка с отсортированными цепочками. Скорее всего, на завтрашнем стриме буду делать второй вариант, хотя B+ тоже интересно, раньше никогда руками такого не делал.
🔥8👍2
#лытдыбр #common_lisp
На этой неделе решил взяться за behaviour trees — паттерн, используемый для построения сценариев функционирования NPC в играх, и заодно попытаться натянуть его на паттерн ECS 😅 Даже изобразил простенькое тестовое дерево для персонажа-вражины, пытающегося догнать игрока и пнуть его в ближнем бою (см. рис. 1). Правда, с первого раза реализовать не получилось, — мозг запнулся о тот факт, что возвращаемое из узлов дерева булевское значение (успех/неуспех) нужно хранить для каждого узла дерева, а не по одному на всего персонажа, что неизбежно приводит к тому, что своя копия дерева должна быть у каждого персонажа; а мне изначально хотелось сэкономить памяти и хранить только один экземпляр дерева на всех. В общем, завтра с утра на стриме попытаюсь переделать ровно 😊
На этой неделе решил взяться за behaviour trees — паттерн, используемый для построения сценариев функционирования NPC в играх, и заодно попытаться натянуть его на паттерн ECS 😅 Даже изобразил простенькое тестовое дерево для персонажа-вражины, пытающегося догнать игрока и пнуть его в ближнем бою (см. рис. 1). Правда, с первого раза реализовать не получилось, — мозг запнулся о тот факт, что возвращаемое из узлов дерева булевское значение (успех/неуспех) нужно хранить для каждого узла дерева, а не по одному на всего персонажа, что неизбежно приводит к тому, что своя копия дерева должна быть у каждого персонажа; а мне изначально хотелось сэкономить памяти и хранить только один экземпляр дерева на всех. В общем, завтра с утра на стриме попытаюсь переделать ровно 😊
🔥3