martianov_dev
53 subscribers
17 photos
10 videos
5 links
Привет! Добро пожаловать в мой devlog. Я увлечен изучением технических аспектов разработки компьютерных игр и с радостью делюсь своими открытиями и проектами с вами! @martianov
Download Telegram
Привет, народ! Помимо написания шейдеров в свободное время, в реальности я еще немного DS :D И заготовил для вас развлекательный пост 😄 Этот анализ ниже - чисто экспериментальный и не претендует на точность или практическую применимость. Я провел его из личного интереса к символьной регрессии и любви к поиску математических закономерностей в данных. Рассматривайте это как увлекательное исследование, а не как серьезную прогностическую модель.

Решил я тут поэкспериментировать с интересной штукой - символьной регрессией. Вообще существуют такие решения, которые могут аппроксимировать данные и выдать формулу например для будущих предсказаний.
Меня осенило попробовать предсказать продажи игр на основе разных метрик.
Для анализа был сформирован обезличенный датасет из 50 строк, включающий следующие признаки: жанр (кодированный категориальный), бюджет (в млн $), длительность (в часах), оценка критиков (по 100-балльной шкале), наличие мультиплеера (бинарный) и объем продаж (в млн копий). Структура данных выглядела следующим образом:

Жанр,Бюджет,Длительность,Оценка_критиков,Мультиплеер,Продажи
1,50,40,85,0,2.5
2,30,10,75,1,1.8
3,15,100,70,0,0.9
...
Где первый столбец Жанр, там указаны просто коды жанров, например:
1: RPG
2: Шутер
3: Симулятор

Для анализа использовал TuringBot (https://turingbotsoftware.com/) - крутую, но платную программу (у меня, к счастью, есть лицензия). Загрузил туда свой датасет, указал входные переменные и целевое значение. Данные были разделены на обучающую и тестовую выборки в соотношении 50/50 для проведения кросс-валидации. В качестве целевой метрики оптимизации использовалось среднеквадратичное отклонение (RMSE).

После 5 минут работы программа выдала оптимальную формулу. Она отлично справилась с тренировочными данными и более-менее с тестовыми. Главное - удалось найти зависимости между входными параметрами и продажами. Казалось бы, полученная формула отражает нелинейные зависимости между входными параметрами и объемом продаж, учитывая взаимодействия между признаками и теперь у нас есть "формула мечты" для прогнозирования доходов 😄 (Рисунок 1)

Но не все так круто 🙈 На тестовых данных формула уже не так красиво себя вела Рисунок 2. Тут играет куча причин, например:
- Малый размер выборки (n=50) повышает риск переобучения модели.
- Наблюдается сильная корреляция между бюджетом и оценками критиков
- Категориальный признак "жанр" закодирован числовыми значениями, что может некорректно отражать его влияние. но опять же это решается размером датасета

Но хочу подчеркнуть - даже сейчас "модель" предсказала верную тенденцию на данных, которые не участвовали в обучении. Но и тут мне надо бы осторожным по причинам описанным выше.

В заключение хочу отметить, что символьная регрессия, несмотря на свою "классичность", остается мощным инструментом. Она позволяет получать интерпретируемые модели и выявлять неочевидные закономерности в данных. Хотя современные методы глубокого обучения часто превосходят ее по точности, символьная регрессия сохраняет свою ценность в задачах, требующих прозрачности и объяснимости модели. Например мне будет приятно использовать формулу отлично решающую определенную задачу, чем инференсить pytorch модели. Лично я нахожу работу с этим методом крайне увлекательной, особенно в контексте исследовательского анализа данных и генерации гипотез, как то так 💪

Кстати, а вот и формула 😂

def solution(Жанр, Бюджет, Длительность, Оценка_критиков, Мультиплеер):
return 0.06699618899317092*(0.686980117635591/(tan(Оценка_критиков)-1.640619407832785*Мультиплеер)+Оценка_критиков-74.61041769134356+Бюджет+(6.434509049049919-atanh(sin(Мультиплеер*(Длительность-Жанр)-0.1417795805275835)))*(Мультиплеер-cos(round((0.9990760411584179+erf(Мультиплеер))*Жанр+Оценка_критиков))))
🔥6👍4
Media is too big
VIEW IN TELEGRAM
Что же я успел сделать?)

Мало кто знает, но для создания своей "Игры мечты" помимо шейдеров я разрабатываю собственную библиотеку для создания пользовательских интерфейсов на игровом движке Defold. Вдохновляясь библиотекой React.js для веба, я делю интерфейс на шаблоны, макеты, умные и глупые компоненты. Это позволяет конструировать интерфейсы почти так же, как с помощью HTML-разметки, и рендерить их с использованием компонентов со своим состоянием и так далее. Я также разрабатываю аналог CSS для описания стилей.

Теперь к сути дела: у CSS есть свойство backdrop-filter, позволяющее применять различные эффекты к области позади UI-элемента. И вот на выходных я реализовал его в своей библиотеке! Теперь достаточно указать backdropFilter="blur(10px)" в стилях элемента, и все заработает. По сути, это послойный рендеринг, требующий немного больше вызовов отрисовки, но эффект того стоит. Механизм внутри рендер-скрипта автоматически разделяет интерфейс на нужные слои, основываясь на стилях. Этот подход мне достался с тех пор, когда я внедрил механизм клиппинга 💪

Кстати бонусом еще сделал анимации при наведении. Т.к. мне недоступен реальный css с транзишенами, я реализовал что то типа useAnimatedState как аналог useState из react.js
👍6🔥5
Недавно Жена мне подарила на день рождения книгу Джесси Шелла "Гейм Дизайн". Но... этому предшествовало мое глубокое разочарование в индустрии онлайн-курсов 🙈

Изначально я искал комплексную информацию о геймдизайне: что это такое, с чем его "едят", причем не только для новичков. Однако обнаружил, что большинство курсов, даже если они называются "Геймдизайн", на самом деле фокусируются на базовом программировании, изучении игровых движков и создании простейших платформеров. Мое разочарование усиливалось тем, что индустрия онлайн-образования, похоже, ориентирована на массового потребителя, предлагая поверхностные знания по принципу "галопом по Европам". Вместо глубокого погружения в психологию игрока, методы создания эмоционального отклика и способы трансляции нужного опыта, курсы предлагали лишь техническую сторону вопроса: "на какую кнопочку нажать, чтобы создать проект в Unity".

А я всего лишь искал более глубокое понимание геймдизайна как искусства создания увлекательного игрового опыта, а не просто набор технических навыков.

Похоже, я был настолько увлечён, что моя любимая решила изучить все статьи на хабре, посетить тематические форумы и узнать, что советуют люди. В результате теперь каждый день перед сном я читаю охренительную книгу. 🔥
👍5🔥4
Что по ценам нынче?

Вчера ночью нанял профессионального 3D-артиста смоделировать персонажа. С помощью нейросети я набросал примерное видение временного ГГ, которым буду управлять. Нейросеть выдала нужный вариант с попытки сотой, наверное, но даже при этом есть косяки, которые я решил исправить через ТЗ. Вообще все недочеты и лишние детали можно пофиксить через inpaint, но этим я решил не заморачиваться.
Выбирая профессионала, я исходил из того, насколько хорошо исполнитель владеет кисточкой, так как хотелось стилизацию и качественную прорисовку текстур. Итого из всего многообразия выбрал для себя 2 претендентов:
Один берет 35 тыс. рублей
Второй 20 тыс. рублей

Спойлер: выбрал того, что дешевле, и считаю это разумным. Я бы заплатил и 35, тем более у него работы гораздо серьезнее, но исполнитель был сильно перегружен, и мне не хотелось терять время, ожидая, когда до меня дойдет очередь.
В итоге взял исполнителя, который берет 20 тысяч, что считаю очень и очень мало, но человек действительно выдает хороший результат, и я дал ему шанс.
Прикладываю к посту мой образ, который я хочу) В будущем мне предстоит еще найти человека, который сделает риг 😆 Ну, вообще я и сам могу, но учусь уже делегировать задачи, время на выполнение которых я лучше потрачу на основную работу.
🔥8👍3
martianov_dev
Что по ценам нынче? Вчера ночью нанял профессионального 3D-артиста смоделировать персонажа. С помощью нейросети я набросал примерное видение временного ГГ, которым буду управлять. Нейросеть выдала нужный вариант с попытки сотой, наверное, но даже при этом…
#Субботний

Со мной случилась забавная история. Помните, я рассказывал, что выбрал двух исполнителей для моделирования моего персонажа? В итоге я остановился на первом мастере по нескольким причинам, но суть не в этом. Дело в том, что второй мастер (который заметно дороже) неожиданно начал работать над проектом без нашего согласования. Он даже успел сделать черновой вариант 3D-модели и отправил мне сообщение: мол, смотри, уже работаю, уточню несколько деталей. При этом мы ещё вообще не обсуждали начало работы!
Несмотря на то, что изначально я планировал отдать проект первому мастеру, я всё-таки решил дать и второму ту же задачу. Неделю спустя он прислал мне готовые рендеры персонажа – и они оказались просто офигенными! Прикол в том, что я тогда ещё даже не заплатил ему ни копейки, включая аванс. Но, конечно, потом я полностью рассчитался и оставил положительный отзыв. Работа получилась на высшем уровне: ретопология, hand-paint текстуры – всё сделано идеально. Теперь осталось дождаться результата от первого мастера и сравнить подход двух разных специалистов к одному техническому заданию.

Как только получу результат от другого мастера, то сразу запилю сравнение 👍
👍6🔥3
+ Кстати
Сегодня оказался на созвоне с разработчиками игр на Defold Engine. Один из них задал мне вопрос: «Расскажи, над чем работаешь, какая у тебя идея?» Я начал рассказывать про технические аспекты проекта – что уже сделано, какие задачи впереди, что планирую добавить позже. Однако самую важную часть – суть самой игры – я специально обошел стороной.

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

Для себя я составил следующий план:

1. Сначала сделаю демо-версию.
2. Потом займусь рендерами.
3. После этого опишу своё видение игры в тексте.
4. И наконец, опубликую всё это.

Пока же я предпочитаю придерживаться стратегии: не говорить о том, что ещё не завершено.
🔥4👍1
За последнюю неделю испытал срыв. Даже не знаю, с чем это связано: может, с перманентным состоянием, что тебя вот-вот уволят за низкую продуктивность, или с тем, что на втором фронте разработка идёт не всегда так гладко, как хочется. Разработка игры — это пот и кровь, вечная работа ради работы. Делаешь одну задачу, на неё приходит целых две.
Например, в игровом движке Defold отсутствует нормальная костная анимация. Нет, она как бы есть, но далека от желаемой функциональности. Поэтому я пишу свой C++ модуль для анимирования, и в целом выходит удачно. Потом шейдеры по-разному ведут себя на Windows и WebGL, решение этих проблем отнимает кучу часов. Плюс ко всему описываю обширный диздок моей игры, хотя бы для того, чтобы дизайнеры, которых я нанимаю, понимали, в каком стиле делать работу.
Итог: кранчу я каждый день с 10 утра до 10-11 вечера. Мне уже даже жена предлагает свою помощь — вы бы видели моё радостное лицо! Но я пока решил сам сделать демонстрационную версию, без этого никуда. Фиг знает, а вдруг я найду инвесторов?
👍5🔥51
Media is too big
VIEW IN TELEGRAM
Что же я успел сделать за последнее время? Пока жду локацию от дизайнера, решил заняться анимацией персонажа. Сделал смешивание анимаций и создал некое подобие состояний. В ToDo добавил задачу по реализации сложных переходов между состояниями, например, из ходьбы в бег, затем в прыжок, падение и так далее. Дел на самом деле еще очень много. Кстати, так как игра планируется мультиплеерной, решил протестировать, как игроки могут взаимодействовать друг с другом "физически", а именно толкаться. Вот, показываю видео :)
👍5🔥51
Media is too big
VIEW IN TELEGRAM
Создал тени от направленного источника, причём они ещё и каскадные! Пока без фильтров, но в будущем обязательно добавлю. В некотором смысле, тени от направленного источника сложнее реализовать, чем от точечного. Приходится разбираться с усечённым конусом, делить зоны детализации и так далее. Но в итоге получилось здорово — мир стал выглядеть более живым 👍
👍7🔥52
Media is too big
VIEW IN TELEGRAM
С приближением праздников меня охватило желание подвести итоги года коротким видео о текущем состоянии игры. И вот что получилось! Дизайнер наконец-то завершил часть уровня, которую я с радостью демонстрирую. Конечно, не обошлось без технических нюансов, но я почти со всеми справился. Уже готово более 30 пропсов, хотя они еще нуждаются в подготовке перед внедрением в игру.
Глядя на проделанную работу, я чувствую, как душа наполняется теплом и гордостью за проект. Каждый элемент, каждая деталь – это частичка моего творчества и усердия.
Особенно хочется поблагодарить комьюнити Defold, кто помогал в этом году 😉

С наступающим!
👍10🔥82
На новогодних каникулах, как ностальгирующий динозавр, я решил вернуться к истокам программирования)) Так сказать после долгих лет купания в теплых водах интерпретируемых языков (этакий детский бассейн), я решил собрать граф движок BGFX под Linux, Windows и, возможно, под web через Emscripten. И тут-то я понял, какая это адская херня сборка библиотек, линковка и прочие радости жизни C++ разработчика.

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

Я скучал по этому безумию
🔥53👍3👻2😨1
В продолжение предыдущего поста.

После экспериментов с C++ я перешел на изучение Rust. На мой взгляд, язык довольно многословен, но этим самым он дает лучшее понимание работы кода еще до компиляции. Особенно впечатляет пакетный менеджер Cargo. Вместо простых задачек из школы я обычно сразу перехожу на более сложный уровень, например, инициализацию окна или выбор графического адаптера для отрисовки графики. Почему? Потому что могу)
В целом этот язык подарил мне понимание таких концепций, как мутабельность, владение, перемещение, жизненный цикл переменной и прочие особенности Rust.

Для развлечения я выбрал библиотеку WGPU, которая предоставляет серьезную абстракцию над бэкендами, такими как Vulkan, DirectX 12, Metal, OpenGL, WebGL и, что особенно интересно, WebGPU. Я полностью прошел этот замечательный учебник - https://sotrh.github.io/learn-wgpu/ и собрал на его основе свой первый проект. Кстати, познакомился с языком WGSL. После GLSL он кажется каким-то, ну... не таким :D Но для тренировки ума, развития гибкости мышления - самое то.

Вывод: как бывший Golang-разработчик, переход с Go на Rust кажется мне естественным шагом в развитии, открывающим новые возможности!
13👍7🔥2👻2😨1
Года два назад на новой работе отдал свой код на ревью и получил неожиданную реакцию.

Ревьюер с удивлением спросил, почему у меня такой странный стиль кода. Оказалось, что моя привычка ставить открывающую скобку на той же строке, что и условие, вызвала у него недоумение. Я был озадачен. Для меня это всегда было нормой, и я считал такой стиль грамотным. И только на днях до меня дошло - я невольно оказался участником негласного противостояния в мире программирования.

Пока многие спорят о табуляциях и пробелах, существует еще одно разделение - между стилями K&R и Allman. Я-то всю жизнь писал в стиле K&R, даже не задумываясь об этом. Этот стиль я впитал из книг по C и C++, которые читал в юности.
K&R стиль, названный в честь создателей языка C, экономит место на экране и делает код компактнее. Это было особенно важно раньше, когда разрешение мониторов было низким. А стиль Allman, где скобка ставится на новой строке, больше распространен например в JavaScript.

Забавно, что я только сейчас осознал, насколько глубоко во мне укоренился K&R стиль. Это как открыть в себе неожиданную черту характера. Кто бы мог подумать 🙃
7🔥4👍3
Написал редактор для амбициозного сайд-проекта!

Поставил себе цель - написать редактор кода для одной непростой программы. Но вот незадача: проект написан на чистом C99, без готовых UI-библиотек, и уж тем более без готовых а-ля "компонентов" текстового редактора.

Из абстракций над графикой у меня только "холст" и базовые команды: отрисовка текста / прямоугольников и прочие вспомогательные функции для работы со шрифтом. Но и этого достаточно - остальное дело скилла! Помню, писал что-то подобное для игры на Defold Engine, но там было проще: Lua и готовые решения. А тут голый C!

Первая сложность: работа с массивами байтов вместо удобных строк, как в C++ или Lua. Пришлось либо кодить вручную, либо писать свои абстракции. Начал с простого API для работы со строками на более высоком уровне (скриншот приложил). В процессе прослезился, вспомнив все процедурные языки, на которых кодил в школе... Никакого ООП! Но оказалось, что и без него жить можно - даже классно.

Дальше - дело техники: разбивка текста на строки, расчёт ширины символов, обработка позиции курсора относительно мыши, выделение текста, ввод, конкатенация и сохранение на диск. И всё это — на низком уровне, с минимумом доступных функций.

Зачем такие сложности? Этот проект - максимально легковесный и портируемый начиная с веб, заканчивая Raspberry Pi, FreeBSD, и даже PSP (хотя в последнем случае это просто фан, но возможность все же есть). А редактор кода внезапно стал необходим.

Получилось, на мой взгляд, отлично: никаких утечек памяти, хотя я мысленно молюсь на алгоритмы дефрагментации ОЗУ в той системе, где запустится программа. 😂

Кстати, особенно доволен что сразу внедрил поддержку utf8, правда пришлось в каком то моменте некоторые алгоритмы пересмотреть.

Спасибо!
🔥62👍2👻1😨1
Ну что, давненько я не писал про шейдеры! Пришёл к вам с реймачингом и довольно нестандартной задачей.

Наконец-то зацепил одну из своих давних целей - восстановить 3D-форму, используя только карты высот с шести ракурсов. Писать конвертер в меш скучно, а вот запилить шейдер, который в реальном времени рендерит объект через реймачинг вот это уже веселье!

В чём прикол?
Вместо классического рендеринга полигонов (треугольники и всё такое) я использовал пошаговый алгоритм, который проверяет пересечение лучей с виртуальной сценой. Сцена может быть задана либо математическими функциями (SDF — Signed Distance Functions), либо, как в моём случае, картами высот.

Я взял Blender, поставил Сюзанну в центр и сгенерил 6 карт высот (фронт, бэк, лево, право, верх, низ). Шейдер берёт каждую карту и строит по ней выпуклый объект (как если бы мы "выдавливали" форму из карты высот). Затем все эти формы перемножаются (логическое И), оставляя только их общее пересечение. И вуаля! Мы получаем что-то, что напоминает исходную 3D-модель!

Почему это огонь?
Потому что это альтернативный подход к 3D-реконструкции, который работает полностью в реальном времени и без явного хранения меша. Всё считается на лету в шейдере, и можно легко играться с параметрами, добавлять шум, менять детализацию, и всё это без пересчёта геометрии. + Как бонус очень легко сделать SSAO, и прочие эффекты освещения.

Переводил цвет в 8-bit для того, чтобы я смог сохранить информацию об геометрии и цвете в одной 1024x1024 текстуре. Одна текстура = одна модель. Хотя хоть на диске эта "модель" в моем формате занимает всего 200кб(!), но на видеокарте распакуется во все 3мб.

Конечно, это не идеально точный метод из-за ограничений выбранных проекций, но как эксперимент просто офигенно
🔥7👍2😨21👻1