Пятница, 08 Ноября 2024, 18:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Оптимизация сцены где очень много объектов
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. smile

Цитата 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 ()
нужно все эти матрицы в текстуру грузить, тогда они работают намного быстрее, потому-что видео карте работать с текстурами нанмого проще, как раз это и есть псевдоинстансинг

Да, это довольно прикольный вариант smile , но минус всех "псевдоинстансингов" в том, что нужно хранить полностью всю отрисовываемую геомеотрию, а не только один инстанс. В реале можно хранить столько, сколько планируется на один DIP рисовать и только разные текстуры подсовывать:) , но тут без "тонкой" ручной настройки не обойтись, Unity так врятле сумеет.
Еще кстати, Lock текстуры (если нужно какие-то матрицы обновить) довольно противная операция, т.к. блокирует весь конвеер из-за синхронизации между CPU и GPU во время передачи данных. Поэтому оно больше для нечасто изменяемых объектов подходит, но в данном случае это наверное самое оно.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
KamiRoninДата: Четверг, 24 Октября 2013, 16:22 | Сообщение # 39
почти ветеран
Сейчас нет на сайте
Цитата Archido ()
Влияет.

у меня - нет. как был 68 fps так и остался.
Цитата Archido ()
Т.е. "OC" все вырубит тоже при помощи магии? Ну ок.

оклюжн для того и создан чтобы исключать. он быстро работает и оверхеда здесь не вижу никакого. тем более жестокого.
Цитата Archido ()
Спасибо, кэп.

на здоровье! (зачем буковки разводить про то что с самого начала было отвергнуто за ненадобностью?)
Цитата Archido ()
Если там realtime, то оно все равно будет тормознее, чем с заранее подготовленной геометрией работать.

при загрузке - это для тебя реалтайм? тогда да. на загрузке один раз сложился в единый меш весь город. потом работа только с кусками.
Цитата Archido ()
Проблем не вижу.

ну так нарисуй решение. хотя б алгоритмом!
Цитата Archido ()
Есть куча кубов, упакованная в один кусок геометрии (грубо говоря этим кубам сделали "батчинг" в оффлайне)

вот это волшебство! smile если их упаковали ДО размещения в игру (а иначе что значит "офлайн" - забили в префаб?? и как тогда в префабе забатчить??), то они просто - один кусок геометрии! и нет там кубов! как потом найти место для второго сверху на два вглубине?!? пересчитывать все координаты?!?!
_____________________________________________

не! видать никто не качал MinePackage - ну есть же все! все уже сде ла но!!!! и бесплатно!


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
robertonoДата: Четверг, 24 Октября 2013, 19:29 | Сообщение # 40
Чокнутый Кот
Сейчас нет на сайте
KamiRonin, meshmerger не справился с тем что бы превратить 4300 кубов в один меш и начал жаловаться 41 ошибками и первая его расстройство то что больше 65000 вершин biggrin .
Поэтому я сделал свой скрипт из примера документации mesh.combinemeshes, и скрипт впихнул 60 % здания в меш. Остальное отказался, наверно потому что больше 65к вершин , хотя не понимаю как может быть 65к (в кубе одном из юнити, сколько вершин ? 12 ?).
Но хоть он и сделал только половину вместо 60 фпс целого здания, у меня стал 1 меш где 60 % его и стало 1600 фпс (!!) .
А есть способ вернуть блоки опять в отдельные кусочки ? Или нужно удалить этот целый меш, включить отдельные блоки, применить действие к определённым, вытащить определённые из геймобджекта, и опять запихать всё в 1 меш ?
А можно делать combinemeshes в ассинхронном потоке (или как он там, может я опять что то напутал, вообщем мульти-ядерно) ?
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг