All streams
Search
Write a publication
Pull to refresh
505
217.4
Sergei Kushnirenko @dalerank

Люблю (ш)кодить, алгоритмы и старые авто.

Send message

Записки ездового кота

Level of difficultyEasy
Reading time8 min
Views6.6K

Подводя итоги второго десятка лет программирования на плюсах в самых разных областях, от гидроакустики и систем контроля доступа, до портирования старого софта и разработки игр, оглядываюсь назад и в памяти всплывают разные истории из жизни, иногда глупые и смешные, иногда пугающие и мистические. Но всегда настолько запоминающиеся, что их цвета не поблекли за давностью лет и сейчас. Сам удивляюсь, как у рядового программера набралось их так немало.

Поехали...

Новый дом для Фараона (Pharaoh)

Level of difficultyEasy
Reading time8 min
Views6.3K

Я давний поклонник сити‑билдеров компании Impressions Games © и Саймона Бредбури, если кто не знает — его гений дал жизнь таким играм как Caesar 1/2/3, Space Colony и всей серии Stronghold, который по сей день трудится в студии Firefly Studios. Цезарь стал хитовым проектом и был продан более чем 400к копий на дисках за два года с 1998 по 2000. Но лучшей игрой серии считается Pharaoh + Cleopatra.

click to start

Зачем в Switch SDK три разных sin?

Level of difficultyEasy
Reading time8 min
Views9.6K

Работая в компании Gaijin несколько лет назад, мне довелось поучаствовать в портировании пары игр компании на консоль Nintendo Switch, тогда вовсю завоевывающую новые рынки. Для меня это стало первым крупным проектом на этой платформе. А с учетом, что ни команда, ни разработчик движка с платформой, системой сборки и вообще экосистемой Нинтендо знакомы не были, то все грабли приходилось искать и бережно на них наступать. Чтобы опробовать возможности новой платформы, параллельно с портированием игры, был написан внутренний middleware (связка dagor engine + nxsdk + jam) и код обрастал всевозможными тестами, build matrix, бенчмарками, прогоном стабильности и другими внутренними проверками. Надо отметить что на момент 2018 года, в самом switch sdk не было реализовано часть posix функций вроде poll и send/receive, и большая часть функций для работы с файлами, posix прослойку нужно было писать самим. Дошли тогда руки и до написания различных бенчмарков для функций стандартной библиотеки, и были замечены некоторые аномалии в поведении части тригонометрических функций в различных режимах сборки. Для справки, sdk использует урезанный вариант musl libc (https://www.musl-libc.org/), все статически линкуется в один большой бинарник clang'ом от Нинтендо 9 версии (2018 год), который потом запускается на консоли. Доступа к исходникам самой libc в исполнении Нинтендо у нас не было, но всегда можно посмотреть дизасм и боле менее представить что происходит.

Раскопки на месте

Имя enum'a C++ в рантайме

Reading time10 min
Views7.6K

Получение имени типа, не важно это структура или перечисление, в C++ — проблема. То, что тривиально известно компилятору на этапе парсинга исходников, не получится перевести в человеко-читаемый вид в рантайме. Можно использовать std::type_info::name, который не является переносимым решением, потому что зависит от реализации манглинга в компиляторе. Некоторые компиляторы (например, MSVC, IBM, Oracle) создают "удобное" имя типа, а вот gcc и clang, возвращают искаженное имя, котороe можно преобразовать в удобочитаемую форму с помощью дополнительных функций, например abi::__cxa_demangle. Чтобы вся эта магия работала нужно подключить RTTI, который тоже не всегда доступен, а иногда и вообще-то вреден, потому что сжирает драгоценную производительность, но можно сделать по другому.

follow the white rabbit

Кручу, верчу, imgui loader нарисовать хочу…

Reading time7 min
Views8.5K

В одном из сайд-проектов с использованием imgui понадобилась "вертячка" (loader, spinner, анимация загрузки). Из коробки этот ui-фреймворк таких виджетов не предоставляет, поэтому решил сделать свой: код простой, математики почти нет. Показал ocornut-y, ему тоже понравилось, теперь базовый виджет на очереди интеграции в imgui. Поискал интересные спинеры на разных сайтах для веб-интерфейсов - десятки видов на любой вкус и цвет, есть и 3д, но все в основном или пререндеры в виде (gif) или векторные анимации, которые для отрисовки требует отдельного фреймворка вроде cairo, а алгоритмов или описания как это работает, почти нет. Все спинеры сделаны в стиле "что вижу, то и пою", немного математики синусы/косинусы для координат, и тестировать пока не будет похоже на решение от UI дизайнера. Да-да, я понимаю, что когда космические корабли бороздят просторы большого театра DALL·E 2 рисует "улыбку мадонны", писать что-то на плюсах, да еще для UI...

Много анимаций, мало кода

Торопиться не надо… (Про спинлоки)

Reading time13 min
Views17K

После небольшой статьи про особенности при работе с кэшем (https://habr.com/ru/post/687146/) мне в личку прилетело несколько замечаний про работу спинлоков и приглашение на собес от пчелайнов, приятно, что технические статьи читают не только технари... лирика. Возвращаясь к обсуждению спинлоков, вышедших за рамки хабра, если это вызвало интерес, почему бы не написать про работу с этими примитивами синхронизации. Тема действительно интересная, да и разработчики придумали более десятка разновидностей спинлоков под разные вкусы и нужды. Все опять будет с тестами и примерами работы. @tbl Линус действительно прав, в юзерспейсе спинлоки "зло злющее", но как обычно есть нюансы...

Читать далее

Cache pollution? Запасайтесь тестами

Reading time16 min
Views11K

Всем ведь приходилось заниматься улучшением производительности? Для игр особенно актуально, ну может какая-то три-в-ряд не страдает этим. Как обычно серебряной пули нет, начинаем со структур данных, алгоритмов, спускаемся ниже если не помогает, придумываем SoA, AoS шаблоны. Если проблема не решается, подтягиваем профайлеры и предметно разбираем узкие места, но все чтобы мы не делали зачастую таким узким местом всегда будет "железо". Можно сколько угодно оптимизировать другие места, но CPU c его гигагерцами будет простаивать 90% времени если его неправильно "кормить" данными. Одной (только одной из проблем) проблемой организации эффективной работы с данными будет меньше, если знать и уметь работать с кэшами разных уровней. Тут на вики описано, как "на пальцах" быстренько убить перф на обходе массива, простого и общего решения для такого обхода нет. Можно и дальше увеличивать размер кэша, что собственно и делают (гдето здесь на хабре была новость, что Интел при переходе на L1 кэш размером 32кб, заново спроектировал блок доступа к нему, сорян не нашел ссылку), но это дорого, неэффективно на масштабах современных процов, и всегда найдутся данные, которые этот кэш отравят, опять. Интересно как починить? го под кат...

Читать далее

Анастасия, извините, наболело…

Reading time2 min
Views19K
Наверное любая большая компания, с большим объемом найма, пытается привлечь новых сотрудников разными способами, это скорее всего подразумевает большое количество HR-спецов. Пропорционально растет и шанс того, что какой-то из них дико «лажанет» с неподходящим кандидатом. Думаю, это просто вопрос времени… Уважаемые hr'ы, ну загляните в профиль того человека, к которому обращаетесь, перед отсылкой спама. К вам ведь будут относиться также, и даже если не к вам лично, то к фирме, приславшей такое, уважения у потенциального кандидата точно будет меньше. Надеюсь у компании, в которой собрались лучшие IT-профессионалы восточной Европы, найдется возможность сделать своих HR не менее профессиональными.

Читать дальше →

Timetracker для Youtrack: DIY

Reading time5 min
Views4.5K
Есть замечательное приложение T-REC позволяющее трэкать время, потраченное на задачи в Youtrack, и записывающее его в таску. Но автор забросил его больше двух лет назад, плюс старые зависимости, постоянная загрузка одного ядра (тут видимо виноват electron) и периодические падения привели к тому, что пользоваться им стало «неудобно». Решил написать свой, с тем же функционалом, только на плюсах, так появился Honsu…


Читать дальше →

Когда хочется красивый GUI, а gpu нет

Reading time3 min
Views18K
Обычно для рабочих утилит не требуется вменяемый UI, с кнопками, списками, окнами, поддержкой мыши и прочей мелочевкой, большинство рабочих «хотелок» можно упаковать в скрипты и иногда запускать их с параметром --help, и так будет даже правильней с точки зрения настройки и масштабирования. Все становится хуже, когда тулами начинают пользоваться не только команда разработки, но и сторонние люди. А они не всегда готовы вникать в стройные мысли, уложенные в строчки кода. И тогда приходится городить UI, а он у разработчиков выходит обычно простой, квадратный, функциональный и совсем скучный. Некоторое время назад я работал над небольшой системой управления вентиляцией/обогрева/камерами и еще того «что придумает вон тот дядечка в желтой каске» для подземной автостоянки.


Читать дальше →

Caesar3 все таки open

Reading time2 min
Views21K


Некоторое время назад, примерно с 2008 года, у меня был хобби-проект по воссозданию довольно знаменитого конце ХХ века ситибилдера Caesar III ©, в процессе работы над игрой был написан ряд статей по механике игры и её внутреннему устройству (например эта).
Дайте же сорцы, наконец

Caesar III: game loop

Reading time27 min
Views69K
Если бы меня спросили, какая часть технической реализации игры «Цезарь» мне интересна больше других, я бы вспомнил о расчете одного «дня» городской жизни. Отдельные компоненты математической модели города тоже интересны в реализации, но эти «шестеренки» будут крутиться только в сборе. Большая часть игры проходит внутри «игрового цикла», в котором проводятся вычисления параметров компонентов, выполняются перемещения игровых объектов, создаются новые события и объекты. Если вам интересно узнать, как была устроена симуляция города в одной из лучших игр 1998 года — добро пожаловать под кат. Описания, псевдокод и схемы помогут вам лучше узнать об используемых алгоритмах.


Читать дальше →

Ремейк Caesar III: математическая модель города

Reading time6 min
Views68K
Я помню как играл первый раз в Цезарь 3, это удивительно умная и сбалансированная игра, создает чувство, что город живет своей жизнью и после завершения миссии. Можно провести часы, наблюдая за городом и не вмешиваться в его жизнь: плебеи будут бегать по городу в поисках работы, а патриции жаловаться на неважные условия жизни, торговцы, школьники, лодки, жрецы — этот мир замирает лишь в минуты пауз, давая игроку возможность продумать следующий шаг. Исследуя внутренние алгоритмы игры, я не перестаю удивляться с какой точностью авторы сложили кусочки мозаики, под названием «баланс». За время, проведенное над восстановлением кода оригинальной игры скопилось достаточно материала по макромеханике игры, которым я хочу поделиться с хабрасообществом.


Plebs are needed!

Да будет брошен жребий ©

Reading time1 min
Views6.9K
Приветствую хабражителей.

Я думаю, многие из вас читали мои статьи по реверсу цезаря (тыц, тыц, тыц, еще одна и про андроид), мне действительно нравится эта игра, и желание запускать ее на современных компьютерах побудило меня заняться исследованием, а впоследствии и программированием своей реализации. И хотя сейчас есть оригинальный цезарь на gog.com, и проблема запуска на современных PC была решена, я ушел чуть дальше, и сделал порт на linux, mac, android и haiku, в планах портировать и на другие платформы: так маленькое хобби выросло в полноценный проект.

Но, конечно, не все так просто, начали писать владельцы марки. Мой проект был и дальше останется некоммерческим и open source, но для запуска ремейка нужны текстуры оригинальной игры (т.е. сначала нужно купить у них), все равно договариваться они не хотят ни в какую.
И сейчас я стою на распутье — плюнуть на годы труда или рискнуть довести идею до ума и возможно сделать что-то прекрасное. И если программирование я уж потяну сам — без дизайна жить не сладко, энтузиастов кисти и карандаша пока не нашлось.
В итоге я планирую запустить кампанию на indiegogo, в которой хочу собрать средства на создание игры в духе цезаря, с новой графикой, с возможностью подключения старых кампаний от оригинальной игры. Хотелось бы получить мнение сообщества — продолжать ли дело? Имеет ли смысл затевать все это или заняться более земными вещами?


Обсудить

Портирование любимой игры под Android

Reading time12 min
Views153K
Создание игры процесс захватывающий и познавательный. Особенно это заметно, когда ремейк «классики» делаешь сам, руководствуясь идеями оригинала и десятками часов, потраченных на прохождение кампании. У меня не было сколь-нибудь значимого опыта разработки для Android'a, поэтому создание работающего «как надо» приложения для планшета поначалу выглядело довольно туманно, но от этого не менее притягательно. При наличии времени и возможностей, можно стряхнуть пыль со старых игр, подмазать и подклеить, добавив поддержку «больших» разрешений и окажется, что они выглядят не хуже современных продуктов, выложенных на маркете, даже с палитрой RGB565 без альфа-канала. Я предполагал, что будут подводные камни и заботливо спрятанные грабли, которые лежат тихонько во время разработки, но больно лупят по голове, стоит запустить игру на реальном железе. Чего сильно не хватало, так это отладчика, а возникающие проблемы лишь укрепили желание достичь поставленной цели. Под катом будет рассказ о том, как это все заработало.

image
Ave, Caesar

Генерация больших карт в ремейке игры «Caesar III(с)»

Reading time3 min
Views30K
Если вы любитель игры «Caesar III», то наверняка замечали то, с каким старанием и вниманием к мелочам сделаны карты кампании, да и свободного режима тоже. Природные пейзажи, на которых игрок возводит «новый Рим», выглядят вполне реалистично (в рамках игры): ручейки впадают в реки и озера, реки текут через всю карту, а в лесах бродят «бессмертные» овцы, иногда забредая на луга и мешая строить фермы, чайки кружат над местами скопления рыбы, а иногда по реке проплывает неудачливый моряк на останках корабля. Скальные массивы окружены деревьями, а земля покрыта ковром сочной зеленой травы. У всей этой чудной картинки есть недостаток, размер карты не превышает 160х160 тайлов, в статье я расскажу как сделал генерацию карт больших размеров.


Все дороги ведут в Рим

Продолжаем разбирать Caesar III© (Игровая механика)

Reading time15 min
Views100K
Алгоритмы получения текстур игры Caesar III© и отрисовки города разобраны, осталась самая «сладкая» часть, которая притягивает «древнеримских архитекторов» уже больше 15 лет — игровая логика. Используя различные подходы к анализу игры, выношу на ваш суд результат этого небольшого исследования. Я заранее прошу прощения за большую статью, но, как говорится, слов из песни не выкинешь. В заключении будет несколько слов о судьбе исходников, восстановленных из исполняемого файла оригинальной игры.


Все гениальное просто

Reverse-инжиниринг Caesar III (часть 2, Рисование города)

Reading time4 min
Views45K
Надеюсь, предыдущий пост Back-инжиниринг Caesar III, где был описан алгоритм получения текстур из ресурсов оригинальной игры, был благосклонно встречен хабражителями. В этой статье я опишу формат карт, алгоритм выбора и порядок тайлов для отрисовки, формирование итоговой текстуры.



Как это устроено

Back-инжиниринг Caesar III

Reading time11 min
Views73K
Мне нравится играть в игры, особенно в экономические стратегии, хочу рассказать про градостроительный симулятор из детства — Caesar III, как принято говорить, тёплый и ламповый. Игра была выпущена в 1998 году, знатоками своего дела, Impressions Games. Это экономический симулятор управления древнеримским городом в реальном времени. Через много лет я решил вновь пройти её, а затем постараться продлить удовольствие от игры, посмотреть ресурсы и вникнуть в игровую логику с точки зрения программиста.

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

Посмотреть, что под капотом

Information

Rating
24-th
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Game Developer
Senior
From 300,000 ₽
Git
C++
Multiple thread
Applied math
OOP