Spiiin's blog

Плюсовики в геймдеве + материалы по геймдеву

Я давно писал про использование C++ как языка в геймдеве

Тут о людях, которые пишут на С++, банальное, но немного наболевшее и скопившееся, наверное в последний раз на эту тему.

Специализации в геймдеве

С какого-то доклада я стащил такое разделение программистов по специальностям в AAA-студиях:
Game - Gameplay/Generalist/AI
Game Tech - AI/Animation/Physics/Render/Network/Generalist/Tools
Core Tech Engine - Animation/Physics/Render/Network/Generalist/Tools

Я бы разделил всю пачку специализаций геймдева просто на рендер/геймплей/технологии

Рендер
Вообще отдельный мир, постоянное изучение пейперов, куча математики, ковыряние с API программирования gpu и с архитектурой железок.

Life and Death of a Graphics Programmer
The engine of the future.The keynote nobody (quite literally) asked for

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

Технологии
Не так весело, но зато и не так жгутся сроки. Задачи могут как требовать низкоуровневого кода (движки/компиляторы), так и высокоуровневого (редакторы, ui для артистов). Главный навык чаще всего — эмпатия и понимание образа мысли и действий юзеров.

Проблема плюсовиков в геймдеве

В не-топовых командах работают чаще просто "программисты на C++".

По С++ много книг, конференций (в том числе на русском), курсов. Наверное, один из главных евангелистов языка на русском - Антон Полухин.

Из его докладов, где применяется С++ — браузеры/поисковые запросы/языки программирования/кодеки/торренты/игровые движки/космос/самолёты/автомобили/медицинское по/распознавание образов/обработки изображений/web фреймворки/web-страницы/базы данных/proxy/embedded/компиляторы/виртуальные машины/драйверы/биржа/офисные приложения/банкоматы/сапр/рендеры/химия/физика/машинное обучение. Все эти скоупы объединяет то, что в них может потребоваться писать код на низком уровне.

Тем не менее в каждой из областей есть и другие требования, и применяются также другие языки, которые лучше соответствуют этим требованиям. Например — надёжность (верифицируемость, работа в изолированной среде), простота использования, синтаксическая выразительность, простота работы в многопоточной среде, battery-included (соотвествие стандартной или вендорной библиотеки предметной области), скорость компиляции, скорость итерации разработки (hot-reload, repl, интерпретация). Об этом редко говорят на конференциях и в книгах по С++ (что в принципе и логично).

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

Как результат открытости С++ и закрытости сферы разработки игр, приходящие в геймдев программисты имеют “C++-майндсет” — знают как принято писать на С++ “в общем”, но открывают для себя специфику разработки игр только в процессе работы.

Способ писать на C++, нахватавшись знаний из разных областей его применения, находится далеко от того, что нужно конкретно для разработки игр.

Последствия этого — иногда “плюсовики в геймдеве”, сталкиваясь с какой-то проблемой, начинают решать её таким методом заново, не вникая в то, что наступают на те же грабли, по которым проходили их коллеги в индустрии разработки игр лет так 10-15 назад.

Иногда и примеры сложно разобрать более детально из-за NDA, но вот ещё несколько примеров дискуссий, касающихся того, что есть в каждой игре, т.е. с дизайном этого сталкиваются все разработчики игр

ui
Why I think Immediate Mode GUI is way to go for GameDev tools — gui для тулзов и игр, сильно шире, чем в названии. Immediate/Retained/Reactive, Native/Web, Foss/Proprietary

containers/allocators/pointers
Best Practices for Authoring Generic Data Structures — альтернативный дизайн интерфейсов для контейнеров, Bitsquid Foundation Library, дальше по обратным ссылкам дискуссии не только о дизайне контейнеров, но и базовых структур стандартной библиотеки, аллокаторах, указателях и сериализации/кодогенерации — class-centric vs data centric design (Blob and I, Zmeya + ссылки дальше).

  • Внутрь STL. Ссылки — об альтернативных stl. Одна из фич C, унаследованная C++ — это возможность писать программы без использования стандартной библиотеки.

engines
Архитектура зависит от формата команды, платформы, развитости технологии, типа игр, и майндсета, поэтому подходы сильно разные
Writing Reusable Code — про паттерны framework/layers/components в игровых движках.
How I Evaluate Game Engines — с точки зрения масштабирования.
Jonathan Blow on why C++ is a bad language for games — вообщем-то, не C++, а о паттерне layers
Your 1st, 2nd, 3rd, and Nth Game Engines — о том, чем плох framework
Write Games, Not Engines — инди-подход
An Anatomy of Despair: Introduction — про выбор между low-level и abstractions (layers)

scripting
Scripting language? Engine language? — про границы между движком и игрой
The Next Mainstream Programming Language: A Game Developer’s Perspective — про баланс производительность/скорость разработки, надёжность, чистоту, многопоточность, развитие железа, ленивые вычисления и системы типов
Ideas about a new programming language for games — Jai
Продуктивность и производительность в новых скриптовых языках — скриптовый язык для программистов

ecs
дискуссии о вариантах ecs/cs и dod с точки зрения архитектуры и производительности
https://spiiin.github.io/tags/ecs/ — набор ссылок

Требование к языку/тулзам для разработки игр

Язык для разработки игр должен быть:
- быстрый (для определенной части кода)
- надёжный (компилятор помогает находить проблемы)
- гибкий (для итераций, прототипов, и тюнинга геймплея — иногда даже немного в ущерб первому требованию, “Парето-оптимальная производительность”)
- простой (чем проще описывать предметную область — игровую логику, тем лучше)

Требования скорости и надёжности более-менее пересекаются с общим направлением развития C++.

Хотя, кажется, насчёт скорости, полезное свойство языка в декларируемых zero-overhead рантайм-абстракциях, но не в абстракциях для лучшей работы с железом. Большая часть скорости получается даже не от легковесных рантайм-абстракций, а от лучшего соответствия данных и кода особенностям железа, на котором код выполняется, что достигается скорее использованием правильных библиотек, либо специфическим подходом к структурированию данных (Data oriented design).


картинка из прошлой статьи про C++ в геймдеве, только 3-5% производительности связано с аккуратным использованием языка

Ну и понятно — о скорости можно забыть в debug-билдах
The sad state of debug performance in c++

Насчёт надёжности, местами сколько не добавляй в язык нового, из-за обратной совместимости необходима скорее дисциплина программистов. Т.е в принципе, надёжность может обеспечиваться дисциплиной в C++ ИЛИ использованием другого языка.

С гибкостью — тут скорее необходимо брать другой язык, С++ для этого просто непригоден. Но так как о требованиях к гибкости редко говорят в мире C++, иногда бывает и так, что у программистов-плюсовиков просто не возникает ИДЕЙ, о том, что это приводит к ускорению разработки игр и созданию интересного геймплея.

Меняя код запущенной игры, вы ускоряете весь процесс и проходите больше циклов в день, что, в свою очередь, повышает качество вашей игры. Раньше я использовал Scheme, Smalltalk и Python, но в целом подойдут любые языки программирования высокого уровня. Связать все воедино поможет Javascript
Jessie Schell, Геймдизайн. Как создать игру, в которую будут играть все.

Очень нестандартный набор с точки зрения программиста?

Простота тоже не является чертой C++. Количество нововведений в язык с каждой версией требует обновления знаний к новой версии стандарта.

По разным причинам язык С++ иногда позволяет программисту сказать “I’ve only being doing C++ for 15 years. Can someone explain what is going on here?”

Один из примеров разрастающейся сложности — решение о разрешении использования в проекте новой версии стандарта языка. С точки зрения программиста плюсовика основным аргументом становится поддержка его компиляторами.

При этом не всегда заранее учитывается, для каждой отдельной новой фичи:

  • насколько будет увеличен размер бинарника при активном использовании фичи
  • время компиляции
  • насколько хорошо та или иная фича в принципе продумана, и насколько хорошо реализована на уровне компиляторов (“поддерживается” — не значит реализована оптимально)
  • дополнительная семантическая/когнитивная нагрузка — насколько в проекте станет больше различных идиом, приёмов, способов сделать что-то.
    Т.е. “увеличится ли минимальное количество знаний, необходимое для того, чтобы программист игровой логики мог дописать код в произвольном месте” (ну, или в произвольном месте, отведённом для игрового кода). А также, сколько времени будет затрачено от абстрактного общего пула знаний, которые могут потребоваться игровому разработчику (вместо времени на получение дополнительных знаний по C++, он мог бы изучить что-то другое, настолько же или более полезное для разработки игр).

иногда вообще кажется, что проще выучить язык, в котором уже хорошо реализована концепция, вводимая в стандартах C++, и только потом посмотреть, как перевести её на C++, чем изучать её на C++ сразу

При этом с точки зрения функциональности игры в проект скорее всего не будет добавлено ничего.

необходимый дисклеймер
Эта заметка про программистов, и про их взаимодействие с геймдизайнерами, как часть специфики предметной области.

Есть и другие части, про которые тоже нельзя забывать:
- Engineering (как programming integrated over time) — общие практика разработки. Эта часть более схожа с практиками в других областях разработки программ, хотя тоже имеет свою специфику. Ключевой литературы, посвященной именно геймдеву я не встречал, но тут либо подходит общая литература (только не забывать идиому take everything with a pinch of salt!), либо доклады с профильных конференций.
- Геймдев как бизнес — менее связанно с непосредственно с программированием, но необходимо для представления, что такое профессиональная разработка игр. Материалы (just a helicopter view on a problem):
Алексей Савченко - Игра как бизнес. От мечты до релиза — разбор процесса создания игры, в основном про премиум-игры AA-класса. С начала и до конца. Из относительных недостатков — высокий входной порог для понимания, не всегда легко отделить написанные кровью правила от личного опыта, мало ссылок (“изучите пайплайн производства арта у Disney”)
Development and Deployment of Multiplayer Online Games: from social games to MMOFPS, with stock exchanges in between — MMO и сервисные игры. Не закончена. Много технической информации, немного про оперирование.
Lovell Nicholas - The Pyramid of Game Design. Designing, Producing and Launching Service Games — Free-to-play игры, геймдизайн и бизнес-модель.
Jessie Schell - серия докладов про игровые студииInformation Flow: The Secret to Studio Structure, Game Studio Leadership: You Can Do It, Game Studio Management: Making It Great

Развитие C++

Куда двигался и двигается С++? (субъективно, не пересказ Committee’s subgroups)
- Борьба с наследием C и раннего C++ — спрятать сырые указатели, убрать касты (больше способов передать компилятору информацию о связях типов), заменить метапрограммирование by accident на by design (меньше трюков с шаблонами), добавить больше возможностей говорить о корректности части программы. Sean Baxter @Bloomberg: Circle Fixes Defects, Makes C++ Language Safer & More Productive — C++ “bad defaults”. Ориентиры — Rust/D/Possible future C++ successor
- Синтаксический сахар — добавления лямбд, deducing this, <=>, fold expressions, CTAD и прочее, сокращающее количество символов. Получается местами так себе (отчасти также из-за наследия CppCon 2018: Timur Doumler “Can I has grammar?”, Lambda Lambda Lambda, отчасти из-за того, что не любую синтаксическую “сладость” можно завернуть в zero-runtime overhead обёртку, в качестве примера можно пронаблюдать дискуссии про стандартизацию coroutines). Ориентиры — Python/Ruby.
- Возможности выразительности типов/функций — концепты, ranges, функциональные возможности, вычисления над типами. Последователи Alexandresku и Stepanov — Sean Parrent, Odin Holmes, Louis Dionne/Ivan Cukic, Bartosz Milewski. CppChat The Great Template Metaprogramming Library Debate — иногда выглядит, что каждый тянет в свою сторону, как, собственно, должно выглядеть метапрограммирование на C++. Ориентиры — ML/Haskell/Lisp - очень разные идеи
- Рефлексия/Compile-time evaluations — в принципе, то же, что и с предыдущим пунктом. Ben Deane & Jason Turner “constexpr ALL the Things!” / Don’t constexpr All the Things - David Sankel / Reflection in C++ Next - Anton Bikineev. Ориентиры — D?. Хотя хотелось бы что-нибудь типа Haxe/Nemerle/Nim/Lisp/Smalltalk, или хотя бы Circle/LLVM.
- Расширение std — Hazzard pointers, примитивы синхронизации, parallel stl, filesystem/networking/threading. Сложно, из-за большого scope С++ — из-за необходимости поиска “наименьшего общего знаменателя” могут не приниматься доступные почти на любом современном железе/операционной системе вещи. C++ Siberia 2019: Антон Полухин, C++ на практике — особенно интересная дискуссия в конце. Ориентиры — Java/C#.
- Game/Embedded/Low Latency — я не особо знаю идеи, пришедшие в стандарт оттуда, только общие мысли. Идеи альтернативной EASTL. DOD — CppCon 2018: Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design” и CppCon 2014 Mike Acton Data Oriented Design and C++. Low latency — What is Low Latency C++? - Timur Doumler - CppNow 2023

Уже не совсем язык, но:
- Tooling — статический анализ, fuzzing, sanitazers, flamegraphs. Наверное, ещё LLVM с его API к компилятору. CppCon 2017: Titus Winters “C++ as a “Live at Head” Language”

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

Материалы по геймдеву

пока просто свалены в одну кучу

~meta
Gamedevs.org — список презентаций и документов на различные темы в геймдеве. Почти все полезные.
A study path for game programmer — бесконечный список книг, местами для общего образования, а не необходимых каждому.
GDC Vault — огромный архив конференции, часть информации платная

~engines
Game Engines with Source: Learning from the best — список движков с исходниками. Как решаются возникающие в геймдеве проблемы в существующих движках. В отличие от других коллекций, здесь не все движки, которые удалось найти, а выборка приличного качества.
Блоги про разработку движков, старые, но не устаревшие. Часто содержат описание проблем и возможного пространства решений.
Bitsquid — bitsquid/stingray
Our Machinery
Molecular Matters
Despair + GameArchitect
https://solid-angle.blogspot.com/
https://diligentgraphics.com/
https://www.3dgep.com/ / render
https://engine-programming.github.io/

~solodev
https://floooh.github.io/
https://gist.github.com/bkaradzic (bgfx)
https://www.gingerbill.org/article/ (odin)
https://zylinski.se/
jonathan blow, http://number-none.com/product/ + разное
https://gamesfromwithin.com/category/game-tech

~general
https://aras-p.info/blog/ - Aras Pranckevičius, Unity
https://randygaul.github.io/
https://probablydance.com/
https://gafferongames.com/
https://journal.stuffwithstuff.com/
https://www.tomlooman.com/ - unreal
https://bronsonzgeb.com/
https://box2d.org/posts/
https://skypjack.github.io/
https://etodd.io/
https://allenchou.net/blog/
https://jobtalle.com/index.html
https://deepnight.net/tutorials/
https://caseymuratori.com/contents
https://dyn4j.org/tags#game-development
https://www.jeremyong.com/ - game dev general/graphics
https://stoyannk.wordpress.com/
https://deplinenoise.wordpress.com/
https://blog.demofox.org/
https://github.com/BobbyAnguelov/Esoterica - эксперименты Bobby Anguelov с системами анимации/ии.
mike acton
кармак

~render (немного)
Real-time rendering + ссылки оттуда на статьи/блоги/доклады
https://diaryofagraphicsprogrammer.blogspot.com/ - Wolfgang Angel, The Forge, пачка книг ShaderX/GPU Pro/GPU Zen
https://zeux.io/ - Arseny Kapoulkine, Roblox
https://mynameismjp.wordpress.com/ - Matt Pettineo, Sony
https://fgiesen.wordpress.com/ - Fabian “ryg” Giesen, RAD game tools
https://realtimecollisiondetection.net/blog/ Christer Ericson, Activision
http://c0de517e.blogspot.com/ - Angelo Peske, Roblox
http://eelpi.gotdns.org/ - Tom Forsyth, Valve
https://interplayoflight.wordpress.com/ - Kostas Anagnostou, Playground Games

https://x.com/SebAaltonen - Sebastian Aaltonen, Unity, Ubisoft, mobile render in hype-hype
https://x.com/mirror2mask - Natalya Tatarchuk, Activision, Unity