SlideShare a Scribd company logo
1 of 36
Многопоточность и игры
Igor Lobanchikov, 2019
Игорь Лобанчиков
• Разрабатываю игры с 2003 года
• S.T.A.L.K.E.R.: Clear Sky
• Работал с Intel, AMD, Qualcomm, Amazon, Confetti и другие
• Эксперт по компьютерной графике
• Помогаю улучшать и оптимизировать чужие проекты
• Портирую игры на новые платформы
• imixerpro(at)gmail(dot)com
2
О чем будем говорить
• Структура application loop
• История многопоточности в играх
• Как зарождалась
• Как развивалась
• Почему именно так, а не иначе
• Многопоточность сегодня
• Task-based
• Hybrid (Task-based + thread-based)
• Многопоточный рендеринг
• DX12 + Vulkan + Metal
3
Core 0
Структура application loop
Input Update Output
4
• 60 кадров в секунду (16.6 мс на кадр)
• 16.6мс vs 17.6мс = 60 FPS vs 57 FPS
• 33.3мс vs 34.4мс = 30 FPS vs 29 FPS
Core 0
Структура application loop
Input Update Render
5
1
%
49.5% 49.5%
Core 0
Структура application loop
I
n
p
u
t
Update Render
6
Core 0
Структура application loop
I
n
p
u
t
Update Render
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
Transform
Animation
blending
Visibility
culling
Batching
Submission
to GPU
7
• February 25, 2002, Xeon (2xSMT)
• Early 2003 MS announced XBox Next (3 cores w/2xSMT), launched November 22,
2005
• May 25, 2005, Pentium D (2 cores)
• May 2005, Athlon 64 X2 (2 cores)
• November 11, 2006 Sony launched PS3 (1 PowerPC 2xSMT core, 6 SPEs)
Core 0
Предпосылки возникновения
многопоточностиI
n
p
u
t
Update Render
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
Animation
blending
Visibility
culling
Batching
Submission
to GPU
???Core 1
Transform
8
• Основной парк игровых компьютеров - одноядерный
• Двух-ядерные CPU дороги
• Логические взаимосвязи между различными модулями сильны
ради увеличения производительности
• Консольное железо уникально и требует специального подхода
Core 0
Предпосылки возникновения
многопоточностиI
n
p
u
t
Update Render
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
Animation
blending
Visibility
culling
Batching
Submission
to GPU
???Core 1
Transform
9
• специальный отдельный поток с фиксированным порядком
выполнения задач, определенных на этапе компиляции
• минимально необходимые изменения в структурах данных
• максимально сохраняется порядок выполнения
• синхронизация с помощью conditional или их аналогов
• возможно, у каждой задачи свой поток, поскольку задач мало
Core 0
Threaded model: naive approach
I
n
p
u
t
Update Render
Update Game
Logic
Path finding
Animation
blending
Visibility
culling
Batching
Submission to
GPU
Core 1
Transform
Audio
rendering
Collision /
Simulation
Visibility
culling
Resource
streaming
GPU driver
thread
10
• Незначительный прирост производительности
• Плохо масштабируется при увеличении количества ядер
• плохо подходит для XBox360/PS3
Core 0
Threaded model: naive approach
НедостаткиI
n
p
u
t
Update Render
Update Game
Logic
Path finding
Animation
blending
Visibility
culling
Batching
Submission to
GPU
Core 1
Transform
Audio
rendering
Collision /
Simulation
Visibility
culling
Resource
streaming
GPU driver
thread
11
• Независимые пространства объектов для Update и Render все еще
позволяют использовать старый однопоточный код
• Обновление состояния render через single writer single reader lock
free кольцевой буфер
• Можно сбалансировать нагрузку для любого, заранее заданного,
количества ядер - хорошо сработало для Xbox 360
Core 0
Threaded model: независимые системы
I
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
???Core 1 Render
Animation
blending
Visibility
culling
Batching
Submission
to GPU
Transform
I
n
p
u
t
12
• Существенные затраты на создание независимых структур данных
• Все несколько сложнее, чем выглядит, поскольку результаты работы
систем могут быть нужны в обоих потоках (например, скиннинг)
• Не масштабируется для произвольного количества ядер
• PS3 в силу наличия только одного полноценного 2xSMT ядра требовала
еще более глубокой адаптации
Threaded model: независимые системы
Недостатки
???Core 1 Render
Animation
blending
Visibility
culling
Batching
Submission
to GPU
Transform
Core 0
I
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
I
n
p
u
t
13
Threaded model: ???
???Core 1 Render
Animation
blending
Visibility
culling
Batching
Submission
to GPU
Transform
Core 0
I
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
Queue 1 Queue 2 Queue N
Key Ref Key Ref Key Ref
Render
Object
Path
finding
I
n
p
u
t
14
Threaded model: ???
???Core 1 Render
Animation
blending
Visibility
culling
Batching
Submission
to GPU
Transform
Core 0
I
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Sorted
render list
Key Ref Key Ref Key Ref
Mesh
Object list
Shaders Textures
Instance
data
Path
finding
I
n
p
u
t
15
• очереди на отрисовку формируются из объектов (или мешей) и их
состояний: положения в пространстве, анимации и т.п.
• Можно пользоваться старыми однопоточными структурами данных
• Самая дорогая и неделимая часть выполняется параллельно основному
потоку
• Можно сбалансировать нагрузку для любого, заранее заданного, количества
ядер - хорошо сработало для Xbox 360
Core 0
Threaded model: draw list generation
I
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
???Core 1
Ani
mat
ion
ble
ndi
ng
Visibility
culling
Batching Submission to GPU
Tr
a
ns
fo
r
m
I
n
p
u
t
16
• Все еще необходимо гарантировать время жизни моделей,
мешей, текстур (без boost::shared_ptr)
• Выше асимметрия нагрузки потока, чем для независимых систем
• Не масштабируется для произвольного количества ядер
• те же проблемы с PS3, что и для независимых систем
Core 0
Threaded model: draw list generation
НедостаткиI
n
p
u
t
Update
Update
Game Logic
Collision /
Simulation
Audio
rendering
Path
finding
???Core 1
Ani
mat
ion
ble
ndi
ng
Batching Submission to GPU
Tr
a
ns
fo
r
m
Visibility
culling
I
n
p
u
t
17
Куда дальше?
• Все переписать и сделать правильно
• Data-driven approach
• Task-based approach
• C++ 17
• AGILE
• GIT
• Data science
• Block chain
18
Реальный мир
• Количество производственных ресурсов ограничено: люди,
деньги не бесконечны
• Необходимо продолжить выпускать игры
• Количество ядер у пользователя 1-2-4 с топовыми
конфигурациями 8-16
• На горизонте новые консоли (первые дев киты попали к
разработчикам в 2011 году)
• Много специализированного PS3 кода для использования 6 ядер
SPU
19
Чего мы хотим от многопоточности
• минимизация накладных расходов
• минимум синхронизаций между потоками
• максимизация загрузки всего CPU
• минимизация конфликтов между кешами разных ядер (т.е. не
пишем туда, откуда читает другой поток, и, тем более, не пишем в
одно и то же место из разных потоков)
20
Что уже реализовано
• у нас уже есть определенные гарантии на неизменность
некоторых состояний объектов и на время их жизни
??? Objects can be read from other threads
Update
objects
Flush lazy
computations
Delete pending
objects
21
Что уже реализовано
• у нас уже есть определенные гарантии на неизменность
некоторых состояний объектов и на время их жизни
• мы уже умеем работать с быстрыми очередями (1R/1W)
Calculate
data
Send data
update
???
Apply data
update
Process old data Process new data
22
Что уже реализовано
• у нас уже есть определенные гарантии на неизменность
некоторых состояний объектов и на время их жизни
• мы уже умеем работать с быстрыми очередями (1R/1W)
• Мы уже научились не выделять память как попало (до появления
многопоточности тоже умели)
23
Task-based parallelism
• task manager
• выносим код из потоков в таски
• таски не модифицируют глобальные данные, но формируют новые
• а некоторые и на вход получают буфер с данными
• используем где возможно data parallel таски (если порядок обработки не
важен)
• каждый поток таска при этом генерирует свой собственный выходной
буфер (нет проблем с синхронизацией, нет проблем с кешом)
• при необходимости по завершению работы буфера будут объединены
24
???
???
???
???
Core 0
Task-based parallelism: submission to GPU
занимает много времениI
n
p
u
t
Update
Update
Game Logic
Collision / Simulation
Audio rendering
Path finding
Core 1
Anim
ation
blen
ding
Batching
Submission to GPU for previous frame
Transfo
rm
Core 2
Core N
Ani
mat
ion
ble
ndi
ng
Visibility
culling
Visibility
culling
GPU driver thread
Submission to GPU
I
n
p
u
t
Update
Game Logic
25
???
???
???
???
Core 0
Task-based parallelism: submission to GPU
требует неизменности данныхI
n
p
u
t
Update
Update
Game Logic
Collision / Simulation
Audio rendering
Path finding
Core 1
Anim
ation
blen
ding
Batching
Transfo
rm
Core 2
Core N
Ani
mat
ion
ble
ndi
ng
Visibility
culling
Visibility
culling
GPU driver thread
Submission to GPU
I
n
p
u
t
Update
Game Logic
26
???
Общение CPU<->GPU
Set
texture
DrawCPU
GPU
command
buffer
Set
resources
Process CB
Set
texture
Draw
Set
resources
Draw Draw
Driver
27
“Старые” графические API
• (Direct3D 11-, OpenGL / OpenGL ES)
• много проверок и дополнительной работы на лету, достаточно
дорогие вызовы API
• захват времени жизни объектов
• некоторые объекты API далеки от реальных объектов GPU
28
???
“Старые” графические API
управление резидентностью ресурсов
???
???
Set
texture
DrawClient
GPU
command
buffer
Driver
Texture
residence
manager
Draw
Set
resources
Flush unused
textures
Restore used
textures
Process CB
Set
texture
Draw
Draw
Set
resources
Draw Draw
State cache State cache
29
“Старые” графические API
управление состоянием GPU
???
???
Set Pixel
Shader
DrawClient
GPU
Driver
State cache Draw
Set state
object
Process CB
Set Pixel
Shader
Draw
Draw
Set state
object
Draw Draw
Set Vertex
Shader
State cache
Set Vertex
Shader
command
buffer
30
DirectX 12 / Vulkan / Metal
• DirectX 12 - июль 2015, Vulkan - февраль 2016, Metal - сентябрь
2014
• Большую часть работы переложили на клиентский код
31
???
“Новые” графические API
управление резидентностью ресурсов
Set
resources
DrawClient
GPU
command
buffer
Driver
Set
resources
Process CB
Set
resources
Draw
Set
resources
Draw Draw
Flush unused
textures
Restore used
textures
Manage textures
residency
32
???
“Новые” графические API
управление состоянием GPU
Set state
object
DrawClient
GPU
Driver
Set state
object
Process CB
Set state
object
Draw
Set state
object
Draw Draw
command
buffer
33
???
???
???
???
Core 0
Task-based parallelism + современные
графические APII
n
p
u
t
Update
Update
Game Logic
Collision / Simulation
Audio rendering
Path finding
Core 1
Anim
ation
blen
ding
Batching
Transfo
rm
Core 2
Core N
Ani
mat
ion
ble
ndi
ng
Visibility
culling
Visibility
culling
I
n
p
u
t
Update
Game Logic
Submission to
GPU
Submission to
GPU
Submission to
GPU
Submission to
GPU
34
Q&A
• Вопросы?
35
Links
• https://github.com/dougbinks/enkiTS
• https://www.enkisoftware.com/devlogpost-20150822-1-
Implementing_a_lightweight_task_scheduler
• https://www.enkisoftware.com/devlogpost-20150905-1-
Internals_of_a_lightweight_task_scheduler
• https://www.slideshare.net/jrouwe/killzone-shadow-fall-threading-the-
entity-update-on-ps4
• https://www.gdcvault.com/play/1022164/Multithreading-the-Entire-
Destiny
• http://s09.idav.ucdavis.edu/talks/05-JP_id_Tech_5_Challenges.pdf
36

More Related Content

What's hot

Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)Ontico
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон ТурецкийCodeFest
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей АкиньшинCodeFest
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Fwdays
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Ontico
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for YandexMax Lapshin
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...Nikolay Samokhvalov
 
Что и почему писать на Erlang
Что и почему писать на ErlangЧто и почему писать на Erlang
Что и почему писать на ErlangMax Lapshin
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays HighloadYehor Herasymchuk
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangYury Yurevich
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...Ontico
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустяYuriy Nasretdinov
 
JPHP - О проекте на простом языке
JPHP - О проекте на простом языкеJPHP - О проекте на простом языке
JPHP - О проекте на простом языкеDmitry Zaytsev
 
Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Minsk Linux User Group
 
Отличие Erlang от объектных языков
Отличие Erlang от объектных языковОтличие Erlang от объектных языков
Отличие Erlang от объектных языковMax Lapshin
 

What's hot (20)

Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей Акиньшин
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
 
Erlang for Yandex
Erlang for YandexErlang for Yandex
Erlang for Yandex
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
Что и почему писать на Erlang
Что и почему писать на ErlangЧто и почему писать на Erlang
Что и почему писать на Erlang
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload2020.10.13 HA Redis is simple. FWDays Highload
2020.10.13 HA Redis is simple. FWDays Highload
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
Лев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про ErlangЛев Валкин — Кое-что про Erlang
Лев Валкин — Кое-что про Erlang
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
JPHP - О проекте на простом языке
JPHP - О проекте на простом языкеJPHP - О проекте на простом языке
JPHP - О проекте на простом языке
 
Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?
 
Отличие Erlang от объектных языков
Отличие Erlang от объектных языковОтличие Erlang от объектных языков
Отличие Erlang от объектных языков
 

Similar to Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019

Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокRoman_Lut
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
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
 
Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)DevGAMM Conference
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковDevGAMM Conference
 
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 GamesWhite Nights Conference
 
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”HYS Enterprise
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не оченьcorehard_by
 
Сервисы Azure для научных исследований
Сервисы Azure для научных исследованийСервисы Azure для научных исследований
Сервисы Azure для научных исследованийMicrosoft
 
Unity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiUnity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiRoman Chehowski
 
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Ontico
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыОбработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыVsevolod Shabad
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"Yandex
 
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 consolesDevGAMM Conference
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)Ontico
 
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиАндрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиIBS
 
ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019Andrey Tatarinov
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Ontico
 

Similar to Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019 (20)

Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
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 ...
 
Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
 
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
 
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
Сервисы Azure для научных исследований
Сервисы Azure для научных исследованийСервисы Azure для научных исследований
Сервисы Azure для научных исследований
 
Unity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiUnity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman Chehowski
 
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
Опыт работы с LuaJIT в нагруженных интернет-проектах / Александр Гладыш (Logi...
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыОбработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"
 
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
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
 
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиАндрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
 
ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 

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 Kazakovacorehard_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 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_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
 

Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019

  • 2. Игорь Лобанчиков • Разрабатываю игры с 2003 года • S.T.A.L.K.E.R.: Clear Sky • Работал с Intel, AMD, Qualcomm, Amazon, Confetti и другие • Эксперт по компьютерной графике • Помогаю улучшать и оптимизировать чужие проекты • Портирую игры на новые платформы • imixerpro(at)gmail(dot)com 2
  • 3. О чем будем говорить • Структура application loop • История многопоточности в играх • Как зарождалась • Как развивалась • Почему именно так, а не иначе • Многопоточность сегодня • Task-based • Hybrid (Task-based + thread-based) • Многопоточный рендеринг • DX12 + Vulkan + Metal 3
  • 4. Core 0 Структура application loop Input Update Output 4
  • 5. • 60 кадров в секунду (16.6 мс на кадр) • 16.6мс vs 17.6мс = 60 FPS vs 57 FPS • 33.3мс vs 34.4мс = 30 FPS vs 29 FPS Core 0 Структура application loop Input Update Render 5
  • 6. 1 % 49.5% 49.5% Core 0 Структура application loop I n p u t Update Render 6
  • 7. Core 0 Структура application loop I n p u t Update Render Update Game Logic Collision / Simulation Audio rendering Path finding Transform Animation blending Visibility culling Batching Submission to GPU 7
  • 8. • February 25, 2002, Xeon (2xSMT) • Early 2003 MS announced XBox Next (3 cores w/2xSMT), launched November 22, 2005 • May 25, 2005, Pentium D (2 cores) • May 2005, Athlon 64 X2 (2 cores) • November 11, 2006 Sony launched PS3 (1 PowerPC 2xSMT core, 6 SPEs) Core 0 Предпосылки возникновения многопоточностиI n p u t Update Render Update Game Logic Collision / Simulation Audio rendering Path finding Animation blending Visibility culling Batching Submission to GPU ???Core 1 Transform 8
  • 9. • Основной парк игровых компьютеров - одноядерный • Двух-ядерные CPU дороги • Логические взаимосвязи между различными модулями сильны ради увеличения производительности • Консольное железо уникально и требует специального подхода Core 0 Предпосылки возникновения многопоточностиI n p u t Update Render Update Game Logic Collision / Simulation Audio rendering Path finding Animation blending Visibility culling Batching Submission to GPU ???Core 1 Transform 9
  • 10. • специальный отдельный поток с фиксированным порядком выполнения задач, определенных на этапе компиляции • минимально необходимые изменения в структурах данных • максимально сохраняется порядок выполнения • синхронизация с помощью conditional или их аналогов • возможно, у каждой задачи свой поток, поскольку задач мало Core 0 Threaded model: naive approach I n p u t Update Render Update Game Logic Path finding Animation blending Visibility culling Batching Submission to GPU Core 1 Transform Audio rendering Collision / Simulation Visibility culling Resource streaming GPU driver thread 10
  • 11. • Незначительный прирост производительности • Плохо масштабируется при увеличении количества ядер • плохо подходит для XBox360/PS3 Core 0 Threaded model: naive approach НедостаткиI n p u t Update Render Update Game Logic Path finding Animation blending Visibility culling Batching Submission to GPU Core 1 Transform Audio rendering Collision / Simulation Visibility culling Resource streaming GPU driver thread 11
  • 12. • Независимые пространства объектов для Update и Render все еще позволяют использовать старый однопоточный код • Обновление состояния render через single writer single reader lock free кольцевой буфер • Можно сбалансировать нагрузку для любого, заранее заданного, количества ядер - хорошо сработало для Xbox 360 Core 0 Threaded model: независимые системы I n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding ???Core 1 Render Animation blending Visibility culling Batching Submission to GPU Transform I n p u t 12
  • 13. • Существенные затраты на создание независимых структур данных • Все несколько сложнее, чем выглядит, поскольку результаты работы систем могут быть нужны в обоих потоках (например, скиннинг) • Не масштабируется для произвольного количества ядер • PS3 в силу наличия только одного полноценного 2xSMT ядра требовала еще более глубокой адаптации Threaded model: независимые системы Недостатки ???Core 1 Render Animation blending Visibility culling Batching Submission to GPU Transform Core 0 I n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding I n p u t 13
  • 14. Threaded model: ??? ???Core 1 Render Animation blending Visibility culling Batching Submission to GPU Transform Core 0 I n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding Queue 1 Queue 2 Queue N Key Ref Key Ref Key Ref Render Object Path finding I n p u t 14
  • 15. Threaded model: ??? ???Core 1 Render Animation blending Visibility culling Batching Submission to GPU Transform Core 0 I n p u t Update Update Game Logic Collision / Simulation Audio rendering Sorted render list Key Ref Key Ref Key Ref Mesh Object list Shaders Textures Instance data Path finding I n p u t 15
  • 16. • очереди на отрисовку формируются из объектов (или мешей) и их состояний: положения в пространстве, анимации и т.п. • Можно пользоваться старыми однопоточными структурами данных • Самая дорогая и неделимая часть выполняется параллельно основному потоку • Можно сбалансировать нагрузку для любого, заранее заданного, количества ядер - хорошо сработало для Xbox 360 Core 0 Threaded model: draw list generation I n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding ???Core 1 Ani mat ion ble ndi ng Visibility culling Batching Submission to GPU Tr a ns fo r m I n p u t 16
  • 17. • Все еще необходимо гарантировать время жизни моделей, мешей, текстур (без boost::shared_ptr) • Выше асимметрия нагрузки потока, чем для независимых систем • Не масштабируется для произвольного количества ядер • те же проблемы с PS3, что и для независимых систем Core 0 Threaded model: draw list generation НедостаткиI n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding ???Core 1 Ani mat ion ble ndi ng Batching Submission to GPU Tr a ns fo r m Visibility culling I n p u t 17
  • 18. Куда дальше? • Все переписать и сделать правильно • Data-driven approach • Task-based approach • C++ 17 • AGILE • GIT • Data science • Block chain 18
  • 19. Реальный мир • Количество производственных ресурсов ограничено: люди, деньги не бесконечны • Необходимо продолжить выпускать игры • Количество ядер у пользователя 1-2-4 с топовыми конфигурациями 8-16 • На горизонте новые консоли (первые дев киты попали к разработчикам в 2011 году) • Много специализированного PS3 кода для использования 6 ядер SPU 19
  • 20. Чего мы хотим от многопоточности • минимизация накладных расходов • минимум синхронизаций между потоками • максимизация загрузки всего CPU • минимизация конфликтов между кешами разных ядер (т.е. не пишем туда, откуда читает другой поток, и, тем более, не пишем в одно и то же место из разных потоков) 20
  • 21. Что уже реализовано • у нас уже есть определенные гарантии на неизменность некоторых состояний объектов и на время их жизни ??? Objects can be read from other threads Update objects Flush lazy computations Delete pending objects 21
  • 22. Что уже реализовано • у нас уже есть определенные гарантии на неизменность некоторых состояний объектов и на время их жизни • мы уже умеем работать с быстрыми очередями (1R/1W) Calculate data Send data update ??? Apply data update Process old data Process new data 22
  • 23. Что уже реализовано • у нас уже есть определенные гарантии на неизменность некоторых состояний объектов и на время их жизни • мы уже умеем работать с быстрыми очередями (1R/1W) • Мы уже научились не выделять память как попало (до появления многопоточности тоже умели) 23
  • 24. Task-based parallelism • task manager • выносим код из потоков в таски • таски не модифицируют глобальные данные, но формируют новые • а некоторые и на вход получают буфер с данными • используем где возможно data parallel таски (если порядок обработки не важен) • каждый поток таска при этом генерирует свой собственный выходной буфер (нет проблем с синхронизацией, нет проблем с кешом) • при необходимости по завершению работы буфера будут объединены 24
  • 25. ??? ??? ??? ??? Core 0 Task-based parallelism: submission to GPU занимает много времениI n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding Core 1 Anim ation blen ding Batching Submission to GPU for previous frame Transfo rm Core 2 Core N Ani mat ion ble ndi ng Visibility culling Visibility culling GPU driver thread Submission to GPU I n p u t Update Game Logic 25
  • 26. ??? ??? ??? ??? Core 0 Task-based parallelism: submission to GPU требует неизменности данныхI n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding Core 1 Anim ation blen ding Batching Transfo rm Core 2 Core N Ani mat ion ble ndi ng Visibility culling Visibility culling GPU driver thread Submission to GPU I n p u t Update Game Logic 26
  • 28. “Старые” графические API • (Direct3D 11-, OpenGL / OpenGL ES) • много проверок и дополнительной работы на лету, достаточно дорогие вызовы API • захват времени жизни объектов • некоторые объекты API далеки от реальных объектов GPU 28
  • 29. ??? “Старые” графические API управление резидентностью ресурсов ??? ??? Set texture DrawClient GPU command buffer Driver Texture residence manager Draw Set resources Flush unused textures Restore used textures Process CB Set texture Draw Draw Set resources Draw Draw State cache State cache 29
  • 30. “Старые” графические API управление состоянием GPU ??? ??? Set Pixel Shader DrawClient GPU Driver State cache Draw Set state object Process CB Set Pixel Shader Draw Draw Set state object Draw Draw Set Vertex Shader State cache Set Vertex Shader command buffer 30
  • 31. DirectX 12 / Vulkan / Metal • DirectX 12 - июль 2015, Vulkan - февраль 2016, Metal - сентябрь 2014 • Большую часть работы переложили на клиентский код 31
  • 32. ??? “Новые” графические API управление резидентностью ресурсов Set resources DrawClient GPU command buffer Driver Set resources Process CB Set resources Draw Set resources Draw Draw Flush unused textures Restore used textures Manage textures residency 32
  • 33. ??? “Новые” графические API управление состоянием GPU Set state object DrawClient GPU Driver Set state object Process CB Set state object Draw Set state object Draw Draw command buffer 33
  • 34. ??? ??? ??? ??? Core 0 Task-based parallelism + современные графические APII n p u t Update Update Game Logic Collision / Simulation Audio rendering Path finding Core 1 Anim ation blen ding Batching Transfo rm Core 2 Core N Ani mat ion ble ndi ng Visibility culling Visibility culling I n p u t Update Game Logic Submission to GPU Submission to GPU Submission to GPU Submission to GPU 34
  • 36. Links • https://github.com/dougbinks/enkiTS • https://www.enkisoftware.com/devlogpost-20150822-1- Implementing_a_lightweight_task_scheduler • https://www.enkisoftware.com/devlogpost-20150905-1- Internals_of_a_lightweight_task_scheduler • https://www.slideshare.net/jrouwe/killzone-shadow-fall-threading-the- entity-update-on-ps4 • https://www.gdcvault.com/play/1022164/Multithreading-the-Entire- Destiny • http://s09.idav.ucdavis.edu/talks/05-JP_id_Tech_5_Challenges.pdf 36

Editor's Notes

  1. До настоящего времени консоли так же были одноядерными. PS2 - неоднородная система с уникальными вычислительными блоками. Код для нее можно было бы считать многопоточным. GPU, фактически, так же отдельный поток. Но, в норме, данные туда передаются и оттуда не забираются
  2. В результате PS3 версия движка обложена огромным количеством операций условной компиляции даже в общем и условно “платформо-независимом” коде
  3. В результате PS3 версия движка обложена огромным количеством операций условной компиляции даже в общем и условно “платформо-независимом” коде
  4. Двойная буферизация в действии.
  5. Я ничего модного не упустил?
  6. на консолях больше контроля - больше гарантий. бэкпортится на PC
  7. на консолях больше контроля - больше гарантий. бэкпортится на PC
  8. на консолях больше контроля - больше гарантий. бэкпортится на PC
  9. количество тасков - минимально. Так проще контролировать. все это требует дополнительной памяти, которая у нас уже есть: и на консолях (там пока еще тесновато), и уж точно на PC. Несколько дополнительных мегабайт под рабочие буфера занимают много меньше места, чем графические ресурсы
  10. Здесь нет particle simulation - все стараются делать на GPU В итоге на достаточно быстром и многоядерном CPU мы упираемся вsubmission to gpu. На консолях таких проблем нет (почти)
  11. если разработчик изначально начал с тасков минуя предыдущие модели и не имеет независимых систем и/или draw list generation подхода в таких случаях update logic так же стараются бить на таски: перекрытие с рендерингом у игровой логики отсутствует, значит, пока игровая логика обновляется, есть много свободных ядер
  12. CPU и GPU - асинхронные системы. Поэтому команды между ними передаются с помощью очереди команд, которая, в свою очередь, состоит из command buffer. Драйвер буфер заполняет и отдает на GPU. В свою очередь, секвенсор GPU забирает буфера команд из очереди и последовательно их обрабатывает. В идеальном мире драйвер бы только и делал, что преобразовывал команды.
  13. Не имело смысла писать многопоточный код драйвер управлял временем жизни ресурсов некоторые скрытые ресурсы генерировались на лету
  14. Счастливое ближайшее будущее (для многих уже настоящее) На консолях всегда так было
  15. Вообще, это не совсем правда и первое приближение, поскольку разные API все же могут иметь отличные подходы управления ресурсами, DX12 предлагает даже 2 подхода.
  16. Во избежание аллокаций памяти - а это те же синхронизации внутри хипа, используем кольцевые буфера или двойную буферизацию Т.е. мы всеми способами стараемся избегать лишних блокировок. Если данные необходимо обновить в другой системе, мы передаем в нее буфер команд (возможно, неявно). Внутри системы секвенсор разберется, что с командами делать. Если данные данной системы нужны снаружи, мы так же стараемся обновлять их только в те промежутки времени, когда они никем не используются. В результате, вместо множественных синхронизаций между потоками мы синхронизируем их исключительно в ключевых точках.
  17. каждую изолированную систему можно разбивать на параллельные задания независимо от других