Использование Occlusion Culling

Раздел, посвящённый самому важному - скорости.

Использование Occlusion Culling

Сообщение Ruslan_ 28 апр 2013, 15:11

Всем привет! Уже который день копаюсь в форумах, но ни как не могу найти интересующий меня вопрос. Мне нужно в Unity создать массив кубов, на пример 15x15x15 = итого 3375 кубов. Как оказалось, такое количество объектов очень сильно влияет на производительность. Вариант – собрать все в один меш не очень подходит т.к. кубы динамические. Стал заморачиваться с Occlusion Culling, результаты есть, но не совсем то, что мне нужно. Весь массив кубов будет находиться перед камерой. Все что у меня получилось сделать с Culling – это прятать объекты т.е. не рендерить, которые за пределами видимости камеры, а мне нужно прятать объекты которые и в пределах видимости камеры, но перекрытые другими объектами. Ни как не получается добиться такого результата. Если объекты сделать статическими и включить запекание, то все работает, так как мне нужно, а созданные во время выполнения программы объекты не обрабатываются оптимизатором Occlusion Culling. Это вообще реально сделать для динамических объектов? Если реально, опишите, пожалуйста, этот процесс, и какие нюансы есть в этом. В офф доке вычитал, что можно сделать такое, но это теория, а на практике может оказаться совсем иначе. Использую Occlusion Area и Occlusion Portal. Occlusion area растягиваю на всю область, где у меня будет камера и массив кубов, Occlusion Portal растягиваю только на область, в которой будет массив. Пробовал применить портал для каждого куба, но тоже результатов ноль. Не рендерятся только те кубики которые выходят за пределы видимости камеры.
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение Ruslan_ 30 апр 2013, 07:36

Что ни кто не сталкивался с такой задачей? На этом форуме решались задачки и по сложнее…
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение newArray 30 апр 2013, 08:43

как отключить даже те которые закрыты другими не знаю - вернее оклюжен то как раз и не рендрит те которые закрытые другими го - вопрос не понял. Оклюжен работает с 2 типами динамические и статические. для динамич одна настройка для тех другая. но что интересно что действительно такое количество движущихся одновременно кубов ложат процессор - а статические воше без проблем. в юнити не надо даже 100500 движущихся чтоб положить проц надо всего 10500.
Хозяин писал скрипт отключение объектов на заданной дистанции - типа такого поищи на форуме мож подойдет http://unity3dscripts.16mb.com/Scripts/turnoff/ . думаю если там сделать кубы движущимися то будет все вполне оптимизированно
http://unity3dscripts.16mb.com/translate/occlusion/01/
newArray
Адепт
 
Сообщения: 1226
Зарегистрирован: 14 фев 2013, 07:03
Откуда: оттуда

Re: Использование Occlusion Culling

Сообщение Ruslan_ 30 апр 2013, 12:50

Все кубики одновременно двигаться не будут, где-то 20% от всего будут в движении, и то с определенной периодичностью. Попробую еще более понятно описать задачу: на сцене программно создается трехмерный массив (матрица) из кубиков. Размер массива приблизительно 15x15x15. С одной стороны этого массива расположена камера. В камеру входит весь массив. Сейчас без оптимизации рендерится весь массив, мне же нужно чтобы они рендерились если между кубиками и камерой прямая видимость, те кубы которые перекрываются передними кубиками и камера их не видит, рендер должен их игнорировать. Возможно я что-то не правильно делаю или же такое сделать не реально. Вариант – отключить рендер на заданной дистанции в данной задаче не применим. Камера будет стоять на месте всегда, а кубики будут двигаться только вертикально и в пределах габаритов массива.
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение pod4444 30 апр 2013, 13:45

в случае 3к объектов вас просто спасет динамический батчинг.
как вариант объекты можно отключать рейкастом, пускать из камеры в объект луч и проверять на пересечение с другими
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Использование Occlusion Culling

Сообщение BornFoRdeatH 30 апр 2013, 13:51

pod4444 писал(а):в случае 3к объектов вас просто спасет динамический батчинг.
как вариант объекты можно отключать рейкастом, пускать из камеры в объект луч и проверять на пересечение с другими


Не спасет батчинг, он проц сожрет вместе с фпс :) Лучше отрезать камерой обьекты на нном расстоянии и заменить их фогом.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Использование Occlusion Culling

Сообщение Ruslan_ 30 апр 2013, 14:00

Occlusion Culling не поможет? Допустим размер массива будет 2x2x2. Как это сделать Occlusion Culling-ом?
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение BornFoRdeatH 30 апр 2013, 14:10

Вы не понимаете принципов работы. Оклюжин кулинг отрезает только обьекты вне вьюпорта, он не может отрезать обьекты перекрытые другими обьектами, так как рендеринг начинается с заднего плана к переднему.

Вам нужен фруструм кулинг, не оклюжин. http://docs.unity3d.com/Documentation/S ... ances.html
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Использование Occlusion Culling

Сообщение pod4444 30 апр 2013, 14:41

BornFoRdeatH писал(а):
Не спасет батчинг, он проц сожрет вместе с фпс :) Лучше отрезать камерой обьекты на нном расстоянии и заменить их фогом.

я написал, в случае 3к объектов не сожрет, только на слабых целеронах может быть, на обычном сборке PC все будет окей
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Использование

Сообщение Ruslan_ 30 апр 2013, 14:50

Как строится графика я понимаю. Спасибо вам за вариант решения, буду пробовать, но все равно вопрос остается открытым. Вот оф док, где четко написано что Occlusion Culling прячет от рендера объекты которые спрятаны от камеры другими объектами.

Occlusion Culling is a feature that disables rendering of objects when they are not currently seen by the camera because they are obscured by other objects. This does not happen automatically in 3D computer graphics since most of the time objects farthest away from the camera are drawn first and closer objects are drawn over the top of them (this is called "overdraw"). Occlusion Culling is different from Frustum Culling. Frustum Culling only disables the renderers for objects that are outside the camera's viewing area but does not disable anything hidden from view by overdraw. Note that when you use Occlusion Culling you will still benefit from Frustum Culling.
http://docs.unity3d.com/Documentation/M ... lling.html

Перевод:
Occlusion Culling – это функция, отключающая рендеринг объектов, которые закрыты другими объектами. К сожалению, в 3d-графике это не происходит автоматически, поскольку при 3d-моделировании сначала рисуются объекты, которые находятся дальше от камеры, а затем поверх этих объектов прорисовываются объекты, выходящие на передний план (это называется "overdraw"). Occlusion Culling отличается от Frustum Culling (отсечение по пирамиде видимости). Frustum Culling отключает рендер объектов, находящихся в не поле видимости камеры, но не рендер объектов спрятанных один за другим. Обратите внимание, что при использовании Occlusion Culling важно также использование Frustum Culling.
http://unity3dscripts.16mb.com/translate/occlusion/01/

Может быть я чего-то не до понимаю из написанного в документации Unity...

Я не пытаюсь здесь кому-то что-то доказать, хочу только выяснить почему написано одно а получается другое. Пытаюсь сделать так называемое портальное обрезание динамических объектов с Occlusion Culling + Occlusion Portal
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение BornFoRdeatH 30 апр 2013, 15:02

Приношу свои извинения, я неправильно выразился, и меня неправильно поняли.

В любом случае оклюжин кулинг работает только со статик обьектами.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Использование Occlusion Culling

Сообщение Ruslan_ 02 май 2013, 13:20

Да все нормально, главное все выяснилось с Occlusion Culling). Решил задачку лучами, сканирую определенную область с определенным шагом и включаю рендер на кубиках. Спасибо всем за идеи!
Ruslan_
UNец
 
Сообщения: 10
Зарегистрирован: 28 апр 2013, 14:25

Re: Использование Occlusion Culling

Сообщение alex4x 06 окт 2016, 13:24

А кто нибудь разобрался как для динамических объектов использовать CullingGroupAPI для отсечений невидимого?
Судя по документации получается что применять эти группы можно только для не двигающихся и не разрушаемых объектов, пусть и динамически сделанных, но всё же статичных.
Так в чём тогда профит ?
alex4x
UNец
 
Сообщения: 11
Зарегистрирован: 29 июн 2016, 15:12


Вернуться в Оптимизация

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

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