Ненормальное программирование
Трюки и тёмная магия C++: шаблоны от шаблонов, constexpr-вычисления, __PRETTY_FUNCTION__ и прочие способы заставить язык делать то, для чего он вроде бы не предназначен.
- Ненормальное программирование
Мифы, суеверия и народные мудрости в разработке игр
Разбор 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 на хеше — и где какой тип уместен в игровых движках.
- Ненормальное программирование
Сам себе breakpoint
Как устроены программные и аппаратные точки останова: подмена байта на int 3 (0xCC), отладочные регистры x86-64 DR0–DR7 и формат DR7, условные, функциональные и временные бряки, watchpoint на запись через GetThreadContext, «буферная канарейка» и кнопка hardware breakpoint прямо в редакторе игры на ImGui.
- Ненормальное программирование
Game++. run, thread, run…
Многопоточность в играх: проблемы блокировок (deadlock, голодание потоков, инверсия приоритетов на примере Cyberpunk 2077 и Crysis), модель памяти C++11, lock-free и атомики, спинлоки с backoff, пул потоков и система задач, hitching и read-write mutex.
- Ненормальное программирование
Game++. Dancing with allocators
Большой разбор аллокаторов памяти в играх: linear, step-back, frame, stack, pool, free list, arena, segregated, buddy, thread-cache, fibonacci, compacting, hot/cold splitting и TLSF — с кодом, схемами и бенчмарком.
- Ненормальное программирование
Game++. Cooking vectors
Как устроены векторы в игровых движках и чем за них платят: рост ёмкости и фрагментация памяти, одномерная против каскадной композиции, std::array, static_vector на стеке, hybrid_vector с SSO-подобной оптимизацией и подводные камни pmr-аллокаторов у вендоров.
- Ненормальное программирование
Game++. String interning
String interning (пул строк) в игровых движках: одна копия строки на все ссылки, интернирование литералов в clang/GCC и почему трюк ломается на Xbox, опасность сравнения через ==, борьба с фрагментацией памяти и простая реализация xstring на хешах с подсчётом ссылок.
- Ненормальное программирование
Тяжёлый H[header]
Как время полной сборки большого C++-проекта снижали с 15:32 до 5:16: антивирус и проводник, тяжёлые шаблонные хедеры, forward declaration, precompiled headers, PIMPL и отключение анализаторов, тестов и LTO — с таблицами времени сборки заголовков.
- Ненормальное программирование
Как Unity отказались от своих строк
История COW-строк в Unity: copy-on-write с частичным копированием буфера и почти нулевыми аллокациями, конфликт с дизайном std::string, висячие указатели и почему движок в итоге вернулся к стандартной библиотеке.
- Ненормальное программирование
Шеф, всё пропало
Продолжение «Феди, дичи»: 16 пятничных багов из реальных движков — выход за границы массива, утечки дескрипторов на Switch, memset по нетривиальному типу, =! вместо != и alloca в цикле. Угадай причину.
- Ненормальное программирование
Строки в игровых движках
Почему std::string не любят в движках: C-строки и NTBS, SSO и string_view, sized/pool/arena-строки, shared string и идентификаторы, а ещё SIMD-парсинг конфигов.
- Ненормальное программирование
Магия swizzle из шейдеров в C++
Как реализовать swizzle (vec.xxy, vec.zx, vec.rgb) в C++ через union и шаблоны: от первой версии с копипастой до единого constexpr-решения и бенчмарки против glm и CxxSwizzle.
- Ненормальное программирование
Федя, дичь
Коллекция диких багов из реальных движков: пропущенная точка с запятой в Unity, memset, выкинутый компилятором, гонки на битовых полях в CryEngine, most vexing parse и ещё десяток — найди ошибку сам.
- Ненормальное программирование
Когда private, но очень хочется public
Как тестировать приватные члены C++-класса без правки хедеров: от сотни friend-ов и #define private public до шаблонного хака с подменой типа указателя на член.
- Ненормальное программирование
Зачем в Switch SDK три разных sin?
Как при портировании игр на Nintendo Switch обнаружились три реализации sin — и что показал дизасм для разных режимов оптимизации.
- Ненормальное программирование
Имя enum'a C++ в рантайме
Как достать имя типа и значения enum'а в рантайме на C++ без RTTI — через __PRETTY_FUNCTION__, шаблоны и constexpr-магию.