UnityФорумПрограммирование

Много объектов на одной сцене

Страницы: 1 2 Следующая »
#0
(Правка: 9 сен 2025, 3:18) 23:09, 7 сен 2025

Приветствую!
В Unity есть какие-то стандартные решения для отображения большого количества анимированных, передвигающихся объектов в 2d?
Хочу в своей игре (aka bullethell) подобие роя насекомых.
Каждый с простой анимацией из 10 спрайтов 64х64.
При 5000 штук фпс ожидаемо падает.

Если брать примеры с индустрии, то там судя по всему по сетке рисуют с ограничением на одновременное количество супостатов на экране.
В deep rock galactic: survivor - там прям много жуков на экране + кружочки с опытом анимированные...

Примерные цифры на замерах:
просто спавним 5000 GameObject без спрайта ~340 fps
с Sprite renderer ~ 145 fps (еще терпимо)
с Animator ~ 45 fps

Снимок экрана 2025-09-07 214533 | Много объектов на одной сцене
#1
8:17, 8 сен 2025

ECS

#2
8:29, 8 сен 2025

https://www.youtube.com/watch?v=L_uwDygZe48 - вот это видео может помочь. Тут автор показывает как на примере создания клона факторио в юнити рендерить кучу конвеерных лент нативно без GameObject'ов и Sprite2D.

#3
9:31, 8 сен 2025

https://docs.unity3d.com/6000.2/Documentation/ScriptReference/Graphics.html

#4
22:21, 8 сен 2025

Странно, что Dynamic Batching не работает. Надо посмотреть во Frame Debugger, по какой причине спрайты не батчатся.
Вместо использования аниматора можно кадры анимации шейдером менять через сдвиг UV координат.

#5
1:01, 9 сен 2025

BooTheJudge
> Странно, что Dynamic Batching не работает. Надо посмотреть во Frame Debugger, по какой причине спрайты не батчатся.

Они батчатся, но особо не спасает
Снимок экрана 2025-09-09 010016 | Много объектов на одной сцене

Анимацию через шейдер попробую, спасибо.

#6
(Правка: 13:19) 1:09, 9 сен 2025

Jaxel
> https://www.youtube.com/watch?v=L_uwDygZe48 - вот это видео может помочь. Тут автор показывает как на примере создания клона факторио в юнити рендерить кучу конвеерных лент нативно без GameObject'ов и Sprite2D.

Хороший эксперимент.

Но у меня что-то не получается с Graphics.DrawTexture.
В Scene моих отрисованных жуков показывает, в Game mode нет. Что не так...

scene и game
Снимок экрана 2025-09-09 010554 | Много объектов на одной сцене

код
Снимок экрана 2025-09-09 010843 | Много объектов на одной сцене

#7
(Правка: 13:19) 3:12, 9 сен 2025

demn1c
> Но у меня что-то не получается с Graphics.DrawTexture.
> В Scene моих отрисованных жуков показывает, в Game mode нет. Что не так...
Разобрался. В SRP не поддерживается некоторые OnXXX в том числе OnRenderObject.
Поэтому камера Scene рендерит, а Game нет.

#8
19:57, 9 сен 2025

Если бы были меши, можно было бы быстр рисовать через DrawMeshInstanced

#9
20:01, 9 сен 2025

Всегда вызывал Graphics/Draw* прям из апдейта) было норм, хз какие там корнер кейсы.

#10
2:50, 10 сен 2025

kkolyan
не рисует через Update.

#11
20:43, 10 сен 2025

MANAB
> ECS
для 2D только логику туда можно перенести, для рендеринга особо ничем помочь не может. Дает те же цифры что и при обычном GameObject подходе.


В общем потыкал в стандартном URP всяких галочек, которые AI насоветовал, теперь 5000
- статичных жуков выдают 280fps (было 150) - render thread 1-3ms.
- движущихся - 120fps (было 100) - 5-6ms
- с анимацией - 55-60 (было 45) - render thread 13-15ms
Снимок экрана 2025-09-10 203128 | Много объектов на одной сцене

#12
22:58, 10 сен 2025

Как вариант, можно изменить подход к отрисовке.
- Рисовать через 3D. Взять плоскость (можно из примитивов), развернуть её нормалью к камере.
- Позиции создать через Matrix4x4[]. Если нужно перемещать - поможет Jobs и Burst Compiler.
- Ну и рисовать в Update через CommandBuffer и Graphics.DrawMeshInstanced.

Пункт по то, что анимация просаживает FPS. Как я понял, анимация - зацикленная смена кадров. Но эту анимацию можно сделать шейдером:
- Подготовить кадры анимации
- Загнать их на единую текстуру так, чтобы они занимали одинаковый размер и были предсказуемыми по положению на текстуре.
- В коде шейдера - изменять считываемые UV координаты. Ниже - пример fragment шейдера для unlit:

+ Пример

- Если в глаза бросается, что кадры анимации у всех одинаковые - можно к переменной _Time.y добавлять свою offset, которую можно поставлять через MaterialPropertyBlock и считывать в шейдере через UNITY_ACCESS_INSTANCED_PROP.

#13
6:04, 11 сен 2025

У меня тоже проблема с большим количеством объектов. Я запилил нейросетей, которая генерирует гигантские карты для UE5, но там косяк был с тем, что каждое дерево и камешек отдельно в памяти лежал. Потом на другую задачу переключился, так и не разобрался...

#14
15:18, 11 сен 2025

Много объектов - много будут жрать ресурсов

Страницы: 1 2 Следующая »
UnityФорумПрограммирование