TGViewer
Channel Public Channel
Log of Alprog

Log of Alprog

@logofalprog

Разработка игр.
Чатик: @alprogio Автор: @alprog

#gamedev #programming #code
#геймдев #программирование #код
Subscribers
1.15K
Photos
101
Videos
0
Links
95
Recent Posts 20 shown
Post #268 1.17K
У меня сейчас в голове борятся две концепции для Crunch House.

Общее это то, что у нас есть RimWorld-подобный геймплей, где ты управляешь студией из нескольких человек с разными скиллами. У нас есть мир офиса, где дэвчики обедают и ходят на планёрки, но как только они садятся за комп, они попадают в мир репозитория. Там кодеры физически обрабатывают шестерёночные поля кода, ловят баги; артисты физически в мастерских делают ассеты. А также есть мир игры, куда левел-дизайнеры носят ассеты, строят локации, а тестеры по ним ходят. Не буду сейчас вдаваться в остальные нюансы. Сосредоточимся на различиях.

В изначальной концепции мир репозитория представляет собой визуализацию работы системы. Между зданиями проложены дороги, по котором ездят машинки (job system) и перевозят ресурсы. Такой Anno-стайл менеджмент производственных цепочек. Плюс ещё есть река по которой проплывают кадры-корабли. Каждый кадр мы должны загрузить треугольниками, после чего он отправляется вниз по GPU Stream. Нагруженный кадр плывёт дольше. Опционально он ещё по пути должен перевернуть все треугольники в турбулентных потоках от вертексной мельницы и покрасить их вблизи пиксельной красильни. Так или иначе у нас корабли символизируют общий FPS системы, мы видим что тормозит: CPU или GPU, если корабли где-то накапливаются. Но в этой концепции загрузка кораблей становится центральным элементом геймплея. Причём FPS и нагрузка становятся общими для всех тестеров. Либо надо как-то чередовать корабли кадров, или делать какие-то оверлеи (и тогда всё становится запутанным и визуально перегруженным).

Во второй концепции я подумал, а что если локации — это здания-павильоны в том же пространстве? Тестеры и кодеры ходят рядом, больше экшена происходит в одном месте. Оверлей тоже можно сделать, но который наоборот скрывает, а не добавляет: репозиторий заменяется на море, а всё что мы видим — это игра в виде островов (чисто на случай если хотим полюбоваться самой игрой). В этой метафоре как будто возникает больше пространственных конфликтов размещения (сама игра vs технические помещения и коммуникация вокруг). И больше упор на людей, которые кранчат, а не на машинки и симуляцию программы.

Что думаете?

Главная дизайн-проблема у меня сейчас это то, как придать каждой игре уникальность. Чтобы игра была нечто большее, чем просто сумма локаций и ассетов. Есть идея как-то превратить это в пространственный пазл, но не до конца оформленно в голове.
  • 👍 4
  • 🐳 2
  • 👎 1
Post #267 1.02K
  • 👍 3
Post #266 1.09K
Только что осознал, что прошлый раз, когда я серьёзно озадачивался вопросом создания тайловых текстур, был БОЛЕЕ 20 ЛЕТ назад. Вот эти файлики с тех времён. Когда я сам руками заделывал швы в каком-то примитивном редакторе.

И вот мы снова здесь. Всю ночь изучал, чего новенького с тех пор появилось в этой области: читал пейперы, пробовал либы всякие. Нейронки — это, конечно, хорошо; гигантские тулзы для художников — тоже. Но всё-таки хочется удобную тулзу с минималистичным GUI, заточенным под плитку wang'а и API для массовой обработки. Похоже, придётся самому писать.
  • 👍 9
Post #264 2.23K
Я влюбился в геометрическую алгебру

2026 год начался во многом с подтягивания математики. То ли на фоне наступления ИИ-шки меня потянуло на фундаментальные знания, то ли в преддверии моего скорого перехода на движок*, но так или иначе уже пару месяцев как очередное обострение.

Они у меня случаются периодически, но в основном я долблюсь в какую-нибудь из балдёжных физик (кванты, космология, СТО/ОТО), ни одной из которых у меня не было в универе, но разобраться очень хочется. В случае с квантами долблюсь обычно не очень успешно, потому что местами не хватает математической подготовки.

Один из очевидных пробелов — абстрактная алгебра, который я стал закрывать книгой Чарльза Пинтера. Я, конечно, пока не добрался до алгебр Ли, но дико кайфанул от первой половины книги: теории групп и немножко колец. Интересно, что я учусь вместе с чатомЖПТ, задавая ему вопросы по непоняткам. На типовые вопросы он отвечает прям хорошо: таблицы Кэли рисует, находит подгруппы, факторизует. На более экзотических структурах (лупы, моноиды) люто галлюцинирует, но по основному материалу с таким помощником учиться одно удовольствие. Хз, как будет выглядеть высшее образование через 10 лет, потому что уже даже для тупых вопросов препод-человек не особо нужен.

***

Но хватит уже про абстрактную алгебру. Она классная, но не главная в этом посте. Этот пост — признание в любви геометрической алгебре. Моё первое знакомство с ней началось с интерактивной статьи про роторы: Let's remove Quaternions from every 3D Engine. И я не перестаю пиарить её при каждом удобном случае. Серьёзно, почитайте, если ещё не видели — это прям eye-opening.

Во многом эта статья вдохновила меня на написание моей статьи про матрицы. Я её, кажется, так и не показывал здесь? Несмотря на то, что я потратил кучу времени на интерактивные иллюстрации и даже выступил с этим докладам на внутренней конфе парадокса, я так и не доделал текстовую версию. Но презентация доступна. Посмотрите что ли. Зря что ли делал?

Но в этом году я решил более серьёзно разобраться с геометрической алгеброй по книжке МакДональда. И сказать, что я очарован, это ничего не сказать: она не только сводит dot и cross к одной операции, не только объясняет повороты без привлечения 4D, но и обобщает в целом комплексные числа и кватернионы. Совершенно казалось бы разные вещи из разных разделов математики внезапно сводятся к одному и тому же и выводятся буквально из одной операции. Просто катарсис. Геометрическая алгебра — ты моя Валентинка ❤️

Многие спросят, если она такая крутая, то чё её никто не использует? Почему ни в одном движке её нет? А дело в том, что классическую линейную алгебру тупо знает больше народа. Она появилась гораздо раньше и входит в стандартный университетский курс. Линейная алгебра давно и прочно занимает одно из самых центральных мест в математике (наряду с матанализом), на её языке работает половина науки от квантовой физики до экономики.

Геометрическая алгебра, напротив, появилась сравнительно недавно, и это по сути другой язык. И на нём не так уж много материалов для начинающих. Обычно статьи с применением геометрической алгебры уже предполагают, что вы знаете предмет в терминах линейки. Но как же всё становится проще и осмысленнее в геоме. Одним словом, КРАСОТИЩА.

И да, я знаю, что это всего лишь алгребра Клифорда, и очарование потом у многих проходит. Но, чёрт возьми, дайте насладиться влюблённостью, я в своей геометрической фазе.

***

Разумеется, я ещё по мелочи затыкал более мелкие дыры всякими ютуб-плейлистами на разные темы. Из наиболее существенного: я наконец-то разобрался с дуальным пространством (для этого пришлось немного залезть в тензоры). А ещё было приятно найти видос у 3Brown1Blue, объясняющую формулу эйлера ровно тем же способом, как я её себе объяснял в древнем посте.

* — ну и да, если в апреле сдадим крупный майлстоун, то я на годик по обмену схожу в команду движка. А там дальше видно будет.
  • 👍 42
  • 🐳 1
Post #262 2.51K
Ребята из "Пилим, Трём" сняли мини-фильм памяти Кранка. Туда же в качестве бонуса вошло и моё интервью с Андреем 2013 года, которое я упоминал в прошлом подкасте.

Кранк был важным человеком в моей жизни. Я пришёл к нему в студию уже опытным разработчиком, но всё равно воспринимал его как своего "геймдев-папу".

Посмотрите. Душевное.

https://www.youtube.com/watch?v=7Ea9NfH73Ss
YouTube Парадигмы Кранка. Памяти Андрея Кузьмина Всем привет! Сегодня у нас необычный выпуск. Есть гости которых позвать в подкаст уже абсолютно невозможно. Андрей Кранк Кузьмин трагически ушел из жизни 5 ноября 2022 года в автомобильной аварии. Большая потеря для всех нас и разработчиков и игроков. Идея…
  • 👍 7
  • 😭 6
  • 🐳 2
Post #260 2.16K
Сходил на подкаст ПИЛИМ, ТРЁМ. Обсудили моё движкописательство, пет-проекты и литературные конкурсы. Внутри также стандартный набор моих баек, немного старческого нытья и заметные страдания от подбора слов на русском. Но вроде как пообщались душевно.

Уточнение: на момент записи я был в процессе получения апрува на пет-проджект. Уже всё есть официально. Кранч Хаусу быть!

https://www.youtube.com/watch?v=uy7LLyoOtKA
YouTube Александр Тужик - хочу и буду: пишу движок для игры Всем привет! Сегодня у нас в гостях Александр Тужик, разработчик с большим опытом. Саша рассказал про работу в Paradox, участие в литературных конкурсах и разработку симулятора геймдева на своем движке! Заваривайте черный чай с чабрецом и прихватите тыквенное…
  • 👍 9
  • 🐳 1
  • 😭 1
Post #258 2.17K
Тяжёлые выборы #2

С днём, когда моё MS-бойство серьёзно пошатнулось.

Несмотря на то, что я сейчас пишу исключительно под винду и только на DirectX12, я в итоге перешёл во многом на OpenGL конвенции: Right-handed координаты и Bottom-left текстуры.

Да-да, это ещё один пост про чёртовы оси, и я их снова изменил.

Во всех бедах я по-прежнему продолжаю винить Сильвестра Лакруа и прочих составителей учебников по математике 18 века, повадившихся рисовать ось «Y» вверх. Именно они обрекли многие поколения школьников на страдания, всякий раз когда им требуется теперь отступить место для графика в школьной тетрадке.

А ведь у них была историческая возможность развернуть «Y» вниз, и тогда бы это удобно встраивалось в европейское письмо слева-направо и сверху-вниз (а положительные углы шли бы по часовой стрелке). А ведь направление письма сверху-вниз определило ещё и направление скроллинга страницы, и направление обновления монитора, а это, в свою очередь, повлияло и на систему координат большинства графических редакторов и файловых форматов.

Но увы. Они решили направить ось ординат наверх, и это во многом предопределило разброд и шатание по вертикале между DX и GL, между GUI и World Space.

Моя приверженность левосторонней системе координат и TopLeft-текстурам произрастала из приоритета консистентности над математичностью. Мне важно, чтобы мировые координаты росли туда же, куда и текстурные. И чтобы «X» вёл себя точно так же, как и «Y»: нет ничего более раздражающего, чем флип только одного компонента. А поскольку координаты графических редакторов (Paint, Photoshop) это своего рода данность, то я подсознательно выстраивал всё остальное под них.

И до поры до времени я был готов мириться с тем, что это нематематично: ну, подумаешь, повороты в игре будут идти в другую сторону. Задокументировать и забыть. Но я сдался на утилитах для 2D геометрии. Функции типа «площадь под кривой» или «IsClockwise» для многоугольника обычно предполагают, что мы смотрим на оси как принято в математике. Но если в моём движке большую часть времени мы смотрим на оси с обратной стороны (X — вправо, Y — вниз), то либо надо функции переименовывать, либо всегда держать в голове, что их значения перевёрнуты для геймплея. И всегда нужно помнить, где именно инвертировано внутри, а где — предполагается инвертировать на выходе. Это просто невозможный оверхед, который непременно приведёт к путанице, и к тому, что ты сам в какой-то момент перестанешь доверять названиям собственных функций.

Масла в огонь добавило то, что большинство DCC экспортят увишку по умолчанию как Bottom-Left и то же самое предполагает MikkTSpace — по сути стандарт тангент-спейса.

И тут я снова задумался: а такая уж ли данность координаты графических редакторов? Я большую часть жизни использую Paint.Net. Как оказалось, проект давно закрыл исходники, но у него есть open-source клон Pinta. Который, по моему мнению, начиная с версии 2.0 тоже пошёл куда-то не туда, уродуя интерфейс. Но в общем я форкнул себе старую версию Pinta и перевернул там отображаемые координаты. И жить сразу стало веселее.

DirectX я тоже перенастроил так, чтобы он как будто нативно был Bottom-Left. Для этого я переворачиваю текстуры при загрузке и ставлю отрицательную высоту у вьюпорта при рендере-в-текстуру. И получается, что он семплит и рендерит как будто по правилам OpenGL, не нужно ничего флипать в шейдерах. Всё растёт в одном направлении, всё консистентно.

Уж не знаю, делает ли так кто-нибудь ещё: обычно все переворачивают текстуры в OpenGL, чтобы они были как в DirectX, а я вот сделал наоборот всё. В RenderDoc, конечно, всё отображается вверх-ногами, но там, слава богу, есть кнопочка отзеркалить изображение.

А ещё у меня всё ещё Z-up. Надеюсь это менять не буду. Господи, когда же я уже буду игру делать, а не оси вертеть туда-сюда?
  • 🤣 24
  • 👍 12
Post #256 1.91K
Последнее время активно работаю над движком для Crunch House. Пока занимаюсь всякими техническими штуками: Deferred Shading, MSAA, Тени. В планах как минимум ещё TAA, Motion Blur, Bloom, SSAO, SSR. Возможно, для виртуального мира игры эти настройки нужно будет разблокировать по мере улучшения движка, который надо будет создавать в самой игре.

Дошёл вот до создания персонажей. Референс это в первую очередь RimWorld и Prison Architect, но скрещенный с Portal Bridge Construction. То есть я хочу такие же простые 2D-силуэты, но реально торчащие в 3D, с некоторой толщиной и отбрасывающие корректные тени.

Думаю, какой подход подойдёт лучше: либо генерить настоящую геометрию, либо квад с Alpha-To-Coverage.
Настоящая геометрия хорошо подходит для создания туловища, круглой головы и рук. Но вот для всяких пропсов и причёсок генерировать геометрию из изображения не так удобно. Квад с прозрачностью, конечно, сильно проще, но тогда сложнее сделать нормальную толщину. Что думаете?
Post #254 1.96K
Проблема праворукой системы координат в том, что даже если определиться, какая ось смотрит вверх, там существует ещё куча вариантов с лево/право и вперёд/назад.

Тим Суини на днях твитнул, что Unreal Engine будет переезжать с координат FRU на LUF. Типа, Right-handed Y-up это стандарт в индустрии. Ну не знаю, насколько это прям стандарт. Тем более именно LUF. По мне так лучше уж RUB выбирать. Он вроде чаще используется в приложениях, если ноги из OpenGL растут.

Иронично, но я в своём движке буду занимать квадрат Анрила теперь в одиночку, хе-хе
  • 👍 3
Post #252 3.24K
Иронично, но изначально я считал схему Unreal одной из самых упоротых, но по итогу сам к ней пришел.

Но зато я остался верен более нативной для DX левосторонней системе координат. Как видите, microsoft-бой однажды — навсегда microsoft-бой.

Ну и, кстати, забыл упомянуть одну из самых главных киллер-фич левосторонней системы: я правша. А это значит, что когда у меня в руке мышь, левой рукой гнуть пальцы банально удобнее. Впрочем, надо бы обзавестись распечатанной на 3D-принтере гизмой осей.
  • 👍 8
  • 👎 1
Post #251 2.59K
3. Чтобы достичь этого, я расположил X на восток, а Y на юг. Получилась довольно упоротая комбинация Right-Back-Up. По крайней мере я никогда такую не встречал. Какое-то время я пытался привыкнуть к такому расположению, но здесь ровно та же проблема, почему я ненавижу систему координат Godot или XNA: Back это положительное направление.

По моему глубокому убеждению, положительными осями должен быть Right, а не Left; Up, а не Down; и особенно, мать твою, Forward, а не Backward. Сколько бы я не смотрел код чуваков, у которых Z+ это back, там всегда какое-то упоротое двоемыслие начинается. То они направление на камеру называют Forward вместо Back, то выворачивают гизмо наизнанку, чтобы синяя палка в негативную сторону смотрела. Словом ты уже не знаешь, чего ждать и кому верить. Да и в целом во всех формулах с участием Z уродский минус появляется, о котором надо постоянно помнить. Лучше его в кодобазу вообще не впускать. Только плюс, только вперёд.

4. И тут (после мучительных качелей туда-сюда), я в итоге пришёл к анриловской схеме Forward-Right-Up. Дефолтное положение камеры становится -90°, но зато исчезает проклятый минус. Бонусом, по умолчанию все объекты становятся ориентированы forward-ом на восток, а не север. Что, типа, более привычно, так как 0° в школьной тетрадке мы рисуем вправо.

Буквально единственный недостаток, который я в этом во всём вижу, это то, что углы будут считаться по часовой стрелке, а не как на уроке математики. Но всё GUI и многие 2D игры зачастую работают с такими углами, и ни у кого жопа не отваливается. Учитывая, сколько других проблем это решает, это довольно малая жертва.
  • 👍 12
  • 👎 1
Post #250 1.81K
Тяжёлые выборы #1: чёртовы оси

В разработке своего движка иногда нужно делать такие выборы, которые со стороны кажутся плёвыми и не особо важными, а на деле их не так-то легко и сделать.

Типичный пример — это кодстайл. Любой дурак знает, что не важно, какой он, главное, чтобы он был один и везде. Но обычно такого выбора и нет — мы просто юзаем тот стиль, который уже есть на проекте или в движке. И совсем другое дело, когда перед тобой действительно стоит полная свобода выбора: тебя начинает метать из стороны в сторону, как сумасшедшего. Потому что это повлияет на то, как ты будешь писать код всю дорогу и это будет не данное упавшее свыше, а твоё собственное решение. Хочется сделать удобно, чтобы не жалеть потом.

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

1. Изначально я положил XYZ самым привычным для себя образом: Right-Up-Forward. Так было по умолчанию в классическом DirectX, так сделано в Unity и так сейчас у меня на работе (Clausewitz engine). Это также NDC в большинстве GAPI (кроме вулкана), так что это такой крепкий default для 3D.

Но мой движок в первую очередь предназначен для TopDown игр, а Y-up, как известно, не очень для этого подходит. Я уже делал TopDown игру в такой системе координат (Encased на Unity) и это влекло за собой некоторое количество неудобств:

Во-первых, чтобы не заниматься постоянной перестановкой y и z из Vector2 в Vector3 и обратно, боясь рано или поздно опечататься, мне пришлось завести довольно искусственный VectorXZ и использовать везде его. Он абсолютно такой же как Vector2, но с полями xz вместо xy.

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

2. Первый логический шаг по улучшению ситуацию — это перейти на z-up, как в Blender. VectorXZ больше не нужен. Вращение по честному начинает идти против часовой стрелки. Красота!

Но я не захотел на этом останавливаться. В получившейся схеме меня бесит, что Y-координата моей тайловой карты смотрит на север, и это не совпадает с тем, как работают координаты в TextureSpace и ScreenSpace. Не знаю, как вас, а меня бесят эти бесконечные перевороты текстур по вертикали. Я хочу работать с тайловой картой по правилам GUI: прибавлять Size спрайта целиком в положительную сторону. Потому что когда нужно прибавлять Width, но отнимать Height — это чистой воды дичка.
  • 👍 4
  • 👎 1
Post #249 1.78K
  • 👎 1
Post #248 1.82K
  • 👎 1
Older posts →

About this channel

How can I read @logofalprog without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Log of Alprog: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Log of Alprog have?
Log of Alprog (@logofalprog) has 1.15K subscribers on Telegram, refreshed roughly every 30 minutes.
Does Log of Alprog know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →