UDP vs TCP
Пост в блоге, о разнице между UDP и TCP для мультиплеерных игр.
Virtual Connection over UDP
Reliability and Congestion Avoidance over UDP
Как сделать свой аналог TCP поверх UDP. Это позволяет использовать только UDP для создания надежного соединения для критичных данных и ненадежного для часто обновляемых данных.
#cpp #backend
Пост в блоге, о разнице между UDP и TCP для мультиплеерных игр.
Virtual Connection over UDP
Reliability and Congestion Avoidance over UDP
Как сделать свой аналог TCP поверх UDP. Это позволяет использовать только UDP для создания надежного соединения для критичных данных и ненадежного для часто обновляемых данных.
#cpp #backend
Размер кэшлинии и страницы памяти
Для x86/x64 архитектуры:
* кэшлиния: 64 байта
* страница: 4Кб
Можно увеличить до 4Мб если активировать large pages
Для ARMv7 архитектуры:
* кэшлиния: 64 байта
* страницы: 4Кб, 64Кб, 1Мб
Для ARMv8 архитектуры:
* кэшлиния: 64 байта
* страницы: кратные 4Кб, 16Кб, 64Кб в зависимости от ЦП.
источник
Для Mac M1 (ARMv8):
* кэшлиния: 128 байт
* страница: 16Кб
Зачем нужно знать размер кэш линии и так понятно (DOD, lock-free, false sharing), а вот размер страницы памяти нужен не так часто.
В некоторых рекомендациях по оптимизации говорят, что копирование между страницами памяти работает быстрее.
Еще есть нюансы по работе встроенного аллокатора в C++, он выделяет страницу памяти и разбивает ее на мелкие блоки, при этом аллокация страницы памяти намного медленее, чем поиск свободного блока.
#blog
Для x86/x64 архитектуры:
* кэшлиния: 64 байта
* страница: 4Кб
Можно увеличить до 4Мб если активировать large pages
Для ARMv7 архитектуры:
* кэшлиния: 64 байта
* страницы: 4Кб, 64Кб, 1Мб
Для ARMv8 архитектуры:
* кэшлиния: 64 байта
* страницы: кратные 4Кб, 16Кб, 64Кб в зависимости от ЦП.
источник
Для Mac M1 (ARMv8):
* кэшлиния: 128 байт
* страница: 16Кб
Зачем нужно знать размер кэш линии и так понятно (DOD, lock-free, false sharing), а вот размер страницы памяти нужен не так часто.
В некоторых рекомендациях по оптимизации говорят, что копирование между страницами памяти работает быстрее.
Еще есть нюансы по работе встроенного аллокатора в C++, он выделяет страницу памяти и разбивает ее на мелкие блоки, при этом аллокация страницы памяти намного медленее, чем поиск свободного блока.
#blog
Adventures with Deferred Texturing in 'Horizon Forbidden West'
Начинают сразу с низкоуровневых оптимизаций, поэтому лучше посмотреть слайды 61..63, там граф кадра, по которому уже проще будет понять что происходит.
Из интересного - рисование мелкой геометрии используя visibility buffer, трансформацию и растеризацию в компьют шейдере, при этом трансформация и растеризация запускаются поочередно, чтобы использовать промежуточный буфер вершин фиксированного размера. В результате получился гибрид обычного рендера и некого аналога Nanite.
1..14 - детально разбирают в чем проблема рисования мелких треугольников.
15..19 - для оптимизации мелкой геометрии испоьлзуют visibility buffer.
20..25 - visibility buffer дополнили UV, ddx/ddy и ID материала. Вместо компьют шейдера используют фрагментный, а материал выбирается через тест глубины, где буфер глубины - 16 битный ID матриала.
26..36 - параллельно с рисованием каскадов теней используется асинхронный компьют для наложения матриалов на геометрию из visibility buffer и опять хитрые оптимизации.
37..46 - трансформация вершин сделана на асинхронном компьюте, трансформированные вершины сохраняются во временный буфер и отправлются на растеризацию также в компьют шейдере (слайды 26..36). Геометрия разбита на батчи до 64к треугольников, примерно как мешлеты.
47..68 - дальше идут детали реализации.
69..91 - variable rate shading (VRS) устанавливается для примитивов, что необычно.
#gpu_opt #vis_buf #VRS
Начинают сразу с низкоуровневых оптимизаций, поэтому лучше посмотреть слайды 61..63, там граф кадра, по которому уже проще будет понять что происходит.
Из интересного - рисование мелкой геометрии используя visibility buffer, трансформацию и растеризацию в компьют шейдере, при этом трансформация и растеризация запускаются поочередно, чтобы использовать промежуточный буфер вершин фиксированного размера. В результате получился гибрид обычного рендера и некого аналога Nanite.
1..14 - детально разбирают в чем проблема рисования мелких треугольников.
15..19 - для оптимизации мелкой геометрии испоьлзуют visibility buffer.
20..25 - visibility buffer дополнили UV, ddx/ddy и ID материала. Вместо компьют шейдера используют фрагментный, а материал выбирается через тест глубины, где буфер глубины - 16 битный ID матриала.
26..36 - параллельно с рисованием каскадов теней используется асинхронный компьют для наложения матриалов на геометрию из visibility buffer и опять хитрые оптимизации.
37..46 - трансформация вершин сделана на асинхронном компьюте, трансформированные вершины сохраняются во временный буфер и отправлются на растеризацию также в компьют шейдере (слайды 26..36). Геометрия разбита на батчи до 64к треугольников, примерно как мешлеты.
47..68 - дальше идут детали реализации.
69..91 - variable rate shading (VRS) устанавливается для примитивов, что необычно.
#gpu_opt #vis_buf #VRS
Addressing Criticism of RISC-V Microprocessors
перевод
Об отличии ARM от RISC-V. Малополезно для оптимизации, но интересно посмотреть насколько разные у них подходы.
#hw #arm #riscv
перевод
Об отличии ARM от RISC-V. Малополезно для оптимизации, но интересно посмотреть насколько разные у них подходы.
#hw #arm #riscv
Compute versus Hardware
Сравнение растеризации треугольников на фиксиованном конвеере и компьют шейдере (как в Nanite) на разном железе.
Почти на всем современном железе получается быстрее растеризация в компьют шейдере, исключение только Adreno 660.
Интересно что mesh shader оказался медленее компьют шейдера, видимо все упирается в фиксированный конвеер.
#gpu_opt
Сравнение растеризации треугольников на фиксиованном конвеере и компьют шейдере (как в Nanite) на разном железе.
Почти на всем современном железе получается быстрее растеризация в компьют шейдере, исключение только Adreno 660.
Интересно что mesh shader оказался медленее компьют шейдера, видимо все упирается в фиксированный конвеер.
#gpu_opt
An Overview of the Diablo II: Resurrected Renderer
1..34 - общий обзор рендер пайплайна
39..47 - В игре используется фиксированый угол обзора, за счет этого они использовали интересный способ оптимизации освещения.
Освещение записывается в 3D текстуру 32х8х32 и используется вместо light probe.
56..71 - порядко-независимая прозрачность (Weighted blended OIT), для такой нагруженной на эффекты игры это хорошая оптимизация.
74..88 - показывают сколько занимает каждый проход на XBox. Судя по всему использование варпов у них далеко от 100% и есть куда оптимизировать.
#cg #OIT
1..34 - общий обзор рендер пайплайна
39..47 - В игре используется фиксированый угол обзора, за счет этого они использовали интересный способ оптимизации освещения.
Освещение записывается в 3D текстуру 32х8х32 и используется вместо light probe.
56..71 - порядко-независимая прозрачность (Weighted blended OIT), для такой нагруженной на эффекты игры это хорошая оптимизация.
74..88 - показывают сколько занимает каждый проход на XBox. Судя по всему использование варпов у них далеко от 100% и есть куда оптимизировать.
#cg #OIT
GDC2022 AMD Ryzen Processor Software Optimization, (video)
19 - некоторые ядра ЦП могут работать быстрее других. Получается у ОС есть больше информации о ЦП, чем доступно из API.
35..41 - Весьма странный тест на производительность, из интересного разве что использование
44..46 - Наглядно показаны кэш промахи при чтении полей структуры, классический array of structure vs structure of arrays.
47..48 - Пример использования
49 - Оптимизация memcpy за счет выравнивания памяти, 64 байт - хорошо, 4Кб - еще лучше.
#cpu_opt #amd_cpu
19 - некоторые ядра ЦП могут работать быстрее других. Получается у ОС есть больше информации о ЦП, чем доступно из API.
35..41 - Весьма странный тест на производительность, из интересного разве что использование
_mm_pause()
при зацикливании на спинлоке.44..46 - Наглядно показаны кэш промахи при чтении полей структуры, классический array of structure vs structure of arrays.
47..48 - Пример использования
_mm_prefetch()
.49 - Оптимизация memcpy за счет выравнивания памяти, 64 байт - хорошо, 4Кб - еще лучше.
#cpu_opt #amd_cpu
How Halo Infinite's Bots Make Decisions
Весьма поверхностное описание, как сделан ИИ ботов в Halo.
Зато ссылаются на более подрбную презентацию о принятии решений на основе рассчитанного веса:
GDC 2010 - Improving AI Decision Modeling Through Utility Theory, (video)
#game_ai
Весьма поверхностное описание, как сделан ИИ ботов в Halo.
Зато ссылаются на более подрбную презентацию о принятии решений на основе рассчитанного веса:
GDC 2010 - Improving AI Decision Modeling Through Utility Theory, (video)
#game_ai
Gdcvault
Thinking Like Players: How 'Halo Infinite's' Multiplayer Bots Make Decisions
Geometry Rendering Pipeline Architecture
Как и в Horizon Forbidden West используется гибрид forward+ или deferred и visibility buffer.
Опятьже много общего с nanite: нарезание на мешлеты, тест видимости.
#cg #vis_buf
Как и в Horizon Forbidden West используется гибрид forward+ или deferred и visibility buffer.
Опятьже много общего с nanite: нарезание на мешлеты, тест видимости.
#cg #vis_buf
Activision
Geometry Rendering Pipeline Architecture
Development and Deployment of Multiplayer Online Games
Бета версия книги в открытом доступе.
Разбирается все возможные темы связанные с написанием ММО. Наиболее полезна сетевая часть.
Например:
Server-Side MMO Architecture, Front-End Servers and Client-Side Random Load Balancing
#backend
Бета версия книги в открытом доступе.
Разбирается все возможные темы связанные с написанием ММО. Наиболее полезна сетевая часть.
Например:
Server-Side MMO Architecture, Front-End Servers and Client-Side Random Load Balancing
#backend
(video) Transform your geometry with Metal mesh shaders
Mesh shader в Metal.
API не сильно отличается от Vk/DX12, так что портирование не должно вызвать затруднения.
Object shader (task shader в Vk/DX12) проверяет видимость мешлетов и запускает нужное количество меш групп.
Mesh shader генерирует или читает и трансформирует вершины мешлета.
Дальше все как обычно - позиция трансформируется в экранную, нарезаются тайлы и запускается потайловая растеризация.
То есть в отличие от десктопа, где все вершинны всегда в кэше, здесь в любом случае сгенерированные вершины выгружаются в системную память после нарезания на тайлы, чтобы освободить кэш для растеризации тайла.
Все преимущество только в отсечении невидимых мешлетов на ГП и в выборе уровне детализации. Все это можно было сделать и до меш шейдера.
#metal #apple_gpu
Mesh shader в Metal.
API не сильно отличается от Vk/DX12, так что портирование не должно вызвать затруднения.
Object shader (task shader в Vk/DX12) проверяет видимость мешлетов и запускает нужное количество меш групп.
Mesh shader генерирует или читает и трансформирует вершины мешлета.
Дальше все как обычно - позиция трансформируется в экранную, нарезаются тайлы и запускается потайловая растеризация.
То есть в отличие от десктопа, где все вершинны всегда в кэше, здесь в любом случае сгенерированные вершины выгружаются в системную память после нарезания на тайлы, чтобы освободить кэш для растеризации тайла.
Все преимущество только в отсечении невидимых мешлетов на ГП и в выборе уровне детализации. Все это можно было сделать и до меш шейдера.
#metal #apple_gpu
(video) Уязвимости аллокаторов памяти – Павел Филонов
Простой пример как можно занести уязвимость в самописный аллокатор.
#cpp #security #rus
Простой пример как можно занести уязвимость в самописный аллокатор.
#cpp #security #rus
(video) How to Create Content with Signed Distance Functions (Johann Korndörfer)
Объясняют как моделировать сцены с помощью SDF, от простых форм до целого города.
#sdf
Объясняют как моделировать сцены с помощью SDF, от простых форм до целого города.
#sdf
Ada GPU architecture
Описание архитектуры RTX 40xx.
Старшая модель содержит 12 GPC (graphics processing clusters), в каждом кластере свой raster engine, что в теории позволяет рисовать параллельно, но эта фича давно заблокирована в драйверах.
Для трассировки лучей добавили новые возможности:
* Opacity Micromap Engine - используется для ускорения альфа теста, то есть пустые области в геометрии теперь обрабатываются в железе, а не в шейдере (расширение VK_EXT_opacity_micromap).
* Displaced MicroMesh Engine - оптимизирует сложную геометрию, 10х быстрее строится BVH, 20х компактнее.
* Shader Execution Reordering - как следует из описания эта фича только для трассировки и, возможно, требует ручного управления, зато в 2 раза ускоряет вторичные лучи.
Про DLSS 3 пока нечего сказать, надо самому тестировать, прошлые версии местами давали сильные артефакты.
Прошлые модели: Ampere, Turing, Pascal
#nvidia
Описание архитектуры RTX 40xx.
Старшая модель содержит 12 GPC (graphics processing clusters), в каждом кластере свой raster engine, что в теории позволяет рисовать параллельно, но эта фича давно заблокирована в драйверах.
Для трассировки лучей добавили новые возможности:
* Opacity Micromap Engine - используется для ускорения альфа теста, то есть пустые области в геометрии теперь обрабатываются в железе, а не в шейдере (расширение VK_EXT_opacity_micromap).
* Displaced MicroMesh Engine - оптимизирует сложную геометрию, 10х быстрее строится BVH, 20х компактнее.
* Shader Execution Reordering - как следует из описания эта фича только для трассировки и, возможно, требует ручного управления, зато в 2 раза ускоряет вторичные лучи.
Про DLSS 3 пока нечего сказать, надо самому тестировать, прошлые версии местами давали сильные артефакты.
Прошлые модели: Ampere, Turing, Pascal
#nvidia
(video) Metal Compute on MacBook Pro
Различные советы по оптимизации на уровне API и шейдеров.
10:46 - ГП содержит отдельный кэш для буферов и текстур, лучше использовать оба кэша.
15:19 - рекомендуют использовать int вместо uint для обхода массивов.
14:32 .. 22:31 - примеры оптимизации и профилирования.
#gpu_opt #apple_gpu
Различные советы по оптимизации на уровне API и шейдеров.
10:46 - ГП содержит отдельный кэш для буферов и текстур, лучше использовать оба кэша.
15:19 - рекомендуют использовать int вместо uint для обхода массивов.
14:32 .. 22:31 - примеры оптимизации и профилирования.
#gpu_opt #apple_gpu
(video) Tune CPU job scheduling for Apple silicon games
Рекомендации, как делать многопоточку на ЦП от Apple.
6:00 - оверхэд от запуска тасков на разных ядрах.
16:20 - как получить количество P и E ядер ЦП.
19:30 - LibDispatch для тех, кто не пишет свою систему тасков.
21:58 - выбор приоритетов для потоков.
#cpu_opt #threading #apple_cpu
Рекомендации, как делать многопоточку на ЦП от Apple.
6:00 - оверхэд от запуска тасков на разных ядрах.
16:20 - как получить количество P и E ядер ЦП.
19:30 - LibDispatch для тех, кто не пишет свою систему тасков.
21:58 - выбор приоритетов для потоков.
#cpu_opt #threading #apple_cpu
(video) CppCon 2016: Timur Doumler “Want fast C++? Know your hardware!"
Рекомендации по оптимизации, ничего нового, но презентация хорошая.
21:52 - немного про префетчер.
23:00 - ассоциативность кэша, объясняет почему происходит резкое падение производительности при чтении с определенным шагом (256, 512 байт). Ссылается на статью Gallery of Processor Cache Effects.
28:18 - выравнивание данных.
34:20 - предсказание ветвлений.
44:10 - 'false sharing', частые синхронизации кэшей между ядрами ЦП.
48:10 - зависимость между данными в цикле.
#cpu_opt
Рекомендации по оптимизации, ничего нового, но презентация хорошая.
21:52 - немного про префетчер.
23:00 - ассоциативность кэша, объясняет почему происходит резкое падение производительности при чтении с определенным шагом (256, 512 байт). Ссылается на статью Gallery of Processor Cache Effects.
28:18 - выравнивание данных.
34:20 - предсказание ветвлений.
44:10 - 'false sharing', частые синхронизации кэшей между ядрами ЦП.
48:10 - зависимость между данными в цикле.
#cpu_opt