| 
				
				Оптимизация сцены где очень много объектов
				 |   |  
| 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 в ассинхронном потоке (или как он там, может я опять что то напутал, вообщем мульти-ядерно) ?
 |  
| 
 | 
 |    |     
		
		 
 |