SlideShare a Scribd company logo
C++ в играх, больших и не
очень
Igor Lobanchikov, 2017
Игорь Лобанчиков
● Разрабатываю игры с 2003 года
● S.T.A.L.K.E.R.: Clear Sky
● Работаю с Confetti
● Эксперт по компьютерной графике
○ Помогаю улучшать и оптимизировать чужие проекты
○ Портирую игры на новые платформы
○ Intel, AMD, Qualcomm, Amazon и другие
● imixerpro(at)gmail(dot)com
О чем будем говорить
● Особенности применения C++ в играх
● Производительность
○ КЭШ: основы
○ Методы снижения производительности с использованием возможностей C++
Кросс-платформенность
● Разные устройства
○ Настольные: Win/Mac/Linux
○ Консоли: PS4/XBox One/Wii/Nintendo Switch
○ Мобильные: iOS/Android
● Разные компиляторы
○ MSVC
○ CLANG/LLVM
○ До недавнего времени GCC
Кросс-платформенность
● Комилятор обновляет владелец платформы
○ CLang/GCC может существенно отставать от выхода PC/Linux версии
○ MSVC под XBox One тоже отстает
● С++ runtime собирает владелец платформы
○ Может содержать баги
● Больше всего проблем с Android
○ Ранние версии Android NDK не содержали STL
○ gnustl поддерживает только С++11 и частично несовместима с Clang
○ Libc++ до сих пор в стадии beta
○ Проблемы при использовании CMake
● Ожидание новых платформ
○ А вдруг там будут проблемы с новыми стандартами
Кросс-платформенность
● Использование новых стандартов создает риски
○ Поддержка на всех платформах
○ Корректность на всех платформах
● Обновление компилятора (и SDK) создает риски
○ Обновление API
○ Android: unified header и Boost
Консервативность и реакционность
● Используется подмножество языка
○ Подмножество STL
○ Или свой собственный STL
○ Или полный запрет на STL
● Используются “устаревшие” стандарты
○ C++11 достаточно “стар”
● Vulcan API - основан на C
● Молодые специалисты недовольны
○ Хотят использовать “современный” инструментарий
Производительность
● Конфликт интересов
○ Картинка должна быть красивой
○ Мир богатым
○ Частота кадров высокой
● 60 кадров в секунду (16.6 мс на кадр)
○ 16.6мс vs 17.6мс = 60 FPS vs 57 FPS
○ 33.3мс vs 34.4мс = 30 FPS vs 29 FPS
● Casual vs AAA
○ Повышение FPS
○ Снижение энергопотребления
● AR приложения
○ Производительность критична
Производительность
● Использование инструментария
○ Оптимизация узких мест
● Использование опыта предыдущей разработки при проектировании
○ Оптимальные решения для целевых платформ
○ Субоптимальные - для иных существующих
○ Спекуляции относительно будущих
КЭШ: основы
СPU0
ISL1 DSL1
СPU1
ISL1 DSL1
L2
СPU2
ISL1 DSL1
СPU3
ISL1 DSL1
L2
L3
RAM
КЭШ: время отклика
Samsung Exynos 5250
4 cycles
21 cycles
...
21 cycles + 110 ns
i7-6700 Skylake
4-5cycles
12 cycles
42 cycles
42 cycles + 51 ns
L1 Data Cache Latency
L2 Cache Latency
L3 Cache Latency
RAM Latency
КЭШ: размеры
Samsung Exynos 5250
32 KB
1 MB
...
i7-6700 Skylake
32 KB
256 KB
8 MB
L1 Data Cache
L2 Cache
L3 Cache
Shared pointer: что из себя представляет
Указатель на блок
управления
Указатель на данные
Блок управления
Управляемый объект
Счетчик shared_ptr
Shared pointer: что из себя представляет
Указатель на блок
управления
Указатель на данные
Блок управления
Управляемый объект
Счетчик shared_ptr
Shared pointer: снижение производительности
void foo(std::shared_ptr<tBar> bar);
Shared pointer: снижение производительности
void foo(std::shared_ptr<tBar> bar);
void foo(const std::shared_ptr<tBar> &bar);
void foo(tBar *bar);
void foo(tBar &bar);
Shared pointer: снижение производительности
struct SortPair
{
size_t sortKey;
boost::shared_ptr<tBar> object;
bool operator< (...) {...}
}
std::vector<SortPair> sort_pairs_vector;
// fill the vector
std::stable_sort(
sort_pairs_vector.begin(),
sort_pairs_vector.end());
Shared pointer: снижение производительности
struct SortPair
{
size_t sortKey;
shared_ptr<tBar> object;
tBar *object;
bool operator< (...) {...}
}
std::vector<SortPair> sort_pairs_vector;
// fill the vector
std::stable_sort(
sort_pairs_vector.begin(),
sort_pairs_vector.end());
Управление временем жизни
● “Старые” графические API (Direct3D 11-, OpenGL / OpenGL ES)
○ Достаточно дорогие вызовы API
○ Дорогие настолько, что использование синхронизации не является критичным
Управление временем жизни
GPU
CPU Client
CPU API
Set Texture A Draw Release Texture A Set Texture B
Draw
API State
Draw
Draw
Управление временем жизни
● “Новый” графические API (Direct3D 12, Vulcan, Metal*)
○ Достаточно дешевые вызовы API
○ Управление временем жизни объекта драйвером существенно влияет на стоимость
вызова
Управление временем жизни
GPU
CPU Client
CPU API
Set Descriptor table Draw
Draw
Draw
Draw
RTTI+исключения
● Традиционно отключаемое в крупных играх
○ Раздувает размер исполняемого файла (до 10%)
○ Влияет на производительность
○ Требует внимания при сборке
RTTI
● Занимает место
○ Для каждого класса с vtable компилятор создает структуру std::type_id
○ Структура содержит строку в качестве идентификатора имени класса
RTTI
● dynamic_cast<> обходит всю иерархию классов
○ Возможно, сравнивая строки для каждого узла (или их хеши)
Class A
Class B
Class C
Class D
Class E
исключения
● SetJump/LongJump
○ потребляет до 10% производительности даже если исключение не будет брошено
● “Zero-cost”
○ раздувает исполняемый файл
○ Если исключение брошено - дополнительные расходы на обработку
○ Рекомендуется использовать максимально редко
Q&A
● вопросы?
ARM Cache -
https://events.linuxfoundation.org/sites/events/files/slides/slides_10.pdf
CPU cache cycles -
http://www.7-cpu.com/
PS4 LLVM -
https://llvm.org/devmtg/2013-11/slides/Robinson-PS4Toolchain.pdf
Exceptions -
https://mortoray.com/2013/09/12/the-true-cost-of-zero-cost-exceptions/
Old style exceptions handling speed -
http://www.codercorner.com/blog/?p=33
clang: no rtti or exceptions
http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions

More Related Content

What's hot

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studioчто пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
corehard_by
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
Alexander Shigin
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
Sergey Zubkov
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Yandex
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Rubinius: Ruby написанный на Ruby
Rubinius: Ruby написанный на RubyRubinius: Ruby написанный на Ruby
Rubinius: Ruby написанный на Ruby
Ivan Samsonov
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Darya Zubova
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей Акиньшин
CodeFest
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Sergey Platonov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
Eugeniy Tyumentcev
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Alexander Borzunov
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
Yandex
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
CodeFest
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 

What's hot (20)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studioчто пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Rubinius: Ruby написанный на Ruby
Rubinius: Ruby написанный на RubyRubinius: Ruby написанный на Ruby
Rubinius: Ruby написанный на Ruby
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей Акиньшин
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 

Viewers also liked

C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
corehard_by
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
corehard_by
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
corehard_by
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
corehard_by
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
corehard_by
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поиск
corehard_by
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Report
corehard_by
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборок
corehard_by
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
corehard_by
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
COMAQA.BY
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
corehard_by
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
corehard_by
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineering
corehard_by
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
corehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
corehard_by
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
corehard_by
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Ontico
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
COMAQA.BY
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Ontico
 

Viewers also liked (20)

C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поиск
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Report
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборок
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineering
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
 

Similar to C++ в играх, больших и не очень

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
corehard_by
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic GamesAlexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
White Nights Conference
 
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)Ontico
 
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
DevGAMM Conference
 
Publishing a Unity based Title on mobile, PC and consoles
Publishing a Unity based Title on mobile, PC and consolesPublishing a Unity based Title on mobile, PC and consoles
Publishing a Unity based Title on mobile, PC and consoles
DevGAMM Conference
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
CodeFest
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
Smolensk Computer Science Club
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Yandex
 
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Fwdays
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
DevGAMM Conference
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
Anton Patrushev
 
1k speedup
1k speedup1k speedup
GDG meetup #15: Как построить релиз-инжиниринг на Jenkins
GDG meetup #15: Как построить релиз-инжиниринг на JenkinsGDG meetup #15: Как построить релиз-инжиниринг на Jenkins
GDG meetup #15: Как построить релиз-инжиниринг на Jenkins
Mikhail Chinkov
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
DevGAMM Conference
 
Сергей Комлач "Итоги Google I/O: что нас ждет"
Сергей Комлач "Итоги Google I/O: что нас ждет"Сергей Комлач "Итоги Google I/O: что нас ждет"
Сергей Комлач "Итоги Google I/O: что нас ждет"
Fwdays
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
e-Legion
 

Similar to C++ в играх, больших и не очень (20)

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic GamesAlexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
 
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)
2.5D игры и особенности разработки многопользовательских игр (Глеб Полушкин)
 
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
 
Publishing a Unity based Title on mobile, PC and consoles
Publishing a Unity based Title on mobile, PC and consolesPublishing a Unity based Title on mobile, PC and consoles
Publishing a Unity based Title on mobile, PC and consoles
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
 
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 
1k speedup
1k speedup1k speedup
1k speedup
 
GDG meetup #15: Как построить релиз-инжиниринг на Jenkins
GDG meetup #15: Как построить релиз-инжиниринг на JenkinsGDG meetup #15: Как построить релиз-инжиниринг на Jenkins
GDG meetup #15: Как построить релиз-инжиниринг на Jenkins
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
 
Сергей Комлач "Итоги Google I/O: что нас ждет"
Сергей Комлач "Итоги Google I/O: что нас ждет"Сергей Комлач "Итоги Google I/O: что нас ждет"
Сергей Комлач "Итоги Google I/O: что нас ждет"
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

C++ в играх, больших и не очень

  • 1. C++ в играх, больших и не очень Igor Lobanchikov, 2017
  • 2. Игорь Лобанчиков ● Разрабатываю игры с 2003 года ● S.T.A.L.K.E.R.: Clear Sky ● Работаю с Confetti ● Эксперт по компьютерной графике ○ Помогаю улучшать и оптимизировать чужие проекты ○ Портирую игры на новые платформы ○ Intel, AMD, Qualcomm, Amazon и другие ● imixerpro(at)gmail(dot)com
  • 3. О чем будем говорить ● Особенности применения C++ в играх ● Производительность ○ КЭШ: основы ○ Методы снижения производительности с использованием возможностей C++
  • 4. Кросс-платформенность ● Разные устройства ○ Настольные: Win/Mac/Linux ○ Консоли: PS4/XBox One/Wii/Nintendo Switch ○ Мобильные: iOS/Android ● Разные компиляторы ○ MSVC ○ CLANG/LLVM ○ До недавнего времени GCC
  • 5. Кросс-платформенность ● Комилятор обновляет владелец платформы ○ CLang/GCC может существенно отставать от выхода PC/Linux версии ○ MSVC под XBox One тоже отстает ● С++ runtime собирает владелец платформы ○ Может содержать баги ● Больше всего проблем с Android ○ Ранние версии Android NDK не содержали STL ○ gnustl поддерживает только С++11 и частично несовместима с Clang ○ Libc++ до сих пор в стадии beta ○ Проблемы при использовании CMake ● Ожидание новых платформ ○ А вдруг там будут проблемы с новыми стандартами
  • 6. Кросс-платформенность ● Использование новых стандартов создает риски ○ Поддержка на всех платформах ○ Корректность на всех платформах ● Обновление компилятора (и SDK) создает риски ○ Обновление API ○ Android: unified header и Boost
  • 7. Консервативность и реакционность ● Используется подмножество языка ○ Подмножество STL ○ Или свой собственный STL ○ Или полный запрет на STL ● Используются “устаревшие” стандарты ○ C++11 достаточно “стар” ● Vulcan API - основан на C ● Молодые специалисты недовольны ○ Хотят использовать “современный” инструментарий
  • 8. Производительность ● Конфликт интересов ○ Картинка должна быть красивой ○ Мир богатым ○ Частота кадров высокой ● 60 кадров в секунду (16.6 мс на кадр) ○ 16.6мс vs 17.6мс = 60 FPS vs 57 FPS ○ 33.3мс vs 34.4мс = 30 FPS vs 29 FPS ● Casual vs AAA ○ Повышение FPS ○ Снижение энергопотребления ● AR приложения ○ Производительность критична
  • 9. Производительность ● Использование инструментария ○ Оптимизация узких мест ● Использование опыта предыдущей разработки при проектировании ○ Оптимальные решения для целевых платформ ○ Субоптимальные - для иных существующих ○ Спекуляции относительно будущих
  • 10. КЭШ: основы СPU0 ISL1 DSL1 СPU1 ISL1 DSL1 L2 СPU2 ISL1 DSL1 СPU3 ISL1 DSL1 L2 L3 RAM
  • 11. КЭШ: время отклика Samsung Exynos 5250 4 cycles 21 cycles ... 21 cycles + 110 ns i7-6700 Skylake 4-5cycles 12 cycles 42 cycles 42 cycles + 51 ns L1 Data Cache Latency L2 Cache Latency L3 Cache Latency RAM Latency
  • 12. КЭШ: размеры Samsung Exynos 5250 32 KB 1 MB ... i7-6700 Skylake 32 KB 256 KB 8 MB L1 Data Cache L2 Cache L3 Cache
  • 13. Shared pointer: что из себя представляет Указатель на блок управления Указатель на данные Блок управления Управляемый объект Счетчик shared_ptr
  • 14. Shared pointer: что из себя представляет Указатель на блок управления Указатель на данные Блок управления Управляемый объект Счетчик shared_ptr
  • 15. Shared pointer: снижение производительности void foo(std::shared_ptr<tBar> bar);
  • 16. Shared pointer: снижение производительности void foo(std::shared_ptr<tBar> bar); void foo(const std::shared_ptr<tBar> &bar); void foo(tBar *bar); void foo(tBar &bar);
  • 17. Shared pointer: снижение производительности struct SortPair { size_t sortKey; boost::shared_ptr<tBar> object; bool operator< (...) {...} } std::vector<SortPair> sort_pairs_vector; // fill the vector std::stable_sort( sort_pairs_vector.begin(), sort_pairs_vector.end());
  • 18. Shared pointer: снижение производительности struct SortPair { size_t sortKey; shared_ptr<tBar> object; tBar *object; bool operator< (...) {...} } std::vector<SortPair> sort_pairs_vector; // fill the vector std::stable_sort( sort_pairs_vector.begin(), sort_pairs_vector.end());
  • 19. Управление временем жизни ● “Старые” графические API (Direct3D 11-, OpenGL / OpenGL ES) ○ Достаточно дорогие вызовы API ○ Дорогие настолько, что использование синхронизации не является критичным
  • 20. Управление временем жизни GPU CPU Client CPU API Set Texture A Draw Release Texture A Set Texture B Draw API State Draw Draw
  • 21. Управление временем жизни ● “Новый” графические API (Direct3D 12, Vulcan, Metal*) ○ Достаточно дешевые вызовы API ○ Управление временем жизни объекта драйвером существенно влияет на стоимость вызова
  • 22. Управление временем жизни GPU CPU Client CPU API Set Descriptor table Draw Draw Draw Draw
  • 23. RTTI+исключения ● Традиционно отключаемое в крупных играх ○ Раздувает размер исполняемого файла (до 10%) ○ Влияет на производительность ○ Требует внимания при сборке
  • 24. RTTI ● Занимает место ○ Для каждого класса с vtable компилятор создает структуру std::type_id ○ Структура содержит строку в качестве идентификатора имени класса
  • 25. RTTI ● dynamic_cast<> обходит всю иерархию классов ○ Возможно, сравнивая строки для каждого узла (или их хеши) Class A Class B Class C Class D Class E
  • 26. исключения ● SetJump/LongJump ○ потребляет до 10% производительности даже если исключение не будет брошено ● “Zero-cost” ○ раздувает исполняемый файл ○ Если исключение брошено - дополнительные расходы на обработку ○ Рекомендуется использовать максимально редко
  • 28. ARM Cache - https://events.linuxfoundation.org/sites/events/files/slides/slides_10.pdf CPU cache cycles - http://www.7-cpu.com/ PS4 LLVM - https://llvm.org/devmtg/2013-11/slides/Robinson-PS4Toolchain.pdf Exceptions - https://mortoray.com/2013/09/12/the-true-cost-of-zero-cost-exceptions/
  • 29. Old style exceptions handling speed - http://www.codercorner.com/blog/?p=33 clang: no rtti or exceptions http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions

Editor's Notes

  1. Постараюсь избегать вкусовщины. Такое может произойти с каждым
  2. Разные компиляторы. GCC ушел, пришел LLVM: Нужно поддерживать сразу несколько платформ. Разные компиляторы (в основном MSVC и Clang/LLVM, но может быть GCC, или что-то экзотическое). Разные библиотеки STL Платформы по прежнему отстают в обновлении своих версий компилятора. Негативный опыт: Android NDK вышла без поддержки STL. Неизвестно, что произойдет при появлении новой платформы. (разница в восприятии при разработки крупных проектов и casual) Разработчики также отстают: необходимо гарантировать стабильность окружения, не сломалось - не чини.
  3. Зачастую поддержкой компилятора может заниматься один человек! SONY регулярно проводит мержи, вливает исправление багов в основную ветку Обновления отстают в связи с необходимостью тестирования Android: не могу припомнить безпроблемную разработку. Android: проблемы с отладкой, с профилированием.
  4. В общем случае непонятно, как изменится производительность, что произойдет со старыми багами. Не известно, сможет ли код вообще собраться (NDK 15 и unified headers. Boost перестал собираться).
  5. Ограничения: могут быть экстремальными, вплоть до C-like интерфейсов Vulcan: А вдруг появится платформа без поддержки С
  6. На каждом кадре однотипные повторяющиеся вычисления Есть потребность в максимальной эффективности кода. Как следствие - необходимо четкое понимание, что будет происходить за кулисами компилятора. Инфраструктурные потери, размазанные по приложению, практически невозможно исправить в дальнейшем, в отличии от алгоритмических (яркий пример - исключения, которые, до недавнего времени, стоили дорого вне зависимости от их возникновения). Для казуальных vs AAA: узкие места проявляются позже
  7. На каждом кадре однотипные повторяющиеся вычисления Есть потребность в максимальной эффективности кода. Как следствие - необходимо четкое понимание, что будет происходить за кулисами компилятора. Инфраструктурные потери, размазанные по приложению, практически невозможно исправить в дальнейшем, в отличии от алгоритмических (яркий пример - исключения, которые, до недавнего времени, стоили дорого вне зависимости от их возникновения). Для казуальных vs AAA: узкие места проявляются позже
  8. Затронем только простейшие моменты, необходимо уточнение.
  9. Boost
  10. Несколько лет назад были проблемы непосредственно с сортировкой. По какой-то причине в момент сортировки дергался счетчик. Сейчас проблема исчезла.
  11. Дескрипторы ресурсов и таблицы дескрипторов
  12. Каждая функция (почти) регистрирует создание объектов, границы try/catch блоков Zero-cost: таблица, которая по значению PC позволяет определить, какие объекты необходимо разрушить,