Производительность
Заметки о том, что происходит ниже уровня алгоритмов — кэши процессора, когерентность данных, примитивы синхронизации и выравнивание. Всё с бенчмарками и примерами на C++.
- Производительность
Как работают с памятью в игровых консолях
История архитектуры памяти консолей от Atari 2600 до PS5 и Xbox Series: счёт тактов и бланки, дележ шины и DMA, быстрая-но-медленная RDRAM на N64, тайловый рендер Dreamcast, три острова памяти PS2, SPU и Local Store на PS3, унификация памяти на PS4 и SSD как новый уровень иерархии памяти.
- Производительность
Лишние вычисления
Как спекулятивное выполнение и предсказание ветвлений взаимодействуют с подсистемой памяти: почему branchless-код не всегда быстрее, цена ошибки предсказания против задержек памяти, бинарный поиск и бенчмарки branchful/branchless на Jaguar (PS4).
- Производительность
Почему у нас нет кешей L5?
Почему в процессоре несколько уровней кэша, а не один большой: физика сигнала на кристалле, аналогия с ёлочными игрушками, история от i486 до Nehalem, разделение L1I/L1D, протоколы когерентности, eDRAM и HBM как «скрытый» L4 и почему L5 пока не имеет смысла.
- Производительность
Охота за красным fps
Профилирование игр как философия разработки: эволюция требований к FPS, как контент художников бьёт по перфу (геометрия, текстуры, рендер, кулинг), методы профилирования — сэмплирование, инструментирование, трассировка, event-based, статический анализ и реплеи — и устройство трассирующего профайлера с zero-allocation архитектурой и строками-хендлами.
- Производительность
Хороший, плохой, цветной и быстрый
Ненормальные аллокаторы памяти из практики: аллокатор с отслеживанием времени жизни объектов для поиска утечек, рандомизирующий (chaos) аллокатор для стресс-теста долгоживущих систем, «цветной» аллокатор для изоляции подсистем (на примере Deathloop) и быстрый TLSF — с диаграммами и бенчмарком по циклам процессора.
- Производительность
Я отклоняю комиты с использованием кучи и прошу коллег переписать такую логику
Опыт разработки больших игр на C++ без кучи: чем опасны динамические аллокации на консолях и мобилках (фрагментация, деградация malloc, отказ в сертификации) и чем их заменить — контейнеры фиксированного размера gtl::vector<T,N>, etl/FastDelegate вместо std::function, CRTP и статический полиморфизм на std::variant, пулы объектов и placement new.
- Производительность
Как засунуть слона в чемодан
Уровни оптимизации при портировании игр на слабое железо: архитектура, алгоритмы и код. История про дорогую проверку экранирования строк — от наивного цикла к версии без ветвлений, lookup-таблице и SIMD на _mm_movemask_epi8.
- Производительность
Spears & bits
Упаковка булей в биты: std::bitset, std::vector<bool>, наивный байтовый массив и решение из CryEngine, бенчмарки с выбросами на 32/64/128, промахи предсказателя переходов и финальная SSE-векторизация на _mm_movemask_epi8.
- Производительность
Task-based мышление в игровых движках
Основные шаблоны системы задач в движках: вынос movement, физики, скриптов, поиска пути, анимаций, рендеринга и ввода-вывода в отдельные потоки, группировка задач, обмен сообщениями и сравнение простой задачи, менеджера потоков и менеджера задач.
- Производительность
486-го хватит всем
Какие общие технологии появились в процессорах со времён 486, которыми мы пользуемся каждый день: кэши и предвыборка, TLB, спекулятивное выполнение, NUMA, SIMD, out-of-order, GPGPU и предсказание переходов — с примерами из консолей и бенчмарками.
- Производительность
Просто не копируй это
Передача по значению против const&, скрытые аллокации на строках и векторах, reserve и реальная просадка до 10 FPS — всё с бенчмарками на QuickBench.
- Производительность
И целых 20 ядер мало
Одиннадцать приёмов оптимизации C++ из боевых движков: разогрев кэша, compile-time диспетчеризация, разворачивание циклов, согласование знаков и типов, hotpath, SIMD, prefetch, constexpr и lock-free — с бенчмарками и историями из жизни.
- Производительность
Торопиться не надо… (Про спинлоки)
Реализации спинлоков на C++ — от наивной TAS до тикет-спинлока — с бенчмарками, кэш-миссами и нюансами приоритезации потоков.
- Производительность
Cache pollution? Запасайтесь тестами
Как кэш, ассоциативность, когерентность и выравнивание данных влияют на производительность — с бенчмарками.