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

По всем вопросам @awkravchuk
Download Telegram
#лытдыбр #common_lisp

Конечно же, с игрой на джем уже проводил тесты вида "а что будет, если на карту накидать несколько сотен персонажей", и FPS как-то грустно проседает с двух тысяч до 800, а при совсем больших количествах (ближе к тысяче) и до 150 кадров в секунду.

Для анализа произволительности удалось заставить заработать замечательный cl-flamegraph Александра Артеменко (трюк в том, что сначала нужно грузить сам cl-flamegraph, и только потом своё приложеньице). По результатам его работы видно (см. рис. 1) удивительное — львиная доля времени CPU тратится на вызов функции отрисовки спрайта через CFFI!

Причём я даже догадываюсь, почему так — функция al:draw-tinted-scaled-rotated-bitmap-region, которую я вызываю, принимает на вход структуру с цветом по значению, что CFFI традиционно делает через жопу. А функции без цвета я использовать не могу, потому что мне надо одновременно вращать и масштабировать спрайт, а это в liballegro можно только в комплекте с цветом.

Короче, по крайней мере хорошо, что понятно, где проблема 😁
7🙏1
#лытдыбр #common_lisp

Обнаружил себя в том месте своей жизни, в котором моя фантазия привела меня к описанию в коде проблематики овечьего секса 😅😂
🌚7😁4👍1
#лытдыбр #common_lisp

Ну штош, с приходом уикэнда весенний Lisp-геймджем '2024 выходит на финишную прямую, а значит, самое время опубликовать мою новую библиотеку, использованную в игре для джема, а именно — парсер для формата файлов редактора пиксельарт-анимаций Aseprite под названием cl-aseprite, благо во время разработки игры вроде бы баги выловил и сегодня с утра исходники причесал. Библиотека доступна по MIT лицензии и уже есть в Quicklisp-дистрибутиве LuckyLambda. Ура 😊🎉
🔥14👍3
#лытдыбр #проекты #common_lisp

Раз, два, три, четыре, пять, завершаю кранчевать 😂 После бурной разработки с товарищем сегодня в 3 утра по центральноевропейскому времени зарелизил игру для весеннего Lisp Game Jam '24: Cycle of Evil. Наверное, сегодня-завтра даже разрожусь постом-постмортемом)

P.S. itch.io прилёг полежать, поэтому вот ссылка проекта на Github.
🔥11❤‍🔥11
#проекты #common_lisp

Ну штош, пришло время подвести итоги весеннего геймджема и голосовать за других участников, а то уже время поджимает, а их больше, чем когда-либо. Вот они (без какого бы то ни было осмысленного порядка):

✔️ По мере разработки накоммитил кучу фиксов в свои библиотеки и даже опубликовал новую.
✔️ Иметь свой Quicklisp-дистрибутив удобно, можно иметь при сборке билда чётко те версии библиотек, которые тебе нужны.
✔️ В целом начинают вырисовываться очертания универсального 2D движка, который я давно вынашиваю в планах, а названия толкового ещё не придумал.
✔️ Думать и проектировать игры в терминах ECS невероятно прикольно, быстро и гибко. Типа, определяешь какие-то базовые ортогональные элементы данных, типа "дочерний объект", "позиция", "звуковой эффект", "спрайт", а потом их по-всякому между собой креативно комбинируешь.
✔️ Хорошо также иметь работающий, отлаженный и оптимизированный алгоритм поиска пути A*, но есть проблемки с дискретностью игрового пространства, т.е. очень часто персонаж, повинуясь A*, пытался добежать из своей текущей позиции до центра текущего тайла, что не всегда выглядит естественно.
✔️ Декларативный UI — это каеф, даже если, как в моём случае, у него со всех сторон торчат уши нижележащей сишной библиотеки Nuklear.
✔️ Окончательно выяснилось слабое звено в плане производительности. Я-то комплексовал, что этим слабым звеном окажутся деревья поведения, создающие по одной ECS-системе и одному компоненту на каждый узел дерева, а они в игре были довольно развесистыми, вот, например, для крестьянина, добывающего мясо из овечек. Но оказалось, что этим слабым звеном всю дорогу была передача сишных структур в сишные же функции "по значению" (т.е. через стек), в частности, функция для отрисовки спрайтов персонажей, вызываемая по несколько раз для каждого персонажа, требует на вход структуру с цветом, поэтому когда персонажей в игре больше сотни, FPS проседает до 130 кадров в секунду, что уже довольно мало — если FPS в моей двухмерной игре упадёт ниже частоты обновления монитора, я это буду воспринимать как личное оскорбление 😅
✔️ Как уже много раз до этого, совершил ошибку откладывания разработки непосредственного контента на последний день, сконцентрировавшись изначально на коде. Пора бы уже действительно зарелизить некий универсальный движок и делать более проработанные игры 😅
✔️ Кроме того, я всё утро воскресенья пилил функционал отравления мяса крестьянами, который должен был стать одной из мета-механик, но в итоге в угаре горящего дедлайна мы с товарищем-геймдизайнером про неё забыли 😢
✔️ Билд под макось, кажется, работает 😊 Правда, кастомный курсор, в отличие от других ОС, не отображается.
✔️ В целом, получившуюся игру можно несложным образом превратить в полноценную стратежку, просто такой цели у нас с товарищем изначально не стояло, поэтому у нас снова indirect player control 🤣

Больше подробностей будет в субботнем девлоге 😊
11❤‍🔥1
#анонс

Вот уже в следующий четверг, 06.06 в 19:00 по МСК буду выступать на онлайн-митапе по функциональщине, организованном широко известными в узких кругах HealthSamurai. Буду рассказывать, как же клёво писать игры на лиспах 😊

Мероприятие онлайновое и бесплатное, но нужна регистрация, поэтому айда: Функциональное программирование для всех
🔥8
#проекты #devlog #common_lisp

А вот и девлог игрового движка на Common Lisp с чуть более подробным разбором внутрянки игры на геймджем 🔥
Как обычно, с русскими субтитрами на всякий случай.
Если бы мои ебучие соседи не праздновали сегодня в третий раз день независимости до пяти утра, оно даже могло бы быть не таким сумбурным
https://youtu.be/27B-xpgCYOQ
👏4👍1
Вот уже через час начнётся митап про функциональщину. Присоединяйтесь, буду там лечить про игры на лиспах 😊

P.S. Запись потом тоже будет на ютубе 👌
👍7🔥3
#лытдыбр #common_lisp

И вот библиотека cl-aseprite для чтения файлов пиксельного редактора анимаций Aseprite в новой версии 0.1.0 обзавелась комплектом тестов и красивой страничкой документации 😊

Хотя, пока допиливал её, подумал, что так-то анимации вроде бы можно хранить и внутри файлов также используемого мной редактора карт Tiled, так что теоретически можно вообще целиком делать контент игры, не вылезая из него, получается этакий родной редактор карт для движка. В ближайшее время займусь проверкой этого варианта.

Вот так потихоньку вырисовываются черты ресурсной системы движка 😌
👏6
#лытдыбр #common_lisp

Закоммитил функцию, с помощью которой строил демонстрационную картиночку к митапу HealthSamurai. С помощью неё можно творить, например, вот такую красоту (см. рис. 1) 😊

Зато памяти жрёт чёртову прорву, когда я строил ту картиночку, бенчмарк для бедных системный макрос time мне сообщал, что она нагенерила ~700 кб мусора 😱
7😱1
#лытдыбр #common_lisp

Вчера натолкнулся на вот такой замечательный инструмент для построения графа зависимостей Common Lisp-овых систем — это так на CL-овском жаргоне по сути называется то, что в других языках зовётся библиотекой, только, как всегда, более гибкое 😊 Причём впервые такого рода инструмент у меня заработал без проблем, плюс в нём есть крутая фича по выводу лицензий всех зависимостей. Решил из интереса натравить его на последний проект, игру Cycle of Evil, и тут я с ужасом вижу в списке лицензий, помимо крайне либеральных MIT, zlib, и вовсе Public Domain, вирусную GPLv3 у библиотеки lisp-binary, от которой зависит моя новая либа для чтения Aseprite-файлов, и с ужасом же вспоминаю, почему я 4 года назад, когда делал разбор Aseprite-файлов в своём проекте d2clone-kit, не стал брать lisp-binary — хоть она клёвая и предоставляет удобный и мощный DSL для разбора бинарных файлов, вирусная GPL накладывает серьёзные ограничения на потенциальных пользователей моего кода.

Пришлось под шумок перелицензировать и Cycle of Evil, и либу cl-aseprite под той же GPLv3, чтобы её юзерам сразу было понятно, что почём 😩
Видимо, придётся-таки, как я и думал, хранить анимации в Tiled-файлах, но там тоже есть свои ограничения — остаётся надеяться на его, Tiled, быстрое развитие, хоть уже сам сдувай пыль со своих C++/Qt навыков и лепи пуллреквесты 😅
#анонс

Коллеги организуют, надеюсь и сам попробовать поучаствовать 😅
Forwarded from Haiku
Всем привет!
Ребята, присоединяйтесь к хакатону от Самураев с 26 по 28 июня. Отличная возможность для тех, у кого есть интересный проект/идея, но не доходят руки! 😉

Если коротко про формат, то:
Дата: 26-28 июня
Формат: оффлайн + онлайн
Приз: $1000
Проект: новый, без объемных наработок
Тема: любая (+1 балл за Health IT, FHIR, Aidbox)
Стек технологий: любой, можно использовать ИИ (за ФП – сердечко от оргов)
Команда: 2-9 человек
Победителя выбирают сами участники голосованием

А если ты в Черногории, то приходи к нам на виллу, похакатоним оффлайн. Будет бассейн, настольный теннис и разные приколюхи.

Участие бесплатно, необходимо зарегистрироваться здесь.
5
#лытдыбр #emacs

Что-то я всю эту неделю тюленил под кондиком, спасаясь от сорокаградусной жары пытался настроить почту в Emacs, ибо Thunderbird, которым я пользовался до этого, как в анекдоте про воздушные шарики, бракованный, потому что не радует 😅

Сначала попробовал вроде бы более популярный notmuch, но быстро понял, что там нужно построить целую машину Голдберга из шелл-скриптов для того, чтобы вся локальная почта правильно синхронизировалась с GMail. По ходу дела ещё выяснилось, что в GMail придётся включить авторизацию по "паролю приложения" и интерфейс поменять на английский (чтобы имена папок были правильные), и что Python (и, по продолжению, offlineimap) до сих пор не умеет правильно считывать мультиаккаунтный .netrc, лол. В итоге плюнул и всё сделал на mu4e + mbsync, и оказалось, что mu4e мало того, что гмыло поддерживает почти целиком из коробки, так ещё и невероятно красив и пугающе удобен, я уже с трудом понимаю, как я жил до него 😊

Последние пару дней вазюкался с неправильным удалением почты, аж тред на реддите создал, но таки в конечном итоге всё победил) Тут хочется сказать большое спасибо очень дружелюбному русскоязычному емакс-коммьюнити и отдельно Андрею Орсту 🫶

Ну и только что закоммитил все конфиги себе в репу с дотфайлами, чтобы сохранилось на века 😁
🔥72👍21
#проекты #clojure

На той неделе поучаствовал в летнем хакатоне HealthSamurai, где умудрился за три дня пройти от давно вынашиваемой идеи до рабочего прототипа и сделал на Clojure бота, уведомляющего об обновлениях версий используемых библиотек в произвольных проектах (ну как произвольных, пока только на Clojure и Python), этакий аналог Snyk, но в телеграме. Вот видос с таймкодом, где я рассказываю о том, что удалось сделать на хакатоне, а вот и сам бот — он пока в открытом бета-тесте и бесплатный 😊
👍82
#лытдыбр #проекты #common_lisp

Сегодня с утреца в рамках акции растаскивания кодовой базы моего старого проекта d2clone-kit на отдельные хорошо протестированные и задокументированные запчасти с чётким интерфейсом наконец доделал то, что собирался уже очень давно — вытащил в отдельную библиотеку макрос для изменения размера простых массивов Common Lisp, вот она: trivial-adjust-simple-array. Ну и по ходу дела зарефакторил ECS-библиотеку с её использованием.

Возможно, какой-нибудь седобородый лисп-старец, несмотря на мои подробные оправдания объяснения в Readme, зачем это, объяснил бы мне, что я делаю фигню и эта библиотека не нужна, но у меня таких знакомых нет 😅
🔥5
#лытдыбр

А ещё на той неделе впервые в жизни побывал на подкасте, посвящённом лиспам, брейкбиту, BSD-системам, климактическому кризису, многопользовательским текстовым адвенчурам и другим гиковским вещам, за авторством широко известного в узких кругах screwtape (он же screwlisp), подпишитесь на него, он странный, но клёвый. Правда, запись похерилась и из часа подкаста остались только первые 15 минут, да ещё и сайт с архивами подкаста вообще сейчас лежит 😅 Но вышло очень продуктивно — вынес пару идей по поводу того, на какие штуки стоит обратить внимание в разработке игрового движка на Common Lisp 😊
5🔥1