Приветствую!
В Unity есть какие-то стандартные решения для отображения большого количества анимированных, передвигающихся объектов в 2d?
Хочу в своей игре (aka bullethell) подобие роя насекомых.
Каждый с простой анимацией из 10 спрайтов 64х64.
При 5000 штук фпс ожидаемо падает.
Если брать примеры с индустрии, то там судя по всему по сетке рисуют с ограничением на одновременное количество супостатов на экране.
В deep rock galactic: survivor - там прям много жуков на экране + кружочки с опытом анимированные...
Примерные цифры на замерах:
просто спавним 5000 GameObject без спрайта ~340 fps
с Sprite renderer ~ 145 fps (еще терпимо)
с Animator ~ 45 fps

ECS
https://www.youtube.com/watch?v=L_uwDygZe48 - вот это видео может помочь. Тут автор показывает как на примере создания клона факторио в юнити рендерить кучу конвеерных лент нативно без GameObject'ов и Sprite2D.
Странно, что Dynamic Batching не работает. Надо посмотреть во Frame Debugger, по какой причине спрайты не батчатся.
Вместо использования аниматора можно кадры анимации шейдером менять через сдвиг UV координат.
BooTheJudge
> Странно, что Dynamic Batching не работает. Надо посмотреть во Frame Debugger, по какой причине спрайты не батчатся.
Они батчатся, но особо не спасает

Анимацию через шейдер попробую, спасибо.
Jaxel
> https://www.youtube.com/watch?v=L_uwDygZe48 - вот это видео может помочь. Тут автор показывает как на примере создания клона факторио в юнити рендерить кучу конвеерных лент нативно без GameObject'ов и Sprite2D.
Хороший эксперимент.
Но у меня что-то не получается с Graphics.DrawTexture.
В Scene моих отрисованных жуков показывает, в Game mode нет. Что не так...
scene и game

код

demn1c
> Но у меня что-то не получается с Graphics.DrawTexture.
> В Scene моих отрисованных жуков показывает, в Game mode нет. Что не так...
Разобрался. В SRP не поддерживается некоторые OnXXX в том числе OnRenderObject.
Поэтому камера Scene рендерит, а Game нет.
Если бы были меши, можно было бы быстр рисовать через DrawMeshInstanced
Всегда вызывал Graphics/Draw* прям из апдейта) было норм, хз какие там корнер кейсы.
kkolyan
не рисует через Update.
MANAB
> ECS
для 2D только логику туда можно перенести, для рендеринга особо ничем помочь не может. Дает те же цифры что и при обычном GameObject подходе.
В общем потыкал в стандартном URP всяких галочек, которые AI насоветовал, теперь 5000
- статичных жуков выдают 280fps (было 150) - render thread 1-3ms.
- движущихся - 120fps (было 100) - 5-6ms
- с анимацией - 55-60 (было 45) - render thread 13-15ms

Как вариант, можно изменить подход к отрисовке.
- Рисовать через 3D. Взять плоскость (можно из примитивов), развернуть её нормалью к камере.
- Позиции создать через Matrix4x4[]. Если нужно перемещать - поможет Jobs и Burst Compiler.
- Ну и рисовать в Update через CommandBuffer и Graphics.DrawMeshInstanced.
Пункт по то, что анимация просаживает FPS. Как я понял, анимация - зацикленная смена кадров. Но эту анимацию можно сделать шейдером:
- Подготовить кадры анимации
- Загнать их на единую текстуру так, чтобы они занимали одинаковый размер и были предсказуемыми по положению на текстуре.
- В коде шейдера - изменять считываемые UV координаты. Ниже - пример fragment шейдера для unlit:
- Если в глаза бросается, что кадры анимации у всех одинаковые - можно к переменной _Time.y добавлять свою offset, которую можно поставлять через MaterialPropertyBlock и считывать в шейдере через UNITY_ACCESS_INSTANCED_PROP.
У меня тоже проблема с большим количеством объектов. Я запилил нейросетей, которая генерирует гигантские карты для UE5, но там косяк был с тем, что каждое дерево и камешек отдельно в памяти лежал. Потом на другую задачу переключился, так и не разобрался...
Много объектов - много будут жрать ресурсов