Статьи
-
Курс · C++
Что делают new и delete
Чем выражения new/delete в C++ отличаются от malloc/free: вызов конструктора и деструктора, оператор new/delete и работа с сырой памятью — с разбором ассемблера. Бесплатный урок из курса «С++ без аллокаций памяти».
-
Курс · C++
Как работает vtable
Как компилятор C++ реализует виртуальные функции: скрытый указатель vptr, таблица vtable и динамическая диспетчеризация — с ручной реализацией механизма на указателях на функции. Бесплатный урок из курса «С++ без аллокаций памяти».
-
Курс · C++
Ассоциативные контейнеры STL
Ассоциативные контейнеры STL: set, map, multiset и multimap — чем отличаются, когда ключи уникальны, а когда повторяются, с короткими примерами. Бесплатный урок из курса «С++ без аллокаций памяти».
-
Курс · C++
Компромиссы кучи и стека
Куча против стека: детерминированность, фрагментация, размер бинарника и потребление памяти — почему в играх и на консолях выгодно минимизировать кучу. Бесплатный урок из курса «С++ без аллокаций памяти».
-
Ненормальное программирование
Как «ужать» мегаполис до размеров iPhone 4
Инженерная изнанка мобильной SimCity BuildIt: как в EA (и питерской студии EA SPB) затолкали десктопный ситибилдер в 100–300 МБ памяти айфона — server-authoritative экономика на таймерах, «глупый» клиент-терминал, батчинг и текстурные атласы, TBDR-рендер с превью-секторами, вырезанная симуляция и пробки-спрайты, электричество через Capacity − Demand и рынок-«доска объявлений». В конце — фотки с закрытия офиса EA в 2016.
-
Ненормальное программирование
Путеводитель по чужим STL
Обзор альтернативных «стандартных» библиотек C++ из игровых студий и больших контор: EASTL и её best practices, LLVM SmallVector/DenseMap, Folly и устройство fbstring (SSO, eager copy, COW и связка с jemalloc), boost flat_map, сериализуемые контейнеры Zmeya, Stlab от Adobe и value-oriented programming — зачем каждая появилась и где об неё можно больно удариться.
-
Ненормальное программирование
C++101 (Ч.1)
Каталог из ~100 идиом и приёмов C++, выросший из раздела Game++. Часть 1: ресурсы и компиляция — RAII, scope guard, copy-and-swap, smart pointer, copy-on-write, Pimpl и Fast Pimpl, interface class, include/inline/export guard, CRTP, Barton-Nackman, EBO и metafunction.
-
Ненормальное программирование
C++101 (Ч.2)
Часть 2: метапрограммирование и шаблоны — traits, tag dispatching, int-to-type, type selection, SFINAE и enable-if, member detector, policy-based design, type erasure, thin template, named template parameters, expression templates и result_of, плюс именованные и вычислительные конструкторы и base-from-member.
-
Ненормальное программирование
C++101 (Ч.3)
Часть 3: инициализация, полиморфизм и контейнеры — calling virtuals during init, construction tracker, NVI и thread-safe interface, acyclic visitor, covariant return types, virtual friend function, algebraic hierarchy, polymorphic value types, функторы, iterator pair, generic container, erase-remove, safe bool и attorney-client.
-
Ненормальное программирование
C++101 (Ч.4)
Часть 4: дружба, память объектов и современный C++ — non-member non-friend, SOO/SSO, prohibiting heap, execute-around pointer, temporary proxy, nullptr, move constructor, boost mutant, deprecate and delete, function poisoning, rule of zero/three/five, most vexing parse, pass-key и spaceship-оператор.
-
Ненормальное программирование
Как игровой GUI пишут заново (Ч.2)
Продолжение: архитектура игрового UI по шести независимым осям — расположение относительно мира (diegetic / HUD / meta / spatial / narrative, от Metroid Prime и Dead Space до Spec Ops и Hellblade), функция, хранение в памяти (scene graph, flat list, immediate mode, ECS), поток данных (MVC/MVVM, reactive, unidirectional, data binding), раскладка (constraint, flexbox, anchors, RIMD) и рендер (canvas, layer, SDF, GPU-driven). Часть 2.
-
Ненормальное программирование
Почему игровой GUI пишут заново (Ч.1)
Архитектура игрового UI и почему её переписывают из проекта в проект: дерево контролов как Composite, свойства с рефлексией, развязка с игровым кодом через биндинги, шаблоны-прототипы задолго до Unity Prefab, три уровня обработчиков, хит-тест по форме, синхронные сообщения, раскладка и 9-slice, целочисленные координаты, Bridge поверх рендера, стили как CSS, боль локализации, SDF-шрифты и диегетический UI (Dead Space, Doom, Metro). Часть 1.
-
Ремесло
Про «случайных» людей в ИТ
Ответ на тезис «без профильного образования в IT даже не думай»: история игровой индустрии как история юристов, домохозяек, лётчиков, капельдинеров и экспортёров консервированной фасоли. От Гэри Гайгэкса и D&D до Миямото, Иватани, Роберты Уильямс, Уилла Райта, Кодзимы, Молинье, Миядзаки, Нотча, Эрика Барона и Дэйви Вредена — люди без релевантного опыта, которые построили всё, во что вы играли.
-
Ремесло
Почему советские программисты не сделали GTA
Почему страна, проектировавшая «Буран», Ту-160 и атомные ледоколы, не сделала массовую игру уровня Запада: игра как большая инженерная задача, откуда берутся талантливые разработчики, арифметика на пальцах по соцблоку, глобальный «пылесос талантов» Кремниевой долины, обзор постсоветского игродева от «Тетриса» и «Вангеров» до S.T.A.L.K.E.R., Atomic Heart и War Thunder — и почему «русский Unreal» по щелчку не сделать.
-
Ненормальное программирование
Менеджер ресурсов
Почему менеджер ресурсов — это не синглтон, а целая подсистема движка: идентичность ресурса как пара «источник + параметры», кэш на слабых ссылках с LRU, явные и неявные параметры, точечная перезагрузка и hot-reload, восстановление после device lost от пулов D3D9 до DX12/Vulkan, общая шаблонная база менеджеров и смена настроек графики без рестарта — на примерах Unreal, Unity, Source, id Tech, Godot, No Man's Sky и Cyberpunk.
-
Ненормальное программирование
Архитектурные компромиссы в разработке игр
Большой разбор архитектурных паттернов и компромиссов в геймдеве: слои, метаслои, подсистемы, конвейер, микроядро и blackboard на примерах Source, CryEngine, Unreal, id Tech и Naughty Dog; стратегии проектирования (top-down/bottom-up/constant refactoring), ось push vs pull, скриптовые языки и переосмысление GoF в современном игровом C++.
-
Ремесло
Трое в лодке, нищета и собаки (с)
Честный взгляд на состояние игровой индустрии в 2026-м: инди на энтузиазме и опционах, сервисные проекты-казино, ремастеры ремастеров, миграция разработчиков в «дочерние структуры» ради зарплаты и профессия геймдева как искусство договариваться с самим собой — где мы все в одной дырявой лодке.
-
C++
Непослушный using
Почему using namespace и ADL делают поиск имён в C++ непредсказуемым: argument-dependent lookup и operator<<, перехват std локальной подменой, проверка пригодности функции (function viability), ранги неявных преобразований и почему =delete-функции участвуют в overload resolution как полноценные кандидаты.
-
Ремесло
Про 10x программистов
Существуют ли 10x программисты или это миф стартаперов и мечта менеджеров: пять реальных типов «быстрых» разработчиков — человек, сросшийся с проектом, тот, кто пишет меньше кода, DoItProperlyMan, узкая экспертиза и миф про фокус — и почему 10x всегда про накопленный контекст, а не про врождённый коэффициент.
-
Производительность
Как работают с памятью в игровых консолях
История архитектуры памяти игровых консолей от Atari 2600 до PS5 и Xbox Series: счёт тактов и бланки, дележ шины и DMA, быстрая-но-медленная RDRAM на N64, тайловый рендер Dreamcast, три острова памяти PS2, SPU и Local Store на PS3, унификация памяти на PS4 и SSD как новый уровень иерархии памяти.
-
Ремесло
Как не перепутать мечту, портфолио и вторую работу
Про пет-проекты в геймдеве: почему «проект на пару вечеров» превращается в годы жизни, чем обучение отличается от написания своего движка, почему маленькая библиотека выживает чаще амбициозного комбайна, цена C++ для хобби-проектов и как open-source незаметно становится второй работой.
-
C++
Простой поиск имён в C++
Простой (неквалифицированный) и квалифицированный поиск имён в C++: почему пространство имён и локальная переменная с одним именем сосуществуют, скрытие имён и целых перегрузок при наследовании, неоднозначность ромбовидного наследования, правило using namespace при квалифицированном поиске и исторические различия GCC, Clang и MSVC.
-
C++
Компиляторы тоже путаются в именах
Поиск имён в C++: идентификаторы, unqualified-id, qualified-id, template-id и «терминальное имя», история ADL (Koenig lookup) от проблемы с пространствами имён до решения Кёнига, двухфазный поиск в шаблонах и почему GCC, Clang и MSVC исторически вели себя по-разному.
-
Производительность
Лишние вычисления
Как спекулятивное выполнение и предсказание ветвлений взаимодействуют с подсистемой памяти: почему branchless-код не всегда быстрее, цена ошибки предсказания против задержек памяти, история от Томасуло до Pentium Pro, бинарный поиск и бенчмарки на Jaguar (PS4).
-
C++
Обобщения в C++ (часть 2)
Продолжение главы 1 PragmatiC++: идентичность и равенство объектов, процедуры и стек вызовов, соглашения о вызовах и категории in/out/in-out, вычислительная база от ENIAC до AMX и регулярность типов как практическое руководство по проектированию предсказуемых абстракций.
-
Производительность
Почему у нас нет кешей L5?
Почему в процессоре несколько уровней кэша, а не один большой: физика сигнала на кристалле, аналогия с ёлочными игрушками, история от i486 до Nehalem, зачем разделять L1I и L1D, протоколы когерентности (MSI/MESI/MOESI…), eDRAM и HBM как «скрытый» L4 и почему L5 пока не имеет смысла.
-
Ремесло
О радости программирования и невесомости достижений
Размышление разработчика, заставшего эпоху, когда код писали руками без ИИ-помощников: почему достижение, добытое слишком легко, кажется невесомым, как иишка убирает «полезное трение» и состояние потока, и в чём может быть новое мастерство программиста — в архитектуре и глубине решений, а не в скорости набора кода.
-
Ремесло
Писать код проще, чем книгу о том, как писать код
Как из цикла статей Game++ на Хабре выросла книга о прагматичном C++ и разработке движков: что такое «хороший» C++, люди, которые помогли книге случиться, редактура как отдельное ремесло и большой блок ответов на частые вопросы о написании и издании.
-
Производительность
Охота за красным fps
Профилирование игр как философия разработки: эволюция требований к FPS, как контент художников бьёт по перфу (геометрия, текстуры, рендер, кулинг), методы профилирования — сэмплирование, инструментирование, трассировка, event-based, статический анализ и реплеи — и устройство трассирующего профайлера с zero-allocation архитектурой и строками-хендлами.
-
Ремесло
Почему универ не готовит программистов
Почему классическое университетское образование не делает из студентов программистов: преподаватели без реального опыта, замкнутый круг зарплат, программирование как практический навык вроде игры на гитаре, менторство в студиях и почему программистами становятся через самообучение.
-
Ремесло
Не паникуй, ты просто попал в AA+ игрострой
Как не паниковать, попав в большую AA+ студию с кодовой базой на миллионы строк: ориентирование в чужом легаси, системы сборки, почему сеньоры не помнят код наизусть, поиск по видимым пользователю строкам, история git, кодстайл и почему исходник — последняя инстанция истины.
-
Ненормальное программирование
Мифы, суеверия и народные мудрости в разработке игр
Разбор 12 распространённых «истин» геймдева на C++ — где миф, где суеверие, а где народная мудрость: культ чистого C, «плохой хороший билд», цена исключений и RTTI, умные указатели и STL-контейнеры, полиморфизм, inline-ассемблер, template bloat, преждевременная оптимизация и проклятье пятничного коммита.
-
Ненормальное программирование
Зоопарк строк в вашем C++ коде?
Большой обзор строковых типов C++ как зоопарка зверей: char* и char[N], строковые литералы, std::string и SSO, string_view, pmr::string, QString, NSString, std::wstring, frame-строки, FString из Unreal, StringAtom и интернирование, COW-строки и StringID на хеше — и где какой тип уместен в игровых движках.
-
Производительность
Хороший, плохой, цветной и быстрый
Ненормальные аллокаторы памяти из практики: аллокатор с отслеживанием времени жизни объектов для поиска утечек, рандомизирующий (chaos) аллокатор для стресс-теста долгоживущих систем, «цветной» аллокатор для изоляции подсистем (на примере Deathloop) и быстрый TLSF — с диаграммами и бенчмарком по циклам процессора.
-
Ненормальное программирование
Сам себе breakpoint
Как устроены программные и аппаратные точки останова: подмена байта на int 3 (0xCC), отладочные регистры x86-64 DR0–DR7 и формат DR7, условные, функциональные и временные бряки, watchpoint на запись через GetThreadContext, «буферная канарейка» и кнопка hardware breakpoint прямо в редакторе игры на ImGui.
-
Геймдизайн
Почему Фараон остаётся лучшей игрой в серии
Почему оригинальный Pharaoh (1999) глубже Zeus и ремейка A New Era: распределение рабочих через рекрутёров против глобального пула, налоги бедных домов, структура миссий, 20 уровней жилья и логика миграции, «египетская тупость» случайных поворотов ходоков — с кодом, восстановленным в ремейке Akhenaten.
-
Производительность
Я отклоняю комиты с использованием кучи и прошу коллег переписать такую логику
Опыт разработки больших игр на C++ без кучи: почему динамические аллокации опасны на консолях и мобилках (фрагментация, деградация времени malloc, отказ в сертификации), и чем их заменить — контейнеры фиксированного размера gtl::vector<T,N>, etl/FastDelegate вместо std::function, CRTP и статический полиморфизм на std::variant, пулы объектов и placement new.
-
Геймдизайн
Blackbox gameplay
Black box gameplay в стратегиях и ситибилдерах: зачем серии Caesar/Pharaoh/Zeus прятали числа и механики, песочница против заскриптованных миссий, когнитивный предел в 12 пар, комбинаторика механик важнее количества контента и почему «нарушенный» баланс держит игроков годами — на примере Age of Empires II.
-
Ненормальное программирование
Game++. Performance traps
Финал серии Game++: типичные ловушки производительности C++ — лишние аллокации, коварный RVO, тяжёлый std::function, дорогие строковые идентификаторы, приближённый синус, медленное деление, цена промахов кеша, std::pair/tuple и расплата за виртуальность — с бенчмарками quick-bench и историями из прода.
-
Реверс-инжиниринг
Механика эволюции домов в Pharaoh (1999)
Как устроена эволюция домов в Pharaoh (1999): дома как FSM, система потребностей и атрибутов (желательность земли, налоги, пожарная безопасность, здоровье), оверлеи, восстановленный из оригинала switch эволюции, потребление еды и ресурсов, общий буфер runtime_data и обновление текстур — на примере ремейка Akhenaten.
-
Ненормальное программирование
Game++. while (!game(over))
Стоит ли писать свой игровой движок: зачем и надо ли, что такое движок и что он умеет — игровой цикл, ввод, графика, ассеты, аудио, физика, скрипты и конфиги, сеть, AI, UI и архитектура (библиотечный подход, GodObject, ECS), плюс тулзы — с кодом, ссылками на библиотеки и личным опытом.
-
Ненормальное программирование
Game++. Patching patterns
Паттерны проектирования в играх: что осталось от «синей книги» GoF и какие шаблоны прижились именно в игрострое — Command, State и FSM с pushdown-стеком, Flyweight и instancing, Observer и EventBus, Dirty Flag, Update Layers и GOAP — с кодом, схемами и областями применения.
-
Ремесло
Просто пиши код
Манифест в духе «просто пиши код»: пока остальные спорят на митинге, в какую борду переместить таску, ни одна Jira не напишет багфикс. О работающем говнокоде, обесценившихся лычках, литкоде на собесах и о том, что если ошибок нет — значит ты просто не писал код.
-
Ненормальное программирование
Game++. Work hard
Модели параллелизма в игровых движках: shared/separate/shadow state, воркеры и пул потоков, stateless-воркеры (Assassin's Creed, Factorio), цепочки воркеров и неблокирующий IO, файберы Naughty Dog и библиотека marl — с диаграммами, кодом и бенчмарками загрузки.
-
Ремесло
Пара вещей, которые должен знать игровой программист
Сборник саркастичных «законов» игровой разработки: про std::move, undefined behavior, GameObject и ECS, cert submission и TRC, гейзенбаги, техдолг, // TODO и //TMP, менеджеров, художников и пятничные патчи — горькая правда геймдева одной строкой.
-
Ненормальное программирование
Game++. Heap? Less
Как в играх избавляются от аллокаций в куче: пять областей памяти, стек против кучи, детерминизм и фрагментация, RVO/NRVO, локальные inplace-строки и pmr::string, ad-hoc полиморфизм на std::variant, и реальные оптимизации vector/map/string через monotonic_buffer_resource и профайлер.
-
Ремесло
Почему игродев остаётся на C++17
Почему игровые студии не спешат с C++20 и остаются на C++17: auto и +10-15% к времени компиляции, лучший в мире отладчик Visual Studio, экономика билдферм и тулов, недоверие к STL и Boost в игрострое, отсутствие автотестов и немасштабируемость отладки.
-
Ненормальное программирование
Game++. Unpacking containers
Специализированные контейнеры в игровых движках: fixed array и матрицы, linear/stable/sparse/packed/static/small/dirty/buddy vector, deque и bcdeque, bounded_priority_deque, intrusive list, octree и quadtree, object_pool, ring buffer, cached_hashtable, handle_container и slot_container — устройство, схемы и области применения.
-
Ремесло
Game++. Building arcs
Архитектуры игровых движков и закон Конвея: унитарная (Big Ball of Mud) у Unity, многоуровневая в Unreal Engine, микроядерная в CryEngine и O3DE, data-driven в Dagor, монолитная в X-Ray и микромодульная в Godot — история, плюсы и минусы каждого подхода.
-
Геймдизайн
Первому игроку приготовиться
История видеоигр: от аркадных автоматов и мейнфреймовых игр до Computer Space, Atari и Pong, Galaxian и Pac-Man, Donkey Kong, рождения консолей, Atari 2600, краха рынка 1983-го, Nintendo, Sega и эпохи ПК.
-
Ненормальное программирование
Game++. run, thread, run…
Многопоточность в играх: проблемы блокировок (deadlock, голодание потоков, инверсия приоритетов на примере Cyberpunk 2077 и Crysis), модель памяти C++11, lock-free и атомики, спинлоки с backoff, пул потоков и система задач, hitching, read-write mutex и 8 правил хорошей многопоточности.
-
Ремесло
Game++. Juggling STL algorithms
Почему алгоритмы STL — это «разговорный» C++: они показывают Что вы делаете, а не Как; убирают ошибки границ, пустых коллекций и «размазанного перфа», дают код уровня компилятора. История EASTL, итераторы и back_inserter, кеширование шейдеров через set_difference и большая шпаргалка по алгоритмам.
-
Ненормальное программирование
Game++. Dancing with allocators
Большой разбор аллокаторов памяти в играх: linear, step-back, frame/double/N-frame, stack и double-stack, pool, free list, arena, segregated, buddy, thread-cache, fibonacci, compacting, hot/cold splitting и TLSF — с кодом, схемами, областями применения и бенчмарком.
-
Реверс-инжиниринг
Добро пожаловать в Древний…
Pharaoh (1999): почему ситибилдер не запускается на Windows 10/11 (баг 640×480, масштабирование, оверлеи, стук в мёртвый сервис Microsoft, звук) и чем демка отличается от релиза — экраны, меню, текстуры из Caesar III, разливы Нила, каналы орошения и вырезанный контент. На примере ремейка Akhenaten.
-
Ненормальное программирование
Game++. Cooking vectors
Как устроены векторы в движках и чем за них платят: рост ёмкости и фрагментация памяти, одномерная против каскадной композиции, std::array, static_vector на стеке, hybrid_vector с SSO-подобной оптимизацией и подводные камни pmr-аллокаторов и monotonic_buffer_resource у вендоров.
-
Ненормальное программирование
Game++. String interning
String interning (пул строк) в игровых движках: одна копия строки на все ссылки, интернирование литералов компилятором в clang/GCC и почему трюк ломается на Xbox, опасность сравнения через ==, борьба с фрагментацией памяти и простая реализация xstring на хешах с подсчётом ссылок.
-
Ремесло
В Испании все программисты сеньоры
Чем отличается работа в западных gamedev-студиях от ру-команд: культура «стукачества», запрет трогать чужие задачи, вся связь через ПМа, чрезмерная вежливость, уважение через решённые таски, национальные особенности команд, контекстное против детального общения и слова-якоря.
-
Производительность
Как засунуть слона в чемодан
Уровни оптимизации при портировании игр на слабое железо (Switch, Apple TV, мобилки): архитектура, алгоритмы и код. История про дорогую проверку экранирования строк — от наивного цикла с ранним выходом к версии без ветвлений, lookup-таблице и SIMD на _mm_movemask_epi8, с таблицами времени загрузки на iPhone.
-
Производительность
Spears & bits
Упаковка булевых значений в биты в играх: std::bitset, std::vector<bool>, наивный байтовый массив и решение из CryEngine, бенчмарки с выбросами на 32/64/128, промахи предсказателя переходов и финальная SSE-векторизация на _mm_movemask_epi8 — с 4 мс до 1 мс на кадр.
-
Производительность
Task-based мышление в игровых движках
Основные шаблоны системы задач в игровых движках: вынос movement, физики, скриптов, поиска пути, анимаций, рендеринга и ввода-вывода в отдельные потоки, группировка задач, обмен сообщениями и сравнение простой задачи, менеджера потоков и менеджера задач.
-
Ремесло
Хорошие книги для gamedev AI программиста
Подборка книг для программиста игрового ИИ с личными отзывами: AI for Game Developers, Game AI Pro, Game Engine Gems, The Pyramid of Game Design, Behavioral Mathematics for Game AI и AI Game Programming Wisdom — что и как читать.
-
Ненормальное программирование
Тяжёлый H[header]
Как время полной сборки большого C++-проекта снижали с 15:32 до 5:16: антивирус и проводник, тяжёлые шаблонные хедеры, forward declaration, precompiled headers, PIMPL и отключение анализаторов, юнит-тестов и LTO — с таблицами времени сборки заголовков.
-
Производительность
486-го хватит всем
Какие общие технологии появились в процессорах со времён 486, которыми мы пользуемся каждый день: кэши и предвыборка, TLB, спекулятивное выполнение, NUMA, SIMD, out-of-order, GPGPU и предсказание переходов — с примерами из консолей и бенчмарками.
-
Ненормальное программирование
Как Unity отказались от своих строк
История COW-строк в Unity: copy-on-write с частичным копированием буфера и почти нулевыми аллокациями, конфликт с дизайном
std::string, висячие указатели и почему движок в итоге вернулся к стандартной библиотеке. -
Реверс-инжиниринг
ecs, dynvtbl, логические потоки и Фараон
Кодоархеология движка Pharaoh и Caesar III: древнеегипетский ECS на массивах, VMT на минималках через колбеки, логические потоки из прошлого века и god object ради экономии памяти.
-
Ненормальное программирование
Шеф, всё пропало
Продолжение «Феди, дичи»: 16 пятничных багов из реальных движков и игр — выход за границы массива, утечки дескрипторов на Switch,
memsetпо нетривиальному типу,=!вместо!=иallocaв цикле. Угадай причину. -
Производительность
Просто не копируй это
Передача по значению против
const&, скрытые аллокации на строках и векторах,reserveи реальная просадка до 10 FPS — всё с бенчмарками на QuickBench. -
Ненормальное программирование
Строки в игровых движках
Почему
std::stringне любят в движках: C-строки и NTBS, SSO и string_view, sized/pool/arena-строки, shared string и идентификаторы, а ещё SIMD-парсинг конфигов. -
Геймдизайн
Ловись игрок, платящий и не очень…
Тёмные паттерны монетизации в играх: дейлики, премиум-валюта, лутбоксы, power creep, time gates и комплексный фреймворк MINDSPACE — как студии играют на психологии игрока.
-
Геймдизайн
Чему стоит поучиться у старенькой Bioshock: Infinite?
Уроки геймдизайна из BioShock: Infinite: принцип наглядности, фиксированный и эмергентный нарратив, иллюзия выбора и многослойное повествование Кена Левина — и почему линейный шутер ломает пятую стену.
-
Производительность
И целых 20 ядер мало
Одиннадцать приёмов оптимизации C++ из боевых движков: разогрев кэша, compile-time диспетчеризация, разворачивание циклов, согласование знаков и типов, hotpath, SIMD, prefetch, constexpr и lock-free — с бенчмарками и историями из жизни.
-
Геймдизайн
За пригоршню ачивок
Психология коллекционных механик в играх: доминирование, социализация, эффект недостроя и зависть, типы коллекций по доступности, ачивки и экипировка как коллекции.
-
Геймдизайн
Последний из Deus Ex
Разбор уровней Deus Ex: Mankind Divided — движок Dawn Engine, чёрно-золотой визуальный стиль, внимание к деталям, вариативность против сюжета и комбинаторика механик immersive sim.
-
Геймдизайн
Коридоры не рассказывают сказки
Как архитектура и левел-дизайн рассказывают историю на примере BioShock: коридоры и тени, визуальные магниты, frozen story, геометрия под особенности врагов и немного фэн-шуй.
-
Геймдизайн
Я скучаю по механикам из старых игр
Побурчать про потерянные механики старых игр: чёткие цели, системный дизайн, behavior-base уровни, уровень врагов, обучение через взаимодействие, награду и наказание, карму и невидимые стены.
-
Геймдизайн
Проблема красной бочки
Что такое «красная бочка» в геймдизайне: как взрывающиеся бочки стали клише шутеров и почему унаследованные механики обрастают вопросами, а игроки ими в итоге не пользуются.
-
Ремесло
Каков C++ в gamedev'е?
Почему gamedev намертво прикован к C++ и как язык живёт в движке на трёх уровнях: hardcore-числодробилки, «обычный» C++ со скриптами и хотрелоадом, и мета-уровень с рефлексией и кодогенерацией.
-
Ремесло
Что ещё почитать игровому программисту?
Продолжение списка: Joel on Software, «Кровь, пот и пиксели», исходники Doom 3, MISRA C++, EASTL, daScript, доклады GDC и блоги, которые стоит читать.
-
Ремесло
Что почитать игровому программисту?
Список книг, блогов и репозиториев для игрового программиста: от Code Complete и Effective C++ до Game Engine Architecture, Game AI Pro, GDC и awesome-подборок на GitHub.
-
Ремесло
Вам [не] нужен свой игровой движок
Зачем студиям и инди собственный движок вместо Unreal/Unity: дорого ли это, сложно ли, опыт с Frostbite, Unity и Dagor — и почему уникальные технологии двигают индустрию.
-
Ненормальное программирование
Магия swizzle из шейдеров в C++
Как реализовать swizzle (vec.xxy, vec.zx, vec.rgb) в C++ через union и шаблоны: от первой версии с копипастой до единого constexpr-решения, баг с default operator= и бенчмарки против glm и CxxSwizzle.
-
Ремесло
Вы точно хотите пойти программистом в gamedev?
Честный взгляд изнутри: чем заняты программисты в геймдеве, собеседования, переработки, движки и их школы, традиции студий, дизайнеры — и почему это всё-таки того стоит.
-
Инструменты
Не Unity единым…
Обзор более 50 игровых движков и фреймворков, кроме Unity: от nCine, RayLib и SDL2 до Godot, CryEngine, Unreal и DagorEngine — ссылки, языки, лицензии и личный опыт.
-
Геймдизайн
Процедурная генерация укрытий в играх
Как автоматически генерировать точки укрытий для NPC по геометрии уровня: обход краёв навмеша, рейпики, отбраковка точек и cover evaluation в рантайме. На примере 4A Engine.
-
Реверс-инжиниринг
Как рисуется карта в Фараоне
Алгоритм отрисовки изометрической карты, города и анимации в Pharaoh: diagonal-path и zig-zag, сортировка по глубине, слои и формат карты оригинала.
-
Ненормальное программирование
Федя, дичь
Коллекция диких багов из реальных движков: пропущенная точка с запятой в Unity,
memset, выкинутый компилятором, гонки на битовых полях в CryEngine, most vexing parse и ещё десяток — найди ошибку сам. -
Ненормальное программирование
Когда private, но очень хочется public
Как тестировать приватные члены C++-класса без правки хедеров: от 100+ friend-ов и #define private public до шаблонного хака с подменой типа.
-
Ненормальное программирование
Зачем в Switch SDK три разных sin?
Как при портировании игр на Nintendo Switch обнаружились три реализации sin — и что показал дизасм для -O1, -O3 -math:precise и -O3 -math:fast.
-
Ненормальное программирование
Имя enum'a C++ в рантайме
Как достать имя типа и значения enum'а в рантайме на C++ без RTTI — через __PRETTY_FUNCTION__, шаблоны и constexpr-магию.
-
Геймдизайн
Надо ли вести игрока за ручку?
Приёмы левел-дизайна из Witcher 3, Zelda и Metro Exodus — как направлять игрока, не ведя его за руку.
-
Производительность
Торопиться не надо… (Про спинлоки)
Реализации спинлоков на C++ — от наивной TAS до тикет-спинлока — с бенчмарками, кэш-миссами и нюансами приоритезации потоков.
-
Производительность
Cache pollution? Запасайтесь тестами
Как кэш, ассоциативность, когерентность и выравнивание данных влияют на производительность — с бенчмарками.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: извлечение текстур
Формат текстур .sg2/.555, палитра RGB555, IDA и Hex-Rays — и как хобби превратилось в ремейк. Часть 1.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: отрисовка города
Формат карт, выбор и порядок отрисовки тайлов, рисование города. Часть 2.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: игровая логика
Игровая логика: симуляция жителей, ходьба, очереди событий.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: генерация мира
Процедурная генерация мира и карт.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: модель города
Внутренняя модель города: данные, слои, состояние.
-
Реверс-инжиниринг
Реверс-инжиниринг Caesar III: игровой цикл
Расчёт одного игрового дня: цикл симуляции, боги, настроения, налоги, здоровье, структуры данных.