Unity3d, много кубиков, слияние мешей, производительность
Приветствую господа!
Нужен совет бывалых.
Нынче пробую мастерить для проэкта генератор локаций. Пока пробую на манер «майнкрафта» из кубов. Получается интересно, произвольные пещерки и т.п. Однако такой подход при росте количества объектов приведет к снижению производительности. При текущем размере локации в редакторе уже проседает до 30 фпс, хотя в билде пока всё нормально.
А вот хотелось бы расширить локацию хотя бы в 2 раза. Смотрел на ютюбах как люди объединяют меши и материалы. Правда всё на английском, так что нюансы проходят мимо меня.
Собственно вопрос: кто-нибудь уже делал такие смешивания и как влияет на производительность?
Или резонее печатать объекты в редакторе и уже расставлять готовые?
- Misanthrope
- Постоялец
#1
14:17, 22 фев 2019
обычно в таких случаях советуют не морочить голову и взять юнити,
но тут всё намного хуже, юнити уже взят а лыжи всё равно не едут.
- DemiosFantasimo
- Участник
#2
14:26, 22 фев 2019
Misanthrope
а можно без «потоков сознания» и что нибудь по делу?
#3
14:33, 22 фев 2019
Объединять меши это хорошо, но не нужно. Достаточно просто оперировать строго определённым количеством объектов на сцене через матрицу.
- DemiosFantasimo
- Участник
#4
14:45, 22 фев 2019
sledo
> Объединять меши это хорошо, но не нужно. Достаточно просто оперировать строго
> определённым количеством объектов на сцене через матрицу.
Так сказать рендерить в области видимости. Такая мысль была. И матрица собственно есть. Просто по задумке на локации должны происходить некоторые события типо баталий нпс. Мобы здесь выходят за пределы функциональности скелетов майнкрафта и часть их сохраняет параметры полученые на локации в дальнейшем. Генерация событий за пределами видимости тоже мягко говоря озадачит не меньше(
#5
15:16, 22 фев 2019
Не видимости, а границ мира. Ваша матрица это и есть мир. Уйти от того что в дальнем углу какой то НПС взаимодействует с самой крайней ячейкой и не обрабатывать эту ячейку, не получится.
А вот не обрабатывать весь матричный массив, а только то с чем идёт взаимодействие, можно и нужно.
Просто вы используете не верный подход. В данном случае вам нужно идти не от начала, а от конца, ибо концов меньше чем начал.
- DemiosFantasimo
- Участник
#6
15:18, 22 фев 2019
sledo
Спасибо. Принял.
#7
18:18, 22 фев 2019
непонятны детали и нюансы
может у вас там каждый кубик с rigidbody
обрабатывать невидимые и далекие объекты можно со своей периодичностью, то есть не каждый кадр, а реже
объединение материалов хорошо, меньше дроуколов может стать, а может и не стать
но это судя по всему не ваш случай, у вас материалов штуки четыре на весь мир (нет, пять), так что они фпс просаживать никак до 30-ки не могут
на редактор юнити по производительности, разумеется, ориентироваться не стоит, профайлить нужно именно билд
для далеких объектов неплохо бывает ещё сделать какие-то лоды, если геометрия сшивается «на лету», то лоды скорее всего придется костылить свои а не родные. вплоть до того, что совсем далекие объекты вообще можно отрендерить в скайбокс с очень редкой периодичностью в зависимости от максимальной скорости передвижения персонажа, чтобы рывков не было видно
ведь дальний план очень незначительно меняется при нормальном передвижении персонажа
физику из коробки симулировать с миром в мильён объектов тоже не получится, придется костылить свою надстройку для обработки далеких от игрока областей, с редкой периодичностью обновления
upd:
а ещё.. проверьте , чтобы у вас материалы не клонировались. если дёрнуть Renderer.material то создаются экземпляры материалов и тогда да, это уже существенно влияет в вашем случае. если дергать или назначать sharedMaterial то ничего страшного
- DemiosFantasimo
- Участник
#8
19:59, 22 фев 2019
Chupakaber
Спасибо, помогли косвенно, но все равно интересно почитать о том что бывает.
Проблема оказалась действительно в rigibody. Только оно висело не на самой модели, а на родительском объекте, сразу не увидел. Снял и сразу даже в редакторе фпс вернулся к 60-70))
#9
23:23, 22 фев 2019
DemiosFantasimo
> Смотрел на ютюбах как люди объединяют меши и материалы
Просто поставить у статичных мешей «is staic» и включить в настройках static и dynamic батчинг.
В шейдере можно заюзать instancing.
Настроить area occlusion culling.
В принципе этого достаточно должно быть, что бы получить явно выше 60-70 фпс в вашей сцене, даже на ультра бюджетном дерьме.
sledo
> Объединять меши это хорошо, но не нужно.
Чего?
sledo
> Достаточно просто оперировать строго определённым количеством объектов на сцене
> через матрицу.
Чего?
Юнити отбрасывает все объекты вне зоны фруструма и батчит только видимые объекты.
Если на сцене 100 кубов и видно только 10, то юнити сбатчит 10 кубов в 1 меш и 1 вызов отрисовки.
Зачем костыли с матрицами? Батчить разные материалы?
Если да, то оно того не стоит, учитывая что там от силы пара материалов. Экономия на спичках.
Или про какую матрицу идёт речь?
DemiosFantasimo
> Так сказать рендерить в области видимости. Такая мысль была. И матрица
> собственно есть. Просто по задумке на локации должны происходить некоторые
> события типо баталий нпс. Мобы здесь выходят за пределы функциональности
> скелетов майнкрафта и часть их сохраняет параметры полученые на локации в
> дальнейшем. Генерация событий за пределами видимости тоже мягко говоря озадачит
> не меньше(
Откройте профайлер и посмотрите что рендерит камера. Там и так рендерится только то что в области видимости.
Для skinned mesh можно настроить отдельно, рендерить или отбрасывать вне области фруструма.
#10
0:02, 23 фев 2019
Kripto289
Матрица это не костыли, а в данном случае основа мира. Или вы предлагаете создать на сцене пару милионов объектов и работать с ними? Я думаю нет. Для того что бы можно было с ними работать и нужна матрица. Например в виде трехмерного массива.
Причем сам индекс массива можно использовать как координаты ячейки в пространстве, а хранилище для хранения данных. Таким образом, можно создавать миры ограниченные только объемом памяти и в случае с массивами, этот мир можно считать практически безграничным.
Для того что бы обработка массива не занимала лет сто и нужно идти не от того что произошло в каждой ячейке, а от того, кто в данный момент может взаимодействовать с ячейкой.
В случае с предложенным автором мобом мы имеем ограничение только на их количество в мире, исходя из их занимаемого процессорного времени.
Условно говоря, в идеале взять общую производительность, вычислить производительность ИИ моба, и разделив одно на другое можно получить приблизительно максимальное количество мобов в мире. Даже для среднего ПК, это могут быть тысячи и десятки тысяч уникальных персонажей которые живут отдельной жизнью. Т.е. каждый моб, условно говоря обрабатывает свою ячейку, что намного быстрее чем каждая ячейка обрабатывает весь массив мобов.
Я уж молчу о развитии этого и создания иерархии управления, что то типа урезаной нейроной сети. Там и вовсе будет планета Земля.
Насколько я понял, автор именно этого и хочет добиться — огромного живого мира, потому и пошел по пути генерации.
В идеале конечно тут использовать низкоуровневые языки. Тогда даже Дворфы покажутся детской поделкой.
#11
1:47, 23 фев 2019
sledo
> Матрица это не костыли, а в данном случае основа мира.
В геймдеве обычно матрицами принято называть матрицы преобразования, а не вот это, ну да ладно.
sledo
> Или вы предлагаете создать на сцене пару милионов объектов и работать с ними?
Что значит «работать с ними»?
В контексте юнити, я могу создать хоть миллион кубов и тысячи персонажей, которые могут взаимодействовать с этими кубами и друг с другом, не нагружая gpu. Поиск пути работает. Физика и рейкасты работают. Culling невидимых кубов и скин-мешей работает. События работают.
А учитывая что в юнити недавно добавили job system с ecs, то многопоточная обработка стала ещё эффективнее.
Не то что бы я каждый день создавал клоны майнкрафта, но я не увидел смысла в вышесказанном про обработку матриц.
Что конкретно можно сделать с помощью матриц, чего не сделать штатными средствами юнити?
Бегать/ходить/прыгать/. Кинули рейкаст (например с тайм слайсингом для оптимизации), получили землю и пошли по ней. Ну или заюзали штатный поиск пути.
Копать/добавлять/менять/поджигать/. Кинули рейкаст, получили что надо (позицию, цвет, материалы, и т.д.), добавили/поменяли.
Найти ближайшего юнита/бревно для взаимодействий? Получили через сферический рейкаст и слои то что нужно, хоть врагов, хоть союзников, хоть кусок камня и т.д.
Что там ещё из возможных взаимодействий возможно?
#12
4:36, 23 фев 2019
Kripto289
Однако как все просто. Матрицы, шматрицы. Наклепал ГО в сцену, рейкастом пуляешь куда не попадя и все — мир создан.
Одни гении разработки. Вот только поиграть не во что.
#13
4:59, 23 фев 2019
Я расписываю тонну текста и аргументов и жду обсуждения, а в ответ получаю вот этот высер.
sledo
> Однако как все просто. Матрицы, шматрицы. Наклепал ГО в сцену, рейкастом
> пуляешь куда не попадя и все — мир создан.
> Одни гении разработки. Вот только поиграть не во что.
А по существу что-то будет, кроме унылого вброса? Тут вроде не публика вконтактика для «ололо потролить»
В твои то игры можно поиграть?
- DemiosFantasimo
- Участник
#14
7:08, 23 фев 2019
Kripto289
> Просто поставить у статичных мешей «is staic» и включить в настройках static и
> dynamic батчинг.
Проэту штуку я когда-то читал — забыл.))
Kripto289
> В шейдере можно заюзать instancing.
> Настроить area occlusion culling.
Любопытно — незнал!
Kripto289
> сферический рейкаст
Боже, такую штуку вообще нигде не когда не видел и упоминаний не встречал!))
sledo
> Однако как все просто. Матрицы, шматрицы. Наклепал ГО в сцену, рейкастом
> пуляешь куда не попадя и все — мир создан.
Ну собственно в жизни то так и есть. Как правило дело не в том что сцена «наклепана», а в том что на ней делать игроку.
ProBuilder
Проектируйте, создавайте прототипы и проводите игровое тестирование в редакторе Unity с огромной скоростью.
Создание игрового мира в редакторе Unity
Входя сейчас в состав Unity, ProBuilder является гибридным инструментом 3D-моделирования и дизайна уровней, оптимизированным для создания простых геометрических объектов, но способным и на детальное редактирование и UV-развертывание.
ProBuilder можно использовать для быстрого прототипирования строений, сложных ландшафтов, автомобилей и оружия или для реализации собственной геометрии столкновения, триггерных зон или объектов NavMesh.
ProBuilder также пользуется преимуществами легкого обмена файлами Unity с другими инструментами создания цифрового контента (наподобие Maya), так что вы можете дальше полировать свои модели с помощью любимых вами инструментов


Check out the highlight reel
Примеры игр, созданных с использованием ProBuilder
Unity и ProBuilder помогли создать множество игр, включая SUPERHOT, Tacoma, Tunic, Manifold Garden, Super Lucky’s Tale, DESYNC, и другие.
Основные возможности

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

Изменчивые полигональные фигуры
Создав полигональную фигуру, вы можете редактировать ее опорные точки и прочие параметры на любой стадии.
Щелкните объект в окне Scene для добавления контрольных точек. Эти точки очерчивают внешние габариты вашего меша. Как только все точки будут размещены, нажмите кнопку Enter для финализации формы. Редактировать Poly Shape можно даже после первых действий. Вы можете перемещать существующие точки перетаскиванием, добавлять и удалять новые точки или переворачивать нормали.

Динамичный пользовательский интерфейс
Настраивайте панели инструментов под свои потребности и воспользуйтесь преимуществом окна ProBuilder, представляющего собой «умную панель инструментов», динамически подстраивающуюся под текущий режим редактирования и выбор элементов.
Меняйте настройки по умолчанию, горячие клавиши, изменяйте размер панели управления и переключайтесь между режимами отображения текста и значков. ProBuilder переупорядочивает значки или тексты, чтобы они наилучшим образом вписывались в размер окна.
На панели инструментов используются цветовые обозначения, чтобы вы могли быстрее выбирать инструменты по типу: оранжевым цветом обозначаются панели инструментов, синим — инструменты выбора, зеленым — действия над объектами, а красным — геометрические действия (с вершинами, гранями, ребрами).
Часто используемые окна ProBuilder можно прикреплять и откреплять, используя их контекстное меню.

Управление UV-текстурированием в сцене
ProBuilder предоставляет окно полноценного UV-редактора для ручного UV-развертывания и детального контроля, включая режимы проецирования, UV-сварку, управление стыками, поворот элементов и многое другое.
В ProBuilder можно быстро и легко накладывать материалы (текстуры) на объекты и регулировать смещение, поворот и фрагментацию UV-сеток объекта. В ProBuilder есть как автоматический, так и ручной режимы текстурирования:
Автоматическое UV-преобразование: используйте этот режим для простой работы с текстурами, особенно с архитектурными и твердотельными элементами. Доступны фрагментация, смещение, поворот и другие элементы управления, тогда как ProBuilder автоматически выполняет проецирование и вносит обновления в ходе вашей работы.
Ручное UV-редактирование: используйте все возможности UV-редактора, чтобы точно развертывать и редактировать UV-текстуры, отображать UV-шаблоны, проецировать UV-текстуры и прочее.
Вы можете смешивать автоматическое и ручное UV-редактирование даже на одном и том же объекте. Это особенно полезно, когда некоторым частям модели нужно фрагментирование текстур, пока развертываются другие.
Склеивание объектов при столкновении, с последующим перемещением за ним
Задача заключается в столкновении и приклеивание с последующим перемещением.
Не могу понять, как это сделать? К примеру: есть объект который перемещается и допустим, при нажатии на кнопку, он опускается вниз до другого объекта, когда он сталкивается с ним происходит OnTriggerEnter , как мне склеить их друг с другом, чтобы объект 1 поднял за собой объект 2? Что для этого нужно использовать?
Отслеживать
задан 14 сен 2019 в 6:15
111 10 10 бронзовых знаков
либо добавить один в другому потомком, либо использовать Joints
14 сен 2019 в 6:22
@StrangerintheQ, а как мне кодом сделать его потомком, когда он просто валяется на терейне, а другой по нему двигается? Как мне через код задать ему Joints?
14 сен 2019 в 6:23
14 сен 2019 в 6:24
@StrangerintheQ, разобрался. Без вас бы не получилось =)) оформите ответ. Чтобы я принял!
14 сен 2019 в 7:03
По-видимому я не успел =)
14 сен 2019 в 20:19
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Через Parent target :
//вешать на твоего плеера к которому аттачить. //И не забыть проставить тег у всех обьектов которые должны уметь аттачиться public void OnCollisionEnter (Collision col) < if (col.gameObject.tag == "AttachibleObj") < col.gameObject.parent = gameObject.transform; >>
//вешать на твоего плеера к которому аттачить. //И не забыть проставить тег у всех обьектов которые должны уметь аттачиться public void OnCollisionEnter (Collision col) < if (col.gameObject.GetComponent(RigidBody)!=null && col.gameObject.tag == "AttachibleObj")) < joint = miningTool.gameObject.AddComponent(); joint.connectedBody = col.rigidbody; > >
через Collider: itTrigger :
private void OnTriggerEnter(Collider col) < string tag = collider.tag; if (col.gameObject.tag == "AttachibleObj") < joint = miningTool.gameObject.AddComponent(); joint.connectedBody = col.GetComponent(); > >
Соединить кривой два объекта в Unity3D
Хочу поделиться небольшим фрагментом кода, который позволяет соединить два игровых объекта в трехмерном пространстве Unity3D без установки плагина. В моем случае это понадобилось для обозначения связи между двумя притягивающимися телами.
Как это быстро применить:
1) Потребуется некая (например, логическая) переменная. Когда нам надо показывать кривую, делаем ее true. В методе Update вызываем Curves, если эта переменная true.
2) У меня этот скрипт висит на подвижном объекте, поэтому мы указываем только второй объект
3) В примере нет удаления уже не нужной кривой, так как это зависит от ваших потребностей. Мне нужно, чтобы кривая удалялась, когда отпускают кнопку, так что на это событие и стоит удаление
4) В примере кривая строится из 10 отрезков. Это связано с тем, что игра делается под браузеры, и, соответственно, я экономлю на всём. Чтобы увеличить плавность, надо увеличить количество отрезков
Как итог: я не гарантирую, что это лучшее и идеально написанное решение, но если вам нужно, оно решит эту простую задачу. Всем хорошего дня 🙂
11 комментариев
Написать комментарий.
Я просто говорю вам о том, что если вы делаете именно браузерную игру, вам действительно стоит задуматься об экономии. Это очень специфичная платформа. Если уж данный скрипт рассматривать, то попробуйте использовать одну кривую с массивом всех точек, а не отрезки. Рассчет позиций тоже выглядит лишним, можете заменить AninationCurve и ивалюэйтить его. Дорогущий getcomponent как и addcomponent отпадут тут тоже сами собой, т.к. не будет этих отрезков. На одном лишь этом вы в сотни раз удешевите расходы.
А если вам хочется придать совсем люто необычный вид вашей кривой, попробуйте использовать геометрический шейдер с передачей в него двух точек и высоты. Вот это будет максимально красиво
Развернуть ветку
Гарри Алисавакис расскажет, как писать геометрические шейдеры Unity, поделится шаблоном кода для…
coremission.net
Развернуть ветку
Другое дело, спасибо!
Развернуть ветку
Можно гиф? Не понял по скриншотам
