Ballistic system теперь работает в несколько потоков.
Когда BallisticUnit становится много, simulation автоматически разбивается на batch’и и распределяется между CPU threads.
То есть система сама решает: когда выгоднее работать в одном потоке, а когда переходить в parallel mode.
Сделал debug-инфраструктуру для снарядов. Теперь система умеет в realtime показывать:
• траектории полёта
• точки попаданий
• скорость снарядов
• загрузку системы
• количество активных projectile’ов
• режим работы CPU
Самое важное:
debug почти не влияет на производительность и полностью вырезается из Shipping build.
Добавил полноценное профилирование ballistic subsystem.
Теперь можно в realtime смотреть:
• сколько времени занимает simulation
• насколько загружен CPU
• когда система переходит в parallel mode
Всё интегрировано с Unreal Insights и stat system UE5.
Когда BallisticUnit становится много, simulation автоматически разбивается на batch’и и распределяется между CPU threads.
То есть система сама решает: когда выгоднее работать в одном потоке, а когда переходить в parallel mode.
Сделал debug-инфраструктуру для снарядов. Теперь система умеет в realtime показывать:
• траектории полёта
• точки попаданий
• скорость снарядов
• загрузку системы
• количество активных projectile’ов
• режим работы CPU
Самое важное:
debug почти не влияет на производительность и полностью вырезается из Shipping build.
Добавил полноценное профилирование ballistic subsystem.
Теперь можно в realtime смотреть:
• сколько времени занимает simulation
• насколько загружен CPU
• когда система переходит в parallel mode
Всё интегрировано с Unreal Insights и stat system UE5.
🔥3❤2 1
Провел стресс-тест своей 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 снарядов