Провел стресс-тест своей ballistic system в UE5.
С примерно одинаковыми затратами получилось обработать:
• 10к ProjectileMovementComponent
• 33к ballistic units в кастомной системе
ProjectileMovementComponent начинает упираться не столько в саму баллистику, сколько в overhead движка:
Tick на каждый projectile
UObject/Component система
обновление transform’ов
внутренние MoveComponent вызовы
огромный объем мелких операций на GameThread
В итоге CPU тратит кучу времени просто на обслуживание объектов.
В моей ballistic system вся симуляция идет централизованно:
без отдельного Tick на каждый projectile
с parallel update
async trace processing
batched simulation
За счет этого получилось спокойно обработать 33k ballistic units при играбельном FPS.
Процессор: Intel Core I5 12400F
С примерно одинаковыми затратами получилось обработать:
• 10к ProjectileMovementComponent
• 33к ballistic units в кастомной системе
ProjectileMovementComponent начинает упираться не столько в саму баллистику, сколько в overhead движка:
Tick на каждый projectile
UObject/Component система
обновление transform’ов
внутренние MoveComponent вызовы
огромный объем мелких операций на GameThread
В итоге CPU тратит кучу времени просто на обслуживание объектов.
В моей ballistic system вся симуляция идет централизованно:
без отдельного Tick на каждый projectile
с parallel update
async trace processing
batched simulation
За счет этого получилось спокойно обработать 33k ballistic units при играбельном FPS.
Процессор: Intel Core I5 12400F
❤3😈1 1
Нашел свой первый проект который делал 3 года назад🎁
Жаль исходники не сохранились, но даже сейчас я помню как плохо все было сделано в плане архитектуры и оптимизации. Вообще проект сам по себе сырой и незакончен, это был проект просто для обучения основным инструментам UE. Кому интересно можете поиграть.
Скачать: https://drive.google.com/file/d/1S576ljznmtMzchUBqmx9uqQRsIDHkgQW/view?usp=sharing
Жаль исходники не сохранились, но даже сейчас я помню как плохо все было сделано в плане архитектуры и оптимизации. Вообще проект сам по себе сырой и незакончен, это был проект просто для обучения основным инструментам UE. Кому интересно можете поиграть.
Скачать: https://drive.google.com/file/d/1S576ljznmtMzchUBqmx9uqQRsIDHkgQW/view?usp=sharing
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ballistic System Framework report
Что было сделано:
• Добавлена система баллистических профилей через Data Assets.
• Общие параметры снарядов больше не хранятся отдельно для каждого экземпляра.
• Вместо набора дублирующихся данных каждый снаряд теперь хранит только ссылку на свой профиль.
• Полностью обновлен пайплайн спауна под новую архитектуру.
появилось четкое разделение между:
* данными конкретного снаряда;
* данными типа снаряда.
На практике это означает, что десятки тысяч одинаковых снарядов больше не таскают за собой одинаковые значения массы, гравитации и параметров коллизии.
Что было сделано:
• Добавлена система баллистических профилей через Data Assets.
• Общие параметры снарядов больше не хранятся отдельно для каждого экземпляра.
• Вместо набора дублирующихся данных каждый снаряд теперь хранит только ссылку на свой профиль.
• Полностью обновлен пайплайн спауна под новую архитектуру.
появилось четкое разделение между:
* данными конкретного снаряда;
* данными типа снаряда.
На практике это означает, что десятки тысяч одинаковых снарядов больше не таскают за собой одинаковые значения массы, гравитации и параметров коллизии.
❤3❤🔥1👍1
REPORT🎁
Немного поправил архитектуру и по мелочам сделал рефакторинг.
При параллельном расчёте снарядов на разных ядрах процессора три места в коде могли случайно записать результат в одну и ту же память одновременно. Переделал: каждый поток пишет в свой изолированный буфер, результаты сводятся по очереди без конфликтов.
Добавил чистый расчётный блок — гравитация, сопротивление воздуха, без завязки на движок. Понадобится для заморозки дальних снарядов
Roadmap перед релизом первой версии:
Фаза 0 — Фундамент переработка архитектуры, математика под оптимизацию. ☑️
Фаза 1 — Заморозка дальних снарядов Снаряды, которых не видно, перестают считаться каждый кадр.☑️
Фаза 2 — Система урона GAS или что-то попроще, на выбор.
Фаза 3 — Сеть Работает в мультиплеере (в приоритете — listen server), при этом одиночная игра не платит за сеть.
Фаза 4 — Полировка Финальная сборка в отдельный плагин под релиз.
Дальше в планах: урон по дистанции/скорости, хедшоты, рикошеты и разлёт осколков при попадании.
Уже готова Фаза 1, завтра будет пост о результатах и приросте производительности.
Немного поправил архитектуру и по мелочам сделал рефакторинг.
При параллельном расчёте снарядов на разных ядрах процессора три места в коде могли случайно записать результат в одну и ту же память одновременно. Переделал: каждый поток пишет в свой изолированный буфер, результаты сводятся по очереди без конфликтов.
Добавил чистый расчётный блок — гравитация, сопротивление воздуха, без завязки на движок. Понадобится для заморозки дальних снарядов
Roadmap перед релизом первой версии:
Фаза 0 — Фундамент переработка архитектуры, математика под оптимизацию. ☑️
Фаза 1 — Заморозка дальних снарядов Снаряды, которых не видно, перестают считаться каждый кадр.☑️
Фаза 2 — Система урона GAS или что-то попроще, на выбор.
Фаза 3 — Сеть Работает в мультиплеере (в приоритете — listen server), при этом одиночная игра не платит за сеть.
Фаза 4 — Полировка Финальная сборка в отдельный плагин под релиз.
Дальше в планах: урон по дистанции/скорости, хедшоты, рикошеты и разлёт осколков при попадании.
Уже готова Фаза 1, завтра будет пост о результатах и приросте производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
Dormant LOD
Добавил в систему «dormant LOD» — если снаряд улетел далеко от игрока и его никто не видит, он «замирает»: физика для него не считается, столкновения не проверяются. Как только он снова оказывается в зоне видимости — оживает. При пробуждении снаряд проверяется не одной линией, а несколькими сегментами вдоль настоящей дуги.
Результат теста на одинаковом бюджете кадра:
— без заморозки: ~33 000 снарядов
— с заморозкой: ~98 500 снарядов
Добавил в систему «dormant LOD» — если снаряд улетел далеко от игрока и его никто не видит, он «замирает»: физика для него не считается, столкновения не проверяются. Как только он снова оказывается в зоне видимости — оживает. При пробуждении снаряд проверяется не одной линией, а несколькими сегментами вдоль настоящей дуги.
Результат теста на одинаковом бюджете кадра:
— без заморозки: ~33 000 снарядов
— с заморозкой: ~98 500 снарядов
Ballistic System Framework | Damage
В этом патче основной упор был сделан на систему регистрации попаданий и оптимизацию обработки столкновений.
В Framework появилась универсальная система получения урона, которая не навязывает какой-либо конкретный подход к реализации логики.
Поддерживаются сразу несколько сценариев использования:
• Автоматическое применение урона через один флаг. Минимум настройки, всё работает сразу после подключения компонента.
• Полноценная интеграция с Gameplay Ability System. Framework умеет применять Gameplay Effects напрямую через Ability System Component.
• Полностью ручной режим. Компонент лишь уведомляет о попадании, а вся логика остаётся под контролем разработчика.
Также предусмотрен Fallback-режим. Если у объекта нет компонента Framework, но реализован стандартный TakeDamage, система всё равно сможет передать ему урон (при необходимости это поведение можно отключить).
Collision LOD |
Теперь система автоматически меняет точность трейсов в зависимости от расстояния до ближайшего игрока:
• Близко → максимальная точность.
• Средняя дистанция → более дешёвые проверки.
• Далеко → минимальная стоимость трейсов и проверки выполняются не каждый кадр.
При этом даже на самых дальних дистанциях быстрые снаряды не проходят сквозь тонкую геометрию. Для этого используется трейс от предыдущей позиции до текущей, что исключает туннелирование даже при пропуске кадров.
Все дистанции масштабируются автоматически относительно дистанции перехода снаряда в Dormant, поэтому система легко адаптируется под разные проекты без ручной перенастройки множества параметров.
📈 Результат фазы:
• Универсальная система регистрации попаданий.
• Интеграция с GAS и стандартным UE Damage.
• Collision LOD с автоматическим масштабированием.
• Измеримый прирост производительности без уменьшения количества активных снарядов.
В этом патче основной упор был сделан на систему регистрации попаданий и оптимизацию обработки столкновений.
В Framework появилась универсальная система получения урона, которая не навязывает какой-либо конкретный подход к реализации логики.
Поддерживаются сразу несколько сценариев использования:
• Автоматическое применение урона через один флаг. Минимум настройки, всё работает сразу после подключения компонента.
• Полноценная интеграция с Gameplay Ability System. Framework умеет применять Gameplay Effects напрямую через Ability System Component.
• Полностью ручной режим. Компонент лишь уведомляет о попадании, а вся логика остаётся под контролем разработчика.
Также предусмотрен Fallback-режим. Если у объекта нет компонента Framework, но реализован стандартный TakeDamage, система всё равно сможет передать ему урон (при необходимости это поведение можно отключить).
Collision LOD |
Теперь система автоматически меняет точность трейсов в зависимости от расстояния до ближайшего игрока:
• Близко → максимальная точность.
• Средняя дистанция → более дешёвые проверки.
• Далеко → минимальная стоимость трейсов и проверки выполняются не каждый кадр.
При этом даже на самых дальних дистанциях быстрые снаряды не проходят сквозь тонкую геометрию. Для этого используется трейс от предыдущей позиции до текущей, что исключает туннелирование даже при пропуске кадров.
Все дистанции масштабируются автоматически относительно дистанции перехода снаряда в Dormant, поэтому система легко адаптируется под разные проекты без ручной перенастройки множества параметров.
📈 Результат фазы:
• Универсальная система регистрации попаданий.
• Интеграция с GAS и стандартным UE Damage.
• Collision LOD с автоматическим масштабированием.
• Измеримый прирост производительности без уменьшения количества активных снарядов.
❤2 1