Forwarded from ai.dot(ufna, dev)
Не знаю почему это не было у меня прикопано здесь, исправляюсь.
Отличное онлайн демо по теням и свету в графике.
https://ciechanow.ski/lights-and-shadows/
Отличное онлайн демо по теням и свету в графике.
https://ciechanow.ski/lights-and-shadows/
ciechanow.ski
Lights and Shadows – Bartosz Ciechanowski
Interactive article explaining how lights and shadows behave.
👍3🔥3
Сейчас я работаю в крупной отечественной компании над CAD-подобной системой на Unreal Engine. Хотя это не идеальный движок для таких задач, работа даёт важный опыт, которым я постараюсь делиться, если позволит время.
Также занимаюсь несколькими собственными проектами: переработал ИИ систему на базе GPT, сформировав на её основе две демки для разных задач, работаю над MMO играми для Telegram. Код метавёрса можно найти на GitLab: https://gitlab.com/le7el/xr/ — хоть он частично урезан, он всё равно может быть полезен для академических целей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥6⚡2
Я давно думал про игру, в которой смог бы объединить интересные мне механики и забавное название. Несколько месяцев назад я показал свои идеи друзьям, и им мои идеи зашли. Так я начал работу над своей ММО игрой для Telegram - Miner Caravan ⛏ .
Игра про добычу руды, исследования пещер, развитие личное, и совместное - всего сообщества, а также сотрудничество и соперничество. Изначально за две недели посиделок ночами и выходными я реализовал первый прототип, ребята активно помогали с UI и тестированием. Я на себя взял геймплей, бэкенд, devops и прочие задачи по разработке. Так у нас появился игровой клиент, а также кластер с матчмейкером и динамическим управлением серверами.😎
Мир в игре генерируемый (но детерминированный), как в первых TES, в современной NMS, и подобных играх. Без ограничений на размеры вселенной, но с ограниченными подземельями. Прототип был собран на коленке, с кучей багов и лазеек. Игроки майнили с разных устройств, подключали программы-кликеры, и накручивали себе кучи ресурсов за считанные часы.🔓
С друзьями на первый тест мы собрали в сумме около пары сотен человек, что меня побудило на продолжение всей этой истории.
Прототип был реализован на JavaScript (и frontend и backend). Так проще всего было связать сервер и клиент по WebSocket протоколу. Но я быстро начал погрязать в абстракциях и ограничениях. Со стороны сервера, например, было достаточно много сложностей в отладке генератора подземелий. Мне приходилось вручную просматривать большие матрицы числовых данных. Я пытался сделать рисование картинок на виртуальном холсте или в bitmap, но это было чересчур сложно.
Со скрипом допилив генерацию подземелий и до какой-то степени навигацию (о ней ниже), я выяснил что никто не понимает как играть.👎 Изначально была сделана система обучения в виде презентации на старте игры, но как выяснилось, большинство игроков их просто закрывает, не читая (надо было убрать к чёрту кнопку ❌ и оставить только "далее" ). Поэтому был реализована интерактивная обучалка с принципом конечного автомата в основе. Можно посмотреть в боте, если ещё не видели: Miner Caravan Bot. Делайте интерактивные обучалки as it has to be fun .
После этого мы всей семьёй надолго заболели, очутились в больнице, как итог - минус месяц активной работы и импульс.
После возвращения к работе, я занялся новыми фичами - монстрами👾 и улучшением системы взаимодействия и перемещения.
Изначально для простоты были использованы дискретные плитки для перемещения персонажей и простой A* алгоритм. Но в конечном итоге это привело к вороху проблем с синхронизацией положения персонажей на клиентах и сервере. Я решил переключиться на navmesh. Но вот незадача - я не нашёл нормальной библиотеки для генерации и навигации по сетке на JS. Из качественных я нашёл только webasm порт recast/detour. С ним мы не поладили - он напрочь отказывался выдавать мне навигационную сетку, и при этом не выдавал никаких ошибок и логов (вот тебе null, и отвяжись ). Отлаживать всё это было практически нереально, поэтому я принял важное решение - выкинуть всё и начать сначала (ну почти) . 🗑
Продолжение следует...
#minercaravan
Игра про добычу руды, исследования пещер, развитие личное, и совместное - всего сообщества, а также сотрудничество и соперничество. Изначально за две недели посиделок ночами и выходными я реализовал первый прототип, ребята активно помогали с UI и тестированием. Я на себя взял геймплей, бэкенд, devops и прочие задачи по разработке. Так у нас появился игровой клиент, а также кластер с матчмейкером и динамическим управлением серверами.
Мир в игре генерируемый (но детерминированный), как в первых TES, в современной NMS, и подобных играх. Без ограничений на размеры вселенной, но с ограниченными подземельями. Прототип был собран на коленке, с кучей багов и лазеек. Игроки майнили с разных устройств, подключали программы-кликеры, и накручивали себе кучи ресурсов за считанные часы.
С друзьями на первый тест мы собрали в сумме около пары сотен человек, что меня побудило на продолжение всей этой истории.
Прототип был реализован на JavaScript (и frontend и backend). Так проще всего было связать сервер и клиент по WebSocket протоколу. Но я быстро начал погрязать в абстракциях и ограничениях. Со стороны сервера, например, было достаточно много сложностей в отладке генератора подземелий. Мне приходилось вручную просматривать большие матрицы числовых данных. Я пытался сделать рисование картинок на виртуальном холсте или в bitmap, но это было чересчур сложно.
Со скрипом допилив генерацию подземелий и до какой-то степени навигацию (о ней ниже), я выяснил что никто не понимает как играть.
После этого мы всей семьёй надолго заболели, очутились в больнице, как итог - минус месяц активной работы и импульс.
После возвращения к работе, я занялся новыми фичами - монстрами
Изначально для простоты были использованы дискретные плитки для перемещения персонажей и простой A* алгоритм. Но в конечном итоге это привело к вороху проблем с синхронизацией положения персонажей на клиентах и сервере. Я решил переключиться на navmesh. Но вот незадача - я не нашёл нормальной библиотеки для генерации и навигации по сетке на JS. Из качественных я нашёл только webasm порт recast/detour. С ним мы не поладили - он напрочь отказывался выдавать мне навигационную сетку, и при этом не выдавал никаких ошибок и логов (
Продолжение следует...
#minercaravan
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5
Немного мыслей про языки.
C++ в его современном виде кажется слишком громоздким. Каждая новая фича пытается устранить недостатки прошлых версий и сделать код безопаснее и удобнее, но сам язык усложняется. То же самое происходит, например, с Rust. Мы наращиваем абстракции, чтобы упростить разработку. При этом решаем старые проблемы, плодя новые, требующие либо адаптации мышления, либо новых решений (yet again).🤔
Мы стали забывать, что каждый уровень абстракции увеличивает стоимость и отдаляет нас от решения проблемы. 💸
Семантика перемещения решает проблему копирования, но требует дополнительных функций, правило трех превратилось в правило пяти (не появится ли скоро правило семи? ). По сути, это лишь копирование указателя, но с нюансом (как в анекдоте про нюанс). Спецификаторы доступа public/protected/private помогают скрыть то, что не нужно (по замыслу автора) менять пользователям, но разве вам не приходилось бороться с сокрытыми полями в классах 🎮 Unreal Engine и выдумывать методы обхода таких решений? Не чувствовали ли вы себя шпионом, который пробивается к полям через касты и смещения. Как это добавляет безопасности?
Здесь можно вспомнить про PHP с Laravel и прочими популярными MVC фреймворками. Они тратят больше времени на создание абстракций, чем на выдачу контента пользователю. И это только для обработки одного запроса (после чего оно спокойно умирает ). А попробуйте обновить старый сайт с Laravel 5 до Laravel 8 - сколько времени это займёт? Куда удобнее и легче в поддержке тот же Wordpress, простой как вьетнамский тапок.
Вспомним также и ORM фреймворки вроде SQL Alchemy (Python), Gorm (Go), и прочие, которые позволяют писать красивый код, который очень нравится писать программисту, но в ущерб производительности (в разы) и гибкости (попробуйте создать полиморфические таблицы и запросы к ним с помощью любимого ORM фреймворка). Почему не использовать низкоуровневый драйвер и SQL?
В JavaScript ситуация еще интереснее: вокруг языка возник зоопаркнад- языков, фреймворков, библиотек «для увеличения надежности и упрощения разработки». Однако некоторые фреймворки стали настолько громоздкими, что нынче требуются новые, более простые, которые решают проблемы старых. Никто не понимает как работает Webpack, поэтому был создан Vite, а Angular меняют на Svelte. При этом ванильный JavaScript и DOM вполне неплохи, и с ними тоже можно работать и, что важнее - быстро решать проблемы, не перегружая голову условиями и ограничениями фреймворков.
По факту, всё это напоминает скорее ритуал. Компании используют выбранный фреймворк, даже если он больше мешает, чем помогает, потому что разработчики знают только его. Появляется необходимость в бэкенде — мы не привлекаем Go-программистов, а переводим часть фронтендеров на NodeJS (и так сойдёт, поскейлим вертикально, горизонтально, всё остальное - излишние расходы и ненужная оптимизация - фу ). Для десктопа и мобильных мы берем Electron и наш любимый фреймворк, закрывая всё одной командой. One ring lang to rule them all! И имя ему - JavaScript. 😅
Разве это не прекрасно? (Не всегда ).
#программирование #мысли
C++ в его современном виде кажется слишком громоздким. Каждая новая фича пытается устранить недостатки прошлых версий и сделать код безопаснее и удобнее, но сам язык усложняется. То же самое происходит, например, с Rust. Мы наращиваем абстракции, чтобы упростить разработку. При этом решаем старые проблемы, плодя новые, требующие либо адаптации мышления, либо новых решений (yet again).
Мы стали забывать, что каждый уровень абстракции увеличивает стоимость и отдаляет нас от решения проблемы. 💸
Семантика перемещения решает проблему копирования, но требует дополнительных функций, правило трех превратилось в правило пяти (
Здесь можно вспомнить про PHP с Laravel и прочими популярными MVC фреймворками. Они тратят больше времени на создание абстракций, чем на выдачу контента пользователю. И это только для обработки одного запроса (
Вспомним также и ORM фреймворки вроде SQL Alchemy (Python), Gorm (Go), и прочие, которые позволяют писать красивый код, который очень нравится писать программисту, но в ущерб производительности (в разы) и гибкости (попробуйте создать полиморфические таблицы и запросы к ним с помощью любимого ORM фреймворка). Почему не использовать низкоуровневый драйвер и SQL?
В JavaScript ситуация еще интереснее: вокруг языка возник зоопарк
По факту, всё это напоминает скорее ритуал. Компании используют выбранный фреймворк, даже если он больше мешает, чем помогает, потому что разработчики знают только его. Появляется необходимость в бэкенде — мы не привлекаем Go-программистов, а переводим часть фронтендеров на NodeJS (
Разве это не прекрасно? (
#программирование #мысли
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Полезный скрипт от моего товарища, который нас не раз выручал. Позволяет восстанавливать удаленные ветки в git. 🔓
#programming #git #scripts
#programming #git #scripts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Forwarded from Nikolay Bulatov
# покажет вам все коммиты на кончиках вашего графика фиксации, которые больше
# не ссылаются ни на одну ветку, ни на тег
git fsck --no-reflog | awk '/dangling commit/ { print $3}'| xargs -I %m git show -s --format="%h - %ci %s" %m
# Вернуть как ветку
git branch recover-branch ab1afef
# Преобразовать ветку в stash
git stash apply recover-branch
git stash
🔥2👍1
Проблема абстрактного метавёрса
Основная жалоба со стороны пользователей, как и у большинства метавселенных, — "а что тут делать?".🤷♀️
Поэтому я решил добавить в игру конкретные занятия: от простых, но эффективных (с точки зрения конверсии и удержания), до сложных и захватывающих. Подробности пока разглашать не буду. Разработка построена так, чтобы с минимальными усилиями (учитывая, что команда разработки сейчас - это я один) создать базовую версию игры. Она должна поддерживать онлайн-активность, и постепенно дополняться новыми фичами. Главная идея - создать замкнутую экономику с продуманной циркуляцией ресурсов и игровой валюты, параллельно предложив увлекательный и социально-ориентированный геймплей.
Приоритеты
Система матчмейкинга, отвечающая за запуск и остановку серверов в рамках Kubernetes кластера у меня уже есть и работает. Также сам кластер позволяет гибко масштабировать проект: при развёртывании в облаке
добавляются ноды по мере роста нагрузки, поддерживая требуемые мощности и количество игроков. Поэтому важнейшая задача на данный момент - имплементация игрового сервера с ключевыми системами, отражаемыми в клиенте.
Решение
Для серверной части я выбрал язык C. До этого на нём я писал только небольшие эксперименты, но мне давно хотелось попробовать что-то серьёзное (аж руки чесались ) 🧑💻 . Ведь именно на C созданы многие фундаментальные библиотеки, на которых построено практически всё, что мы знаем (zlib, openssl, libpng, и прочие). Я решил что это будет отличным опытом, особенно учитывая что на C также создавались культовые игры Doom, Quake, Half-Life, Counter-Strike, WarCraft и многие другие. Кроме того, C всё-таки очень простой в сравнении с другими языками, и количество абстракций сведено к минимуму, что мне тоже нравится. Что из этого выйдет - посмотрим, но пока всё получается, всё очень интересно и приносит ощутимый опыт. 🌡
Большой рефакторинг
Так начался перенос логики игры с JS на C.👉
Чтобы освоить C, я сделал несколько тестов с ключевыми системами игры в виде отдельных систем. Первым делом - генерация подземелий. У меня уже был JS-код, генерирующий детерминированные подземелья по заданному сиду.
Если коротко, то переносить код с JS на C было не так сложно, как я предполагал изначально.Систему генерации подземелий на JS я писал около 2-3 недель, мучаясь с отладкой. На C я всё переписал в течение недели.
Перенос генерации подземелий
Код Mersenne Twister мне помог Copilot буквально за несколько минут⬆️ , этот алгоритм я использую для генерации детерминированных (с указанным сидом) целых чисел, чисел с плавающей точкой, цветов и других данных.
Далее потребовалась загрузка конфигурации для особых миров (таких как центральный мир, где появляются новые игроки при логине). С этим отлично справилась библиотека cJSON. Работать с ней оказалось проще, чем, например, с JSON в Unreal Engine, и конфигурации миров стали быстро загружаться в соответствующие структуры.
Потом я реализовал динамические массивы для хранения данных генерации (изначально - отдельный под каждую структуру ). Когда их стало несколько, я объединил их в одну универсальную структуру с использованием
Для визуализации подземелий использовал libpng, которая позволила наконец-то увидеть подземелья в виде картинок вместо анализа JSON матриц на десятки тысяч элементов 👀 в NodeJS. Это значительно упростило отладку.
На C были переписаны и оптимизированы функции для создания подземелий:
- Генерация шума - изначальная генерация детерминированной карты с заданными параметрами;
- Сглаживание шума - создание стен и пустот, которые образую комнаты и коридоры;
- Определение изолированных областей - выделение и отсеивание слишком мелких регионов;
- Соединение комнат - нахождение и соединение ближайших комнат в единую сеть;
- Расположение игровых объектов - добавление руды, монстров, и четырёх порталов в каждом подземелье (по 4 сторонам квадрата ).
#minercaravan
Основная жалоба со стороны пользователей, как и у большинства метавселенных, — "а что тут делать?".
Поэтому я решил добавить в игру конкретные занятия: от простых, но эффективных (с точки зрения конверсии и удержания), до сложных и захватывающих. Подробности пока разглашать не буду. Разработка построена так, чтобы с минимальными усилиями (учитывая, что команда разработки сейчас - это я один) создать базовую версию игры. Она должна поддерживать онлайн-активность, и постепенно дополняться новыми фичами. Главная идея - создать замкнутую экономику с продуманной циркуляцией ресурсов и игровой валюты, параллельно предложив увлекательный и социально-ориентированный геймплей.
Приоритеты
Система матчмейкинга, отвечающая за запуск и остановку серверов в рамках Kubernetes кластера у меня уже есть и работает. Также сам кластер позволяет гибко масштабировать проект: при развёртывании в облаке
добавляются ноды по мере роста нагрузки, поддерживая требуемые мощности и количество игроков. Поэтому важнейшая задача на данный момент - имплементация игрового сервера с ключевыми системами, отражаемыми в клиенте.
Решение
Для серверной части я выбрал язык C. До этого на нём я писал только небольшие эксперименты, но мне давно хотелось попробовать что-то серьёзное (
Большой рефакторинг
Так начался перенос логики игры с JS на C.
Чтобы освоить C, я сделал несколько тестов с ключевыми системами игры в виде отдельных систем. Первым делом - генерация подземелий. У меня уже был JS-код, генерирующий детерминированные подземелья по заданному сиду.
Если коротко, то переносить код с JS на C было не так сложно, как я предполагал изначально.
Перенос генерации подземелий
Код Mersenne Twister мне помог Copilot буквально за несколько минут
Далее потребовалась загрузка конфигурации для особых миров (таких как центральный мир, где появляются новые игроки при логине). С этим отлично справилась библиотека cJSON. Работать с ней оказалось проще, чем, например, с JSON в Unreal Engine, и конфигурации миров стали быстро загружаться в соответствующие структуры.
Потом я реализовал динамические массивы для хранения данных генерации (
void* и вспомогательных функций. Это было хорошим упражнением в работе с указателями.Для визуализации подземелий использовал libpng, которая позволила наконец-то увидеть подземелья в виде картинок вместо анализа JSON матриц на десятки тысяч элементов 👀 в NodeJS. Это значительно упростило отладку.
На C были переписаны и оптимизированы функции для создания подземелий:
- Генерация шума - изначальная генерация детерминированной карты с заданными параметрами;
- Сглаживание шума - создание стен и пустот, которые образую комнаты и коридоры;
- Определение изолированных областей - выделение и отсеивание слишком мелких регионов;
- Соединение комнат - нахождение и соединение ближайших комнат в единую сеть;
- Расположение игровых объектов - добавление руды, монстров, и четырёх порталов в каждом подземелье (
#minercaravan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
Немного про CMake
Переход на C потребовал также повозиться с системой сборки. Мне нужно было не просто собрать проект, но и иметь возможность отлаживать не только собственный код, но и код используемых библиотек (а также я хотел их собирать с нужными мне оптимизациями под целевое железо ). Системные библиотеки мне для этого не подходили, поэтому я изучил возможности CMake, а именно — модуль ExternalProject. Этот модуль позволяет добавлять дополнительные проекты как зависимости (напрямую из репозиториев, оно само их клониует при сборке), и CLion (который я использую) распознаёт их как отдельные сборочные конфигурации, что заметно облегчает отладку и сборку.
ExternalProject оказался удачным выбором для построения дерева зависимостей: легко добавить как стандартные библиотеки, так и header-only библиотеки. Приходится писать конфигурацию вручную для каждой библиотеки, но это буквально copy-paste с небольшими правками.
Так как целевая платформа у меня одна — Linux/Unix, поддержку кроссплатформенности (Windows) я оставил за кадром. Из-за установки зависимостей в(в частности, OpenSSL), т.к. система также использует этот путь для поиска .so . Но на данный момент это не критично, так как проект работает в WSL (а деплоиться будет в поды в кластере). Версию OpenSSL можно было бы согласовать с системной, но мы ведь не ищем легких путей, верно?
Пример
Листинг файла CMakeLists.txt:
Листинг файла cmake/zlib.cmake:
Путь установки библиотеки можно изменить с
#cmake #minercaravan
Переход на C потребовал также повозиться с системой сборки. Мне нужно было не просто собрать проект, но и иметь возможность отлаживать не только собственный код, но и код используемых библиотек (
ExternalProject оказался удачным выбором для построения дерева зависимостей: легко добавить как стандартные библиотеки, так и header-only библиотеки. Приходится писать конфигурацию вручную для каждой библиотеки, но это буквально copy-paste с небольшими правками.
Так как целевая платформа у меня одна — Linux/Unix, поддержку кроссплатформенности (Windows) я оставил за кадром. Из-за установки зависимостей в
/usr/local у меня возникают некоторые конфликты с системными библиотеками Пример
Листинг файла CMakeLists.txt:
cmake_minimum_required(VERSION 3.22)
project(mc_game_server C)
include(ExternalProject)
# Включаем файл, в котором у нас настроена сборка zlib.
include(${CMAKE_SOURCE_DIR}/cmake/zlib.cmake)
# ... (omitted)
target_include_directories(myapp PRIVATE
/usr/local/include
${CMAKE_SOURCE_DIR}/src)
target_link_libraries(myapp PRIVATE
m
-Wl,--start-group # Разрешение зависимостей
${ZLIB_LIBRARY}
# ... (omitted)
-Wl,--end-group
)
Листинг файла cmake/zlib.cmake:
include(ExternalProject)
#region Zlib
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "zlib: Building in Debug mode")
set(ZLIB_C_FLAGS "-O0 -g -mavx -mavx2 -ftree-vectorize -march=native")
else ()
message(STATUS "zlib: Building in Release mode")
set(ZLIB_C_FLAGS "-O3 -mavx -mavx2 -ftree-vectorize -march=native")
endif ()
ExternalProject_Add(
zlib
PREFIX /usr/local/src/zlib # Install source code to this directory
GIT_REPOSITORY git@github.com:madler/zlib.git
GIT_TAG v1.3.1
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=/usr/local # Install to this directory
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} # Build type
-DCMAKE_C_FLAGS=${ZLIB_C_FLAGS} # C flags
-DZLIB_BUILD_EXAMPLES=0 # Don't build examples
BUILD_COMMAND ${ZLIB_BUILD_COMMAND}
INSTALL_COMMAND cmake --install . --config ${CMAKE_BUILD_TYPE}
)
ExternalProject_Get_Property(zlib install_dir)
set(ZLIB_ROOT_DIR ${install_dir})
set(ZLIB_INCLUDE_DIR /usr/local/include)
set(ZLIB_LIBRARY /usr/local/lib/libz.a)
#endregion
Путь установки библиотеки можно изменить с
/usr/local на любой другой.#cmake #minercaravan
🔥3❤1
Forwarded from эйай ньюз
Убийца Mac Mini от Nvidia – Digits
Вы только гляньте, шустрая коробочка помещается на ладошке Хуанга!
128 GB оперативки, 1 петафлоп в fp4, 20 Arm ядер. На такой машинке можно инференсить модели вплоть до 200 млрд параметров. Можно соединить две такие малышки и запускать уже 405B модель.
Обещают выпустить в мае, цена вопроса - $3000.
Хочу себе такую домой!🥺
@ai_newz
Вы только гляньте, шустрая коробочка помещается на ладошке Хуанга!
128 GB оперативки, 1 петафлоп в fp4, 20 Arm ядер. На такой машинке можно инференсить модели вплоть до 200 млрд параметров. Можно соединить две такие малышки и запускать уже 405B модель.
Обещают выпустить в мае, цена вопроса - $3000.
Хочу себе такую домой!
@ai_newz
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤯3👍1🤔1
🔥3👍2
Forwarded from Shpota Productions
Остросюжетный фильм об капитане милиции с установленным в тело искусственным интеллектом в сеттинге будущего СССР.
В главной роли Роман Курцын.
📱 YOUTUBE
📱 ВК ВИДЕО
Фильм снят при финансовой поддержке краудфандинга на planeta.ru
Приятного просмотра!
В главной роли Роман Курцын.
Фильм снят при финансовой поддержке краудфандинга на planeta.ru
Приятного просмотра!
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
АДЕЛЬ. Фильм, советский киберпанк, реж. Илья Шпота (2025)
Это короткометражный фильм снятый при финансовой поддержке как моих подписчиков, так и других людей, которых заинтересовала наша идея. Мы хотели снять короткометражное кино, чтобы в дальнейшем получить возможность реализовать полный метр и раскрыть все тонкости…
👍1🔥1
