GameDev: разработка игр
7.64K subscribers
921 photos
203 videos
1 file
1.33K links
Всё про геймдев для девелоперов, художников, левел- и геймдизайнеров, сценаристов

Разместить рекламу: @tproger_sales_bot

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Как синхронизировать физику сетевой игры без передачи состояния объектов

При детерминированной синхронизации lockstep по сети отправляют только действия игрока, а не позиции и скорости тел. Поэтому миллион объектов требует столько же трафика, сколько один. Но одинаковые данные и команды должны давать побитно одинаковый результат на каждом кадре.

Получатель ждёт ввод для кадра n, а буфер выравнивает приход пакетов ценой задержки. TCP при потере пакета останавливает симуляцию до повторной доставки. Альтернатива: UDP повторяет неподтверждённые команды.

Схема с буфером и сжатием команд упирается в вычисления с плавающей точкой: результат может различаться между компиляторами, ОС и архитектурами. Подход годится для множества объектов и малого ввода, если совпадение подтверждено на целевых сборках.
❤3
Как сжать снимки сетевой физики и сократить задержку

10 снимков состояния в секунду дают до 150 мс задержки интерполяции, а защита от потери пакетов поднимает её до 250–350 мс. При 60 снимках задержка ниже, но трафик достигает 17,37 Мбит/с вместо бюджета в 256 кбит/с.

Схема сжатия снимков сокращает кватернион поворота со 128 до 29 бит, позицию с 96 до 50 бит, а скорость при 60 Гц можно не передавать. Состояние куба уменьшается с 321 до 80 бит.

Затем снимок кодируется относительно последнего подтверждённого состояния. В покое трафик падает примерно до 15 кбит/с: сначала убираем лишние поля, затем измеряем точность и вводим дельта-сжатие.
❤2
Как компонентный паттерн развязывает код игровых сущностей

Когда ввод, физика, рендеринг и звук живут в одном классе персонажа, правка затрагивает сразу несколько систем. Если эти системы разнесены по потокам, общий объект ещё и повышает риск взаимных блокировок.

Компонентный паттерн выносит каждую систему в отдельный класс, а сущность оставляет контейнером. Для декорации подключают графику, для зоны физику, а для интерактивного объекта оба компонента. Получается конструктор сущностей без сложной иерархии наследования.

Схема паттерна и пример кода показывают цену решения: компоненты нужно создавать, связывать и учить общаться. Дополнительный переход к компоненту может замедлить критичные циклы. Подход уместен, когда класс соединяет несколько систем или уже стал слишком большим; для простой сущности это лишняя сложность.
❤1
Как найти узкое место CPU или GPU в Unreal Engine 5.8

При 60 кадрах в секунду на кадр остаётся 16,6 мс, при 30 кадрах — 33,3 мс. Сначала выясните, какой бюджет превышен: CPU занят игровой логикой, Tick, ИИ и подготовкой физики, а GPU отвечает за геометрию, тени, освещение и постобработку. Оптимизация свободной стороны частоту кадров не поднимет.

Команда stat unit показывает время Frame, Game, Draw и GPU. Если упираетесь в графику, stat GPU разбивает затраты по проходам рендера. Unreal Insights помогает разобрать нагрузку на временной шкале по кадрам, включая CPU, GPU и память.

Схема профилирования в Unreal Engine 5.8 предлагает проверять сборку на целевом устройстве: найти лишний Tick или дорогой проход, изменить что-то одно и повторить замер. Так видно, какая правка действительно вернула миллисекунды кадра.
Как превратить Gaussian Splat в уровень для браузерного FPS

Gaussian Splat создаёт фотореалистичное окружение, но остаётся облаком пятен без поверхностей, коллизий и навигации. В демо на PlayCanvas скан превратили в браузерный FPS с физикой, освещением моделей и NPC.

splat-transform превращает сплат в воксели и строит меш для столкновений, а Recast создаёт по нему навигационную сетку. Для освещения персонажей автор запёк яркость окружения с шести направлений.

В разборе и открытом проекте есть скрипты, демо FPS и основа для своей сцены.
❤1
Как адаптировать собственный SRP к Unity 6.5

После обновления учебного конвейера рендеринга Custom SRP рендеринг перестаёт собираться: ImportBackbuffer теперь требует описание целевого буфера через RenderTargetInfo. В нём нужно передать размеры камеры, глубину 1, один образец сглаживания и формат текстуры либо кадрового буфера.

Миграция затрагивает и Render Graph. Unity больше не поддерживает отсечение списков отрисовщиков, поскольку синхронизация с системой отсечения обычно снижала производительность. Поэтому из параметров графа удаляется rendererListCulling, а из проходов неба и гизмо — принудительный запрет на их отсечение.

Разбор перехода на Unity 6.5 также показывает, какой код убрать после отключения Light Probe Proxy Volumes и устаревших настроек теней. Получается практический список правок для обновления собственного SRP.
Как выбрать хитбокс для bullet hell и отладить столкновения

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

Для пуль обычно хватает AABB, прямоугольника без поворота. Круг удобен для корабля или вращающегося врага, а попиксельную проверку стоит оставить для крупных препятствий сложной формы.

Отладочная визуализация хитбоксов цветными контурами покажет, почему попадание сработало: неверно задана форма или графика вводит в заблуждение.
❤1
Как найти причину пропавших столкновений в Godot 4

Если CharacterBody проходит сквозь мир, а Area не замечает предмет, не начинайте со случайного переключения слоёв. Порядок диагностики начинается с Remote scene tree: проверьте, что оба объекта существуют, а CollisionShape включены, содержат форму и пересекаются.

Затем уточните, кто управляет движением. CharacterBody перемещает скрипт через move_and_slide() в физическом такте. RigidBody должен получать силы и импульсы от физического движка. Прямое изменение позиции может обойти ожидаемую обработку столкновений.

Только после этого проверяйте слои и маски: слой задаёт категорию объекта, маска определяет, какие категории он отслеживает. Для Area дополнительно нужны включённый monitoring и верно подключённый сигнал. Пример движения и прыжка проверен в Godot 4.7.2, но остальные сценарии столкновений автор не тестировал во время выполнения.
❤2
Как тетраэдральные оболочки разгружают BVH у анимированной растительности

В демо AMD 25 тысяч растений реагируют на ветер, а после выбора уровня детализации трассируется около 500 миллионов анимированных треугольников за кадр.

Вместо деформации плотной сетки метод меняет простую тетраэдральную оболочку. Геометрия и BVH остаются статичными, а лучи переводятся в исходные координаты. Затраты зависят от сложности оболочки, а не от числа треугольников.

Тетраэдральные оболочки сократили память BVH с 80 до 1,7 ГБ, а обновление за кадр: с 300 до 3,3 мс.
❤1
Как один раз объявить ресурсы шейдера для C++ и пяти графических API

В движке SETech интерфейс ресурсов задают в общем заголовке, который обрабатывают и компилятор шейдеров, и C++. Это заменяет три синхронизируемых вручную сущности: объявление в шейдере, его копию в C++ и таблицу отражения. Если переименовать ресурс и не исправить обращение к нему, C++ перестанет собираться. Тихо получить непривязанную текстуру уже не выйдет.

Макросы превращаются в обычные объявления HLSL на стороне шейдера и в структуру с описателями на стороне C++. Препроцессор назначает регистры и пространства отдельно для D3D11, D3D12, Vulkan, Metal и WebGPU.

Ресурсы делятся на Fixed, PerFrame, PerBatch и PerDraw по частоте обновления. Благодаря этому движок повторно привязывает только изменившиеся группы. В техническом разборе схемы SETech есть код генерации раскладок и ограничения D3D11.
❤1
Как собрать физический 2D-рэгдолл в Godot 4

Персонажа собирают из узлов RigidBody2D: отдельно создают голову, корпус и части конечностей. Затем их соединяют девятью шарнирами в точках шеи, плеч, локтей, бёдер и коленей. Угловые ограничения не дают суставам вращаться на все 360 градусов, поэтому конструкция двигается как тело, а не как внезапно ожившая лапша.

Для сложной цепочки автор предлагает заменить стандартный физический движок Godot 4.x на Rapier2D. Быстрые конечности защищают от прохождения сквозь пол и стены с помощью непрерывного обнаружения столкновений. Отдельная настройка слоёв отключает столкновения частей тела друг с другом, но сохраняет контакт с окружением.

Пошаговая сборка рэгдолла содержит параметры шарниров и готовые файлы проекта. Управление активным рэгдоллом в руководство не входит.
❤2
Где выполнять вычисления шейдера и как не переплачивать за точность

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

Часть вычислений можно выполнить для вершин, а результаты интерполировать по поверхности. Это дешевле, но на крупных треугольниках освещение может потерять детали: блик вычисляется лишь в углах и затем размазывается между ними. Расчёт для каждого фрагмента точнее, хотя требует больше работы GPU.

Интерактивные схемы графического конвейера показывают растеризацию, интерполяцию нормалей и разницу нагрузки. Они помогут решить, что переносить в вершины, а что оставлять для попиксельного расчёта.
❤2👍1
Как разгрузить CPU в Unity при тысячах объектов

Сначала профилируйте: скачки времени кадра создаёт CPU или GPU. Если процессор тратит время на тысячи команд отрисовки, статический батчинг объединит неподвижные меши с одним материалом. Цена: дополнительная память GPU.

Для одинаковых подвижных объектов используйте GPU instancing: CPU передаёт модель и материал одной командой, а параметры экземпляров хранит отдельно.

VAT переносит анимацию вершин на GPU: позиции и повороты хранятся в текстуре, а шейдер двигает вершины. В разборе Backyard Baseball VAT вместе с instancing позволил отрисовывать тысячи анимированных объектов. Метод расходует память и не обновляет коллайдеры, поэтому не подходит для точной физики.
❤2