Combine Children Extented (расширенный)

Оптимизация моделей, текстур, звуков

Re: Combine Children Extented (расширенный)

Сообщение jetyb 19 окт 2012, 12:13

Юнити не батчит все объекты в одну меш, она создает меш с подмешами по числу объектов.
Хитрость в том, что обычный рендер считает меш с любым количеством подмешей одним объектом и обрабатывает только один раз, а теневой рендер обрабатывает каждую подмеш, увеличивая число draw calls пропорционально попавшемуся теневому рендеру количеству объектов. При сложных многопроходных тенях количество draw calls увеличивается еще больше.

Не факт, что батчинг в unity плохой. Фруструм камеры обычно большой и часто рендерит весь отбатченный объект, а теневой рендер обрабатывает небольшую зону. Плюс средний материал обрабатывается камерой за 1 проход, а сложные тени требуют несколько проходов.
Имхо, если специально не заморачиваться с объединением объектов и геометрией сцены, то стандартный батчинг лучше.
jetyb
Адепт
 
Сообщения: 1402
Зарегистрирован: 31 окт 2011, 17:21

Re: Combine Children Extented (расширенный)

Сообщение [bm] 07 дек 2012, 14:35

Хороший пост про батчинг http://forum.unity3d.com/threads/138929 ... -rendering
Neodrop, спасибо за скрипт!!!
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Combine Children Extented (расширенный)

Сообщение Kira-sama 13 мар 2013, 23:18

Во-первых: огромное спасибо за скрипт, очень помог)
Тем не менее со скриптом обнаружилась одна проблема. Я пишу 3D раннер, по большому счёту клон игры Catch The Ark. В рантайме я случайным (с ограничениями) образом генерирую меш террейна (дно, берег, трава на которой стоят деревья и кусты) для одного участка реки. Так же из набора объектов рандомным образом выбираются кусты, цветы и деревья, все они делаются чилдами контейнера(вот на него то я и вешаю комбайнер), который в свою очередь является чилдом участка реки. Количество Draw call'ов устраивает и в бОльшую часть времени фпс скачет от 55-60, т.е. всё хорошо. НО! В момент, когда создаётся очередной участок реки, на нём расставляются растения и вешается комбайнер фпс проседает.. меньше чем на секунду, но происходят рывок(скачок), который режет глаз. Как можно победить эту беду?
P.S.:Через неделю сдавать проект, очень нужно решить эту проблему! Заранее спасибо за любую помощь.
P.P.S.:В юнити я новичёк, сильно умные слова подкрепляйте ссылками на туда, где о них можно прочитать =)
Kira-sama
UNец
 
Сообщения: 20
Зарегистрирован: 24 фев 2013, 14:30

Re: Combine Children Extented (расширенный)

Сообщение DbIMok 13 мар 2013, 23:48

Скрытый текст:
здесь основы. не надо тут оффтопить, заведите отдельную тему про "рывок". хотя, смысла в этом нет. никто кроме вас не скажет, что не так в вашем приложении. открывайте профайлер и смотрите в чем причина. затем оптимизируйте код и снова смотрите в профайлер...
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > Telegram чат @unity3d_ru (4400+) > Telegram канал @unity_news (1600+) > Telegram тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 5954
Зарегистрирован: 31 июл 2009, 14:05
Откуда: RU.61
  • Сайт

Re: Combine Children Extented (расширенный)

Сообщение Kira-sama 14 мар 2013, 12:30

Это не оффтоп... и я прекрасно знаю что "проблема" в этом скрипте (поэтому я и написал в эту тему, а не создал новую). Вопрос заключается в следующем: что можно сделать со скриптом, чтобы рывка не было?
Kira-sama
UNец
 
Сообщения: 20
Зарегистрирован: 24 фев 2013, 14:30

Re: Combine Children Extented (расширенный)

Сообщение Paul Siberdt 14 мар 2013, 12:37

Вы считаете, что просадка связана с комбайном, а не с кучей инстантиэйтов при содании новых объектов?

Думаю, для раннера комбайнить объекты вручную не очень полезно. Лучше отдать все на откуп динамическому бэтчингу, а вместо инстантиэйтов пользовать пулы с предзагруженными объектами.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Combine Children Extented (расширенный)

Сообщение Kira-sama 14 мар 2013, 12:46

Ну, я может и новичёк в юнити, но голова у меня на плечах есть. =)
Существуют пулы для объектов каждого типа (деревья, кусты, цветы...). При определении следующего типа и префаба объекта проверяется его наличие в пуле, при его отсутствии создаётся новый объект. Также для освобождения памяти при прохождении участка реки + определённая дистанция, участок уничтожается. Немного поковырявшись в комбайнере я обнаружил, что т.к. у меня много материалов в пределах чилдов объекта, на который вешается комбайнер - он создаёт GO Combined mesh, а на начальных(расставленных моим рандомом) объектах попросту выключает рендерер. Перед уничтожением очередной части реки я выдёргиваю все нужные мне объекты (кусты, деревья и т.д.) из части, делаю их чилдами PoolGO и ставлю им позицию в там, куда 100% мы(игрок) доехать и увидеть не может и включаю рендерер обратно.
Мне кажется, что проблема в том, что весь процесс комбинации мешей происходит в один call...

Edit:
Обойтись без комбайна вряд ли получится, с ним у меня в среднем 70 draw calls, без него ~1000 - разница оооочень заметна))) Если интересно можно глянуть пару видео геймплея в Catch The Ark и посмотреть сколько у них растений и других объектов на берегах, у меня столько же.

Edit 2:
В предыдущем посте я не совсем правильно написал: проблема не в скрипте, а в том, как и в какой ситуации я его использую... Как в моём случае использовать его правильно?
Kira-sama
UNец
 
Сообщения: 20
Зарегистрирован: 24 фев 2013, 14:30

Re: Combine Children Extented (расширенный)

Сообщение Neodrop 14 мар 2013, 14:24

Этот скрипт был написан давно и, так же давно, утратил свою актуальность. Попробуйте использовать StaticBatchingUtility.Combine. И, как сказано выше, не зная вашего проекта, невозможно вам помочь из-за банального недостатка информации.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8428
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Combine Children Extented (расширенный)

Сообщение Kira-sama 01 апр 2013, 12:34

Уважаемый Neodrop, прекрасно понимаю, что Ваш скрипт CombineChildren уже устарел, но в моем случае он оказался намного лучше, чем другие способы, которые советуют в этой теме...

Для начала опишу ситуацию в упрощенном виде:
Уровень строится в рантайме из квадратов 5х5 м*м. Квадраты выстраиваются друг за другом в бесконечную линию. На каждом квадрате расставляются n ± k объектов (зависит от выбранных объектов и их размеров) из пула. На каждый такой квадрат я вешаю комбайн. По прохождению каждого квадрата + определенная дистанция он "уничтожается" - мои объекты, у которых комбайн выключает рендеры отправляются в пул (там же включается обратно mesh renderer каждого), а Combined Mesh Game Object'ы уничтожаются, как и сгенерированные для них меши (чтобы не засорять память). Описанный процесс повторяется, пока не наступит гейм овер. Использовать дальше Combined Mesh Game Object'ы невозможно, т.к. в реальном проекте уровень имеет искревление траектории построения (вместо прямой линии) по всем осям.

Моя идея в следующем: вместо того, чтобы вешать комбайн на каждый квадрат, повесить его на специально созданный в сцене родительский объект (назовем его Root Combiner). Далее модифицировать скрипт так, чтобы можно было отправить Root Combiner'у определенный Game Object(один или несколько) и либо добавить их меши и рендеры к цельному мешу рута, либо наоборот убрать их из цельного. Т.е. вместо полного пересобирания Combined Mesh из точек(треугольников, uv и т.д.) каждого полученного объекта с нуля (а также создания новых game object'ов и мешей - насколько знаю это затратно) только добавлять или убирать эти компоненты(точки, треугольники и т.д.) и апдейтить меш.

Возможно ли это?
Если да, то будет ли такой метод быстрее (менее затратно по ресурсам), чем вешать скрипт на каждый квадрат?
Kira-sama
UNец
 
Сообщения: 20
Зарегистрирован: 24 фев 2013, 14:30

Re: Combine Children Extented (расширенный)

Сообщение Neodrop 01 апр 2013, 15:29

Сделать можно. А будет ли быстрее, мне с ходу не понятно. Это легче протестировать.
Копайте в сторону submeshes
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8428
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Combine Children Extented (расширенный)

Сообщение RamzeS_exe 04 сен 2013, 00:30

Шикарный скрипт, очень помог.
Спасибо :D
Аватара пользователя
RamzeS_exe
UNец
 
Сообщения: 10
Зарегистрирован: 23 июл 2013, 23:42

Re: Combine Children Extented (расширенный)

Сообщение NewGameStudio 24 фев 2015, 07:26

Вот неплохой инструмент для оптимизации, описанный вами функции присутствуют :
https://www.assetstore.unity3d.com/en/#!/content/25370
NewGameStudio
UNец
 
Сообщения: 23
Зарегистрирован: 22 фев 2015, 07:31

Пред.

Вернуться в Медиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1