Оптимизация сцены где очень много объектов
| |
beril | Дата: Среда, 23 Октября 2013, 01:09 | Сообщение # 21 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Обьеденяй статические обьекты (делай дочерними)
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
arlaid | Дата: Среда, 23 Октября 2013, 01:39 | Сообщение # 22 |
частый гость
Сейчас нет на сайте
| Цитата beril ( ) Обьеденяй статические обьекты (делай дочерними)
Это не поможет =)
|
|
| |
beril | Дата: Среда, 23 Октября 2013, 01:55 | Сообщение # 23 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| В данном случае может
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
KamiRonin | Дата: Среда, 23 Октября 2013, 15:21 | Сообщение # 24 |
почти ветеран
Сейчас нет на сайте
| Occlusion culling - "убирает" невидимые поверхности ДО применения шейдеров и растеризации. Это именно то, что ты ищешь и кто то решал лучами там. Но ведь это для Pro версии. там одно "но" - настройка объектов для последующего куллинга делается в инспекторе. для твоих кубов придется навешивать Occlusion Portal на каждый и программно их вкл/выкл. LOD - физически переключает детализацию (меньше вертексов). Instancing -- так же "физически убирает лишние вертексы" путем рендеринга одного меша вместо многих идентичных (тоже твой случай). Но я не видел еще описания под Unity - как там использовать этот процесс. Кроме совета использовать MeshMerge и делать все копии полностью идентично префабу (scale, rotate).
поэтому, пример MinePckg - это отдельная технология заменяющая саму методику Occl.Cul. на свой модуль. и офигенно хорошо заменяющая. не знаю, почему ты не возьмешь её за основу!? там все есть что тебе нужно полностью. только добавь воды regidbody.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Среда, 23 Октября 2013, 15:26 |
|
| |
robertono | Дата: Среда, 23 Октября 2013, 16:29 | Сообщение # 25 |
Чокнутый Кот
Сейчас нет на сайте
| Спасибо за ответ KamiRonin.
Цитата KamiRonin ( ) только добавь воды regidbody. Там ведь кубы это просто меш, 16х16х** , и на что добавлять то риджид боди? А если нужно добавить на конкретные.. Мне кажется это просто нереальным, может я просто что то не понимаю или я ошибаюсь.
Цитата KamiRonin ( ) кто то решал лучами там но ведь делая на лучах можно уже не иметь Pro версию и не иметь статичных объектов, достаточно пустить лучи, может сделать тригеры прицеплённые к камере и включать всё то что в них входит и выключать когда выходит + изменять дальность триггера в зависимости от попадания луча. Идей то полно.
Цитата KamiRonin ( ) путем рендеринга одного меша вместо многих идентичных А что если рендерить у кубов не все 6 сторон, а только 3 которые в данный момент видно?
А вот насчёт Mine Package... Я не смог найти нормальных исходных кодов. Я находил те, которые на сурс фордже оставил разработчик, скачал, но блоки не ломаются, даже в коде я такого не нашёл, только в дебаг пишется Diggins in (vector3...) и всё. Но ведь это делалось где то под 3.3 или 3.5. А у меня уже 4.2 и может поэтому не работает. Но если я правильно понял.. То в MinePckg это просто меши 16 х 16, где програмно меняются точки на нём и меняется форма его? Например поставили блок как бы, добавили 4 точки к мешу и появился куб. Так что ли это работает? Заранее благодарю)
|
|
| |
KamiRonin | Дата: Среда, 23 Октября 2013, 16:51 | Сообщение # 26 |
почти ветеран
Сейчас нет на сайте
| Цитата robertono ( ) Там ведь кубы это просто меш, 16х16х** , и на что добавлять то риджид боди? там к chunk'у добавляется вся комплектация для полноценного куба - меш фильтр, меш рендер, ничего не стоит добавить еще что либо в поля класса. Цитата robertono ( ) но ведь делая на лучах можно уже не иметь Pro версию математика быстрее рейкаста (в большинстве случаев), в твоем примере имеешь дело с пятью цифрами и простыми формулами для расчета. она будет в разы быстрее работать чем 500k лучей на каждом тике разбрасывать. имхо. Цитата robertono ( ) А что если рендерить у кубов не все 6 сторон, а только 3 которые в данный момент видно? у реального куба как ты это сделаешь?? Цитата robertono ( ) А вот насчёт Mine Package... Я не смог найти нормальных исходных кодов. Я находил те, которые на сурс фордже оставил разработчик, скачал, но блоки не ломаются не знаю что ты смотрел - у меня полный комплект исходников (ну по крайней мере - всю логику я видел по цепочке и dll нет), скачанных с сайта автора. "ломаются" не совсем понятно. в моем варианте если три раза пнешь по кубу он исчезает открывая дыру в скале (с правильными текстурами кстати). в тестовом проекте я туннель пропинал кубов в 20 глубиной.
а MeshMerge не посмотрел?
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
robertono | Дата: Среда, 23 Октября 2013, 17:49 | Сообщение # 27 |
Чокнутый Кот
Сейчас нет на сайте
| Цитата KamiRonin ( ) у меня полный комплект исходников Можете мне скинуть исходники? А насчёт ломаются - я имел ввиду разрушение , удаление блоков.
Цитата KamiRonin ( ) а MeshMerge не посмотрел? Вы мне вроде не скидывали это. Где можно почитать про это ? Я только нашёл в ютубе Mesh Combine который группировал как то объекты так что создавал из 50 DC - 1.
Цитата KamiRonin ( ) она будет в разы быстрее работать чем 500k лучей на каждом тике разбрасывать 2к лучей достаточно) Просто минус оклюжн кулинга юнити это настройка в инспекторе, и просто мне кажется это без смысленно использовать в моём варианте.Добавлено (23.10.2013, 17:33) --------------------------------------------- KamiRonin, mesh merge тоже самое что и merge combine? (mesh.combineMeshes) Добавлено (23.10.2013, 17:49) --------------------------------------------- KamiRonin, ой, пардон, ссылку на mesh merge вы давали
|
|
| |
KamiRonin | Дата: Среда, 23 Октября 2013, 17:53 | Сообщение # 28 |
почти ветеран
Сейчас нет на сайте
| Цитата robertono ( ) Вы мне вроде не скидывали это. Где можно почитать про это ? Цитата KamiRonin ( ) Кроме совета использовать MeshMerge и делать все копии полностью идентично префабу (scale, rotate). на слове СОВЕТ посмотри. Цитата robertono ( ) Можете мне скинуть исходники? MinPackage прокрути страницу вниз.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
Xakep | Дата: Среда, 23 Октября 2013, 17:55 | Сообщение # 29 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата KamiRonin ( ) математика быстрее рейкаста (в большинстве случаев), в твоем примере имеешь дело с пятью цифрами и простыми формулами для расчета. она будет в разы быстрее работать чем 500k лучей на каждом тике разбрасывать. имхо. а рейкаст - это тебе не матиматиека чтоли? ну а вообще да, нужно еще уметь правильно применять его, вот сам смотри, у тебя очень много объектов, если не запилить поиск по бинарному дереву (KD-Tree или мое любимое BVH деревья), то у тебя фпс скатится еще ниже чем был, потому-что для каждого треугольника, у каждого объекта, придется провести тест на пересечения луча с треугольником.
|
|
| |
KamiRonin | Дата: Среда, 23 Октября 2013, 18:00 | Сообщение # 30 |
почти ветеран
Сейчас нет на сайте
| Цитата Xakep ( ) придется провести тест на пересечения луча с треугольником. не требуется. размер "куба" известен заранее. координаты его - три числа. не нужно ВООБЩЕ учитывать треугольники и плоскости. рассчитывается только виртуальное размещение куба в целом по лини луча!!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
Xakep | Дата: Среда, 23 Октября 2013, 18:02 | Сообщение # 31 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата KamiRonin ( ) не требуется. размер "куба" известен заранее. координаты его - три числа. не нужно ВООБЩЕ учитывать треугольники и плоскости. рассчитывается только виртуальное размещение куба в целом по лини луча!! а ну да точно ) но разбиение пространства все равно требуется, хотя в Unity наверное это и так делается.
|
|
| |
robertono | Дата: Среда, 23 Октября 2013, 18:44 | Сообщение # 32 |
Чокнутый Кот
Сейчас нет на сайте
| Есть одна игра, Ace of Spades. Шутер в кубическом мире. Кубы не имеют текстуры, это просто кубы разного цвета. Чанков я так понял там тоже нету, потому что не видно что бы они там грузились. Тогда получается что там весь мир одним дров калсом рисуется? Движок у них вроде как свой.
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 12:00 | Сообщение # 33 |
Сэнсэй
Сейчас нет на сайте
| В любом случае один DrawCall на куб - это слишком жирно, даже с учетом использования батчинга (или инстансинга). Волшебным образом сотни DC не превращаются в один, для этого рендер должен выполнить некоторую работу и постоянно передавать данные из оперативной в видеопамять, вообщем все это занимает время. Occlusion culling'ом кубы проверять - тоже жесткий оверхед.
Выходом может бы работа на уровне выше, чем просто один куб. Скажем, для здания в первом посте можно один этаж из кубов просто объединить в единый меш, т.е. в один кусок монолитной геометрии. Можно объединять даже в два и более этажей. Если предположить, что в здании 10 этажей и один состоит из 50 кубов, то при отрисовке по одному кубу рендеру нужно собрать 10 * 50 = 500 инстансов в один буфер. Если у нас есть полноценный готовый этаж, то мы просто рисуем 10 этажей и работаем всего лишь с 10-ю инстансами, вместо 500. Для 6 зданий разница будет между 60 и 3000 инстансами, что как бы намекает. В случае, если какое-либо здание или его часть собирается разваливаться, то перед этим просто конкретный "этаж-меш" заменяется на такой же набор уже отдельных кубов и к ним применяется физика например.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
KamiRonin | Дата: Четверг, 24 Октября 2013, 12:21 | Сообщение # 34 |
почти ветеран
Сейчас нет на сайте
| Цитата Archido ( ) Волшебным образом сотни DC не превращаются в один я сделал для опыта встроенный в Unity Mesh.CombineMesh и у меня с этим зданием DC стал 8-14, а был 1840. при этом странное дело - увеличивается (!!) количество вертексов и трисов. хоть незначительно но все таки. и на скорость это не влияет.
Цитата Archido ( ) Occlusion culling'ом кубы проверять - тоже жесткий оверхед. а там не надо их проверять. ОС сам вырубит из обработки все, что вне поля зрения -- до приложения шейдеров и т.п. отличная технология и полностью здесь подходит. просто она в Про версии и для нее префаб нужно готовить лучше.
Цитата Archido ( ) то при отрисовке по одному кубу рендеру нужно собрать 10 * 50 = 500 инстансов в один буфер. Если у нас есть полноценный готовый этаж, то мы просто рисуем 10 этажей и работаем всего лишь с 10-ю инстансами 1. робертону смысл как раз не в едином монолите здания, а в "разбиваемых" кубах. 2. внутри MinePckg как раз реализована идеальная технология одного DC на весь меш получившегося "здания". Цитата Archido ( ) В случае, если какое-либо здание или его часть собирается разваливаться, то перед этим просто конкретный "этаж-меш" заменяется на такой же набор уже отдельных кубов и к ним применяется физика например. тут шило на мыло - во первых нужно как то узнать что будет вовлечено, во вторых произвести АДЕКВАТНУЮ замену в кубах... тут больше вопросов чем решений!!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 14:04 | Сообщение # 35 |
Сэнсэй
Сейчас нет на сайте
| Цитата KamiRonin ( ) я сделал для опыта встроенный в Unity Mesh.CombineMesh и у меня с этим зданием DC стал 8-14, а был 1840. при этом странное дело - увеличивается (!!) количество вертексов и трисов. хоть незначительно но все таки. и на скорость это не влияет. Влияет. Одно дело когда ты рисуешь геометрию за 8-14 DIPов и передаешь туда 8-14 transform матриц, и совсем другое, когда ты пытаешься рисовать 1840 отдельных кубов, включаешь и готовишь инстансинг, в процессе передавая из оперативной в видеопамять 1840 матриц. Это Hardware Instancing и даже он медленее, чем просто "голую" геометрию рисовать.
Цитата KamiRonin ( ) а там не надо их проверять. ОС сам вырубит из обработки все, что вне поля зрения Т.е. "OC" все вырубит тоже при помощи магии? Ну ок.
Цитата KamiRonin ( ) 1. робертону смысл как раз не в едином монолите здания, а в "разбиваемых" кубах. Спасибо, кэп.
Цитата KamiRonin ( ) 2. внутри MinePckg как раз реализована идеальная технология одного DC на весь меш получившегося "здания". Если там realtime, то оно все равно будет тормознее, чем с заранее подготовленной геометрией работать.
Цитата KamiRonin ( ) во первых нужно как то узнать что будет вовлечено Проблем не вижу.
Цитата KamiRonin ( ) во вторых произвести АДЕКВАТНУЮ замену в кубах Ты похоже через строчку читал. Есть куча кубов, упакованная в один кусок геометрии (грубо говоря этим кубам сделали "батчинг" в оффлайне, в добавок можно повыкидывать стороны соприкасающихся кубов, что поможет сэкономить polycount) и которая представлена одним объектом. В чем сложность заменить один объект из кубов на пачку точно таких же, но представленных как отдельные объекты?
Весь профит здесь в том, что едва ли все объекты в игре будут сразу же разрушены. Куча объектов или их частей с которыми игрок еще не взаимодействовал будут отрисовываться с максимальной эффективностью.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Xakep | Дата: Четверг, 24 Октября 2013, 14:44 | Сообщение # 36 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата Archido ( ) Влияет. Одно дело когда ты рисуешь геометрию за 8-14 DIPов и передаешь туда 8-14 transform матриц, и совсем другое, когда ты пытаешься рисовать 1840 отдельных кубов, включаешь и готовишь инстансинг, в процессе передавая из оперативной в видеопамять 1840 матриц. Это Hardware Instancing и даже он медленее, чем просто "голую" геометрию рисовать. нужно все эти матрицы в текстуру грузить, тогда они работают намного быстрее, потому-что видео карте работать с текстурами нанмого проще, как раз это и есть псевдоинстансинг, а просто влоб грузить 1840 матриц, то там конечно может быть спад производительности, я раньше делал демку, где как раз таки несколько сотен тысяч одинаковых объектов рисовлись именно этим методом - а именно трава, просто 2 плоскости скрещенные и на них текстура наложенна (вообще разные пробовал, деле еще и треугольник и звездочки), при этом еще и анимация была на траве, и все работало с fpc 180-200, и при этом все еще вся сцена была загружена таррайном и так же сотни деревьев и разных кустиков. Так что я все таки за инстансинг, просто нужно правильно им пользоваться, ну и конечно я это не юнити делал, но я думаю там та же технология, единственное юнити может навешать свои обработчики для объектов, которые смогут эту самую оптимизацию свести на нет.
|
|
| |
Xakep | Дата: Четверг, 24 Октября 2013, 14:50 | Сообщение # 37 |
めちゃくちゃちゃ
Сейчас нет на сайте
| хотя конечно в этой демке я и другие оптимизации использовал, анимация была не на все объекты, ну и инстансинг я разбил на патчи, чтобы не все рисовалось, и использовал LOD, при удалении там одна плоскость только рисовалась.
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 15:10 | Сообщение # 38 |
Сэнсэй
Сейчас нет на сайте
| Цитата Xakep ( ) нужно все эти матрицы в текстуру грузить, тогда они работают намного быстрее, потому-что видео карте работать с текстурами нанмого проще, как раз это и есть псевдоинстансинг Да, это довольно прикольный вариант , но минус всех "псевдоинстансингов" в том, что нужно хранить полностью всю отрисовываемую геомеотрию, а не только один инстанс. В реале можно хранить столько, сколько планируется на один DIP рисовать и только разные текстуры подсовывать:) , но тут без "тонкой" ручной настройки не обойтись, Unity так врятле сумеет. Еще кстати, Lock текстуры (если нужно какие-то матрицы обновить) довольно противная операция, т.к. блокирует весь конвеер из-за синхронизации между CPU и GPU во время передачи данных. Поэтому оно больше для нечасто изменяемых объектов подходит, но в данном случае это наверное самое оно.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
KamiRonin | Дата: Четверг, 24 Октября 2013, 16:22 | Сообщение # 39 |
почти ветеран
Сейчас нет на сайте
| Цитата Archido ( ) Влияет. у меня - нет. как был 68 fps так и остался.Цитата Archido ( ) Т.е. "OC" все вырубит тоже при помощи магии? Ну ок. оклюжн для того и создан чтобы исключать. он быстро работает и оверхеда здесь не вижу никакого. тем более жестокого. Цитата Archido ( ) Спасибо, кэп. на здоровье! (зачем буковки разводить про то что с самого начала было отвергнуто за ненадобностью?) Цитата Archido ( ) Если там realtime, то оно все равно будет тормознее, чем с заранее подготовленной геометрией работать. при загрузке - это для тебя реалтайм? тогда да. на загрузке один раз сложился в единый меш весь город. потом работа только с кусками. Цитата Archido ( ) Проблем не вижу. ну так нарисуй решение. хотя б алгоритмом! Цитата Archido ( ) Есть куча кубов, упакованная в один кусок геометрии (грубо говоря этим кубам сделали "батчинг" в оффлайне) вот это волшебство! если их упаковали ДО размещения в игру (а иначе что значит "офлайн" - забили в префаб?? и как тогда в префабе забатчить??), то они просто - один кусок геометрии! и нет там кубов! как потом найти место для второго сверху на два вглубине?!? пересчитывать все координаты?!?! _____________________________________________
не! видать никто не качал MinePackage - ну есть же все! все уже сде ла но!!!! и бесплатно!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
robertono | Дата: Четверг, 24 Октября 2013, 19:29 | Сообщение # 40 |
Чокнутый Кот
Сейчас нет на сайте
| KamiRonin, meshmerger не справился с тем что бы превратить 4300 кубов в один меш и начал жаловаться 41 ошибками и первая его расстройство то что больше 65000 вершин . Поэтому я сделал свой скрипт из примера документации mesh.combinemeshes, и скрипт впихнул 60 % здания в меш. Остальное отказался, наверно потому что больше 65к вершин , хотя не понимаю как может быть 65к (в кубе одном из юнити, сколько вершин ? 12 ?). Но хоть он и сделал только половину вместо 60 фпс целого здания, у меня стал 1 меш где 60 % его и стало 1600 фпс (!!) . А есть способ вернуть блоки опять в отдельные кусочки ? Или нужно удалить этот целый меш, включить отдельные блоки, применить действие к определённым, вытащить определённые из геймобджекта, и опять запихать всё в 1 меш ? А можно делать combinemeshes в ассинхронном потоке (или как он там, может я опять что то напутал, вообщем мульти-ядерно) ?
|
|
| |
|