Игровой движок — это обработка тысяч объектов в реальном времени. ООП, к которому мы привыкли в C++, не лучшим образом подходит для обеспечения нужной гибкости и производительности:
- Жесткая связь между данными и логикой.
- Сложность управления зависимостями.
- Неэффективная организация данных.
Добавим сюда еще «плюсовые» сложности:
- «Слабое связывание» в C++ часто происходит через указатели, управление которыми в условиях динамичного игрового мира — задача со звездочкой.
- Неявный резолвинг указателей виртуальных таблиц — также не очень бьется с производительностью, когда циклы обработки могут за кадр обрабатывать тысячи полиморфных сущностей.
Все это приводит не только к низкой производительности, плохой масштабируемости, но и к снижению эффективности разработки игр, т. к. время на дебаг увеличивается в разы, повышается требование к компетенции разработчиков, что часто сильно бьет в рамках ограниченного времени доставки обновлений.
Я расскажу об альтернативном пути архитектурирования движков на C++: ECS (Entity Component System). ECS предлагает иной взгляд на организацию структуры движка:
- Слабая связанность и модульность. Данные и логика их обработки разделены. Такой подход упрощает добавление новой функциональности без необходимости затрагивать уже существующие механики. В дополнение к этому в основу ECS заложено предпочтение доступа к объектам через ID вместо указателей, что сильно упрощает работу с динамичными сценами.
- Гибкость. Минимум наследования, максимум агрегации. Если нужно обработать, например, физику всех сущностей за раз, мы обрабатываем только физику. Если нужно построить некий агрегат — мы можем сконструировать его налету, используя только те компоненты, которые нужны для решения задачи.
- Оптимизация производительности. Компоненты хранятся в памяти в виде пулов, что значительно улучшает производительность за счет повышения эффективности кэширования и использования SIMD-инструкций.
Рассмотрим аспекты реализации ECS на C++, DOD (Data Oriented Disign), а еще поговорим про выбор стратегии мультипоточности для подобных систем.
Доклад будет интересен не только игроделам, но и всему C++ комьюнити.