Лисп в изгнании
248 subscribers
202 photos
21 videos
5 files
260 links
Авторский канал на околоайтишную тематику.

По всем вопросам @awkravchuk
Download Telegram
#common_lisp

В рамках подготовки к Lisp Game Jam 2023 уже сделяль шаблон для игрового проекта с использованием SDL2, которую я раньше избегал в пользу liballegro. Как выясняется, мне были уготованы пара открытий чудных: во-первых, в биндинге SDL2 к CL очень много "медвежьих услуг" в стиле автоматического удаления сишных указателей с кучи через финалайзеры trivial-garbage, как будто я сам не могу условный free дёрнуть (а если так сделать вместе с финалайзером, то через неопределённый период времени игра крэшится или тупо зависает).
Во-вторых, GC в SBCL, конечно, весьма чудной, что под линуксом (см. рис. 1), что под шиндой (см. рис. 2). Сказали ему при компиляции, что общий размер доступной ему кучи 2 Гб, и он не особо шевелится вплоть до момента, пока не будет сожран гигабайт с хвостиком 😂
🤔2
#common_lisp

Итак, вот уже в эту пятницу начнётся Lisp game jam. Я к его началу собрался подготовить cokiecutter-шаблон для игры на CL, с выбором варианта middleware-библиотеки (SDL2, liballegro, raylib) и с автоматической сборкой готовых бинарников для трёх основных платформ (Linux, MacOS, Windows). Так вот, сегодня с утра доделал вариант с raylib, который на удивление занимает меньше всего кода и меньше всего места в скомпилированном виде. Под линукс и шинду уже всё готово, это, на секундочку, шесть протестированных вариантов сборки. Попробовал ткнуться в сборку под MacOS, установив у себя в kvm-виртуалку Monterey (а затем и High Sierra в VirtualBox), и я должен сказать, что там не работает НИХУЯ, по буквам: Николай, Иван, Харитон, Ульяна, Ярослав. Ну то есть код с использованием liballegro крэшится где-то в недрах кода макоси при её, liballegro, инициализации, код SDL2 намертво залипает на каком-то мьютексе внутрях cl-sdl2, и только raylib говорит открыто и смело прямо в лицо, что Failed to initialize Graphic Device, хотя хочу заметить, что под виндой с софтверным рендерером в том же VirtualBox все три варианта прекрасно бегают. По хорошему, надо бы попробовать сделать в KVM GPU pass-through, но моя Nvidia поддерживается только в High Sierra и ранее, а хайсьерра в QEMU не ставится, мотивируя отказ тем, что не может до серверов эппла достучаться, хотя интернет у неё есть. А это я ещё даже не прикасался к теме компиляции под Apple Silicon, там вообще гроб гроб кладбище пидор. В общем, решил пока подзабить на макось, если будет по ходу дела время, попробую чё-то поковырять, в идеале вообще нужно где-то приобрести старенький мак и на нём экспериментировать, но это уже не для моих финансовых условий.
Теперь надо написать статью на хабр с анонсом геймджема, и ещё поспать бы, а то на улице жара такая, а я не выспался 🥱
🔥4
#common_lisp #проекты

Ну штош, выкатил на гитхаб свой шаблон для игры на Common Lisp 🎉 Эх, давненько я так плотно с CI пайплайнами не развлекался 😅

Завтра на стриме, наверное, вернусь к ECS-библиотеке, надеюсь, ещё пару мажорных фич успею реализовать до пятницы.
🔥2
#common_lisp #статьи

Давно хотел запостить на хабр перевод программной статьи г-жи Хафнер про особенности использования Common Lisp в разработке игр, и вот наконец подвернулась оказия)
Апвоуты приветствуются ❤️
https://habr.com/ru/articles/737316
❤6
#лытдыбр #мемасики

Сегодня на традиционном утреннем стриме продолжил накидывать код для предстоящего геймджема, и, как оказалось, использовать ECS гораздо сложнее, чем писать ECS-фреймворк (см. иллюстрацию) 😅
Впрочем, по крайней мере успел набросать системы для отображения и проигрывания анимаций.
🤯1
#лытдыбр #геймджем #common_lisp

Штош, первый день Spring Lisp Game Jam 2023 подошёл к концу, а мне похвастаться особо нечем (см. рис. 1) — начал пилить анимации персонажей, но наткнулся на отсутствие в своём ECS-фреймворке а) способа передачи в системы произвольных аргументов, вроде delta-time, и б) обратных индексов, позволяющих быстро (за O(log N) хотя бы) получить ответ на вопрос, "у какой (каких) entity в таком-то компоненте вот такой-то слот имеет вот конкретно такое значение". Первое победил, про второе только сейчас додумал, как можно сделать относительно безболезненно с алгоритмической точки зрения (см. рис. 2), но с точки зрения дружелюбности к кэшу процессора там пиздец, конечно, полный раздрай, хорошо хоть происходит всё это действительно за логарифм от количества entity с этим компонентом.
Продолжу, видимо, уже завтра.
🔥3
#мемасики

Короче, с воскресенья на понедельник плохо выспался, допоздна в D&D играли. Провёл утренний стрим, позавтракал и решил чаю заварить, иначе какой нормальный человек чаем завтрак не заполирует. Поставил чайник и вдруг понял, что пакетики закончились. Пошарился по полкам, нашёл запасную пачку и вдруг понимаю, что передо мной стоит притёртая баночка кофе, которую хозяйка оставила. Редко раньше кофе пил, а тут вдруг захотелось, дай-ка, думаю, приободрюсь перед рабочим днём, а раз захотелось, почему бы и не навернуть. Нашёл в шкафчике джезву, сыпанул две щедрых ложки в холодную воду, заварил, налил в чашку и тут вдруг sve se prebojilo u crvenu boju i zazvučalo "Ja sam Crnogorac", jebem moje uši, ništa nije jasno, puzeći iz zemlje Ljudevit Gaj i govori neku sranje o Hrvatima i moralu, stari pedal, zašto mu nije ležalo u zemlji? Sada osim crnogorskog jezika ne razumijem ništa.
Čini mi se da je kafa bila prokleta.
😱5🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #геймджем #common_lisp

К пятому дню геймджема я наконец допилил анимированных персонажей 😅 Зато всё хранится по науке, в ECS-хранилище. Дальше должно пойти быстрее, если бы ещё не работа, ух я бы разгулялся)
Исходнички выложил сюда 😊
👍2🥰1
#лытдыбр

Вот это я машина, конечно. Нехитрые статистические расчёты показывают, что уже в следующую субботу можно ожидать 27 коммитов за день 😂
🔥3😁3👍1
#лытдыбр #common_lisp

Всё-таки обожаю Emacs. Пишу в коде игры :step-, чтобы прописать название аудиофайла, который будет проигрываться при движении персонажа игрока. Emacs (точнее, его плагин Sly для Common Lisp) выцепляет из запущенного Lisp-образа список за-intern-енных кейвордов и ищет среди них те, что начинаются на :step, а так как я уже запускал игру и все файлы со звуками были подгружены из каталога ресурсов, все соответствующие звуковым файлам кейворды есть в Lisp-образе, и я их вижу у себя прямо в автодополнении. Если это не круто, то я даже не знаю определение слова "круто" 🤟
🔥8❤1
#мемасики #common_lisp

— Мам, давай купим ИИ!
— Нет, у нас уже есть ИИ дома.
ИИ дома:
😁4🤔1
#мемасики

Я с утра опять прибегнул к кофеиновому допингу, поэтому ещё немножко щитпоста 😅

В коде игры случайно произошёл MOTHERFUCKING EVANGELION REFERENCE
😁2🙏1
#проекты

Итак, вчера с товарищем за один день креативили контент, и этой ночью уже на последнем издыхании я зарелизил игру для Lisp Game Jam, вуаля: Thoughtbound.

Теперь я чуть-чуть проспался и готов предварительно сформулировать небольшой постмортем.

1. Архитектура Entity-Component-System — огонь 🔥 Новую функциональность в игру можно добавлять буквально лёгким движением руки, и она не ломает то, что в игре уже есть.
2. Стоковый рендеринг карты через CLOS в библиотеке cl-tiled чудовищно тормозной для любых практических целей.
3. Хотя на различных форумах так не рекомендуют делать, но, как выяснилось, хранение каждого tile карты в отдельной entity — вполне себе рабочий вариант; для сравнения, родной рендеринг через cl-tiled жрёт около 70% CPU (который у меня 12-ядерный Ryzen, на секундочку), а рендеринг той же карты с использованием ECS по entity на тайл — 5-6%.
4. Хотя реализация ECS у меня пока самая наивная и жручая память, в реальном проекте это нестрашно — запущенная игра создаёт около тысячи игровых объектов с 14 различными компонентами, но потребляет при этом на всё про всё около 200 Мб памяти, что по современным меркам пшик.
5. В игре довольно серьёзная нарративная составляющая и даже есть вот прямо сюжет с нотками пост-модернизма, что для моих предыдущих проектов нетипично 😅
6. Столкновения персонажей с препятствиями — это сложно, таки и не доделал их полностью идеально 🥲
7. С гуёвой библиотекой Nuklear тяжко: из-за того, что она написана на чистом C, чуть шаг влево-шаг вправо — и ты вывалился в LDB, а в Emacs это даже не сразу понятно, просто окно игры перестаёт обновляться.
8. Генеративные искуственные нейронные сети — суперское подспорье в проектах вроде такого. Особенно если английский не твой родной, а рисовать не умеешь 🤣 Немного инсайда: у меня настолько мало фантазии, что даже название проекта предложил чятжпт))
9. Весь код игры, как сообщает cloc, состоит из 715 строк, что лишний раз подтверждает, что Common Lisp — один из самых мощных языков в мире 🤗
10. Не хочу быть нескромным, но среди других финишировавших в геймджеме работ не видел хоть одной настолько же полной контентом, как наша 😊 Хотя, безусловно, есть крайне интересные с технической точки зрения проекты.
11. Истинно говорю вам, кофе — напиток дьявола. В какой-то момент на выходных мне казалось, что я навсегда утратил возможность засыпать 😳
12. Вдвоём геймджемить куда веселее)
🔥12❤1😁1
#лытдыбр

Решил почитать свежие статьи из списка рассылки хабра, но случился хабраэффект 😂
🙏1
#common_lisp

Обнаружил тут на днях существование целого Roguelike tutorial for Common Lisp. Надо бы заценить, у самого в ближайших планах запилить туториал по использованию своего ECS-фреймворка cl-fast-ecs 😊