Страница 1 из 2

Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 02:37
a3dline
Вопрос собственно избитый, но что-то я ни как не могу с ним подружится.
Суть: Объекты на сцене создаются программно (ну например деревья или камушки :) )
Мы перемещаемся по сцене и видим все эти деревья и камушки. :)

Перемещаясь по сцене создаются новые объекты (при изменении позиции каждые N координат запрашиваем формулу вернуть координаты новых объектов - и выводим на экран)
Вопрос: как мне удалить объекты, расстояние до которых превышает дистанцию видимости.

Сейчас я делаю так:
Мир делю на квадратные зоны, перебираю зоны при изменении позиции игрока каждые N координат (там же где и добавляю объекты) и те зоны, расстояние до оных больше дистанции удаляю из списка вместе со всем со всем содержимым.
Но проблема вот в чем - я постоянно при перемещении перебираю этот массив, естественно это ресурсоневыгодно. Да и перебор массива например из 100*100 таких зон тратит драгоценные мс кадра.

Сам понимаю что это какойто неправильный метод. :-\ Подскажите, в какую сторону копать.

з.ы. Как я понимаю и создаю я объекты не самым лучшим образом.

Вообще, на эту тему "Дальность видимости", отсечение невидимых объектов, отображение объектов только в пирамиде видимости. Где читать? Что смотреть? Может что что знает.
Я не настаиваю. если кто то обладает или знает где можно обладеть :) нужной мне информацией - буду трехкратновквадрате благодарен!

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 03:20
DbIMok
я бы наверное пошел читать справку по камере, зная, что у нее есть "дальний" конец видимости. там бы прочитал:
For performance reasons, you might want to cull small objects earlier. For example, small rocks and debris could be made invisible at much smaller distance than large buildings. To do that, put small objects into a separate layer and setup per-layer cull distances using Camera.layerCullDistances script function.

и попробовал бы этот метод.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 12:10
a3dline
Если я правильно понял, то использовать farClipPlane для отсечения объектов на дистанции.
Возникло 2 вопроса:
1. Камера лишь отсекает геометрию из рендера, но она ее не удаляет? Есть возможность повесить объекту событие, которое само удалит его, если он исчез из рендера?
2. Что будет с геометрией, которая находится "за спиной" камеры?

Прошу обратить внимание на то, что мир у меня динамический, т.е. изначально никакой локации я не рисую, все строиться программно (мешь поверхности, префабы с моделями и т.д.)

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 13:30
DbIMok
a3dline писал(а):Если я правильно понял, то использовать farClipPlane для отсечения объектов на дистанции.

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

http://unity3d.com/support/documentatio ... sible.html
a3dline писал(а):Что будет с геометрией, которая находится "за спиной" камеры?

ее не будет видно

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 15:45
a3dline
Спасибо большое за совет. Попробую реализовать через отсечение камерой.
Все же мне немного не понятно что будет происходить с объектами за спиной. Если объект за спиной не будет виден, то у него также сработает событие OnBecameInvisible.
А если я на событие повешу функцию удаления, то объекты будут удалятся и за спиной, что естественно будет тормозить работу приложения, так как при повороте камеры объект придется создавать снова.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 16:26
DbIMok
вы определитесь, хотите или не хотите удалять объекты вне поля видимости. "за" камерой они, слева или справа от области видимости, это уже второстепенные детали.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 16:53
a3dline
У меня ничего не вышло :(
Повесил на событие OnBecameInvisible() удаление объекта, очень странно, но когда объект пропадает из видимости камеры событие не вызывается. Однако OnBecameVisible() вызывается сразу после создания объекта, даже если он был создан за приделами допустимой дистанции.

Естественно настроил слой, определил в него объекты, задал дистанцию.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:06
Neodrop
Зачем вообще этот форум, если его никто не читает? ~x(

[V] Octree отсечение : viewtopic.php?f=66&t=1623
[V] Скрыть/Показать на дистанции viewtopic.php?f=66&t=1409 (0.001 секунды на 10 000 объектов)

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:15
DbIMok
в билде или в редакторе? потому что в редакторе есть своя камера, которая может видеть то, что не видит ваша. а раз она объект рендерит, инвизибл не вызывается

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:19
a3dline
Да как раз это я уже и определил. При открытой сцене ничего не работало.
Однако теперь я наблюдаю картину, когда у меня удаляются объекты за спиной. Хотя изначально задача была удалять объекты на дистанции от персонажа (дальность видимости).
Попробую перед удалением проверять расстояние до игрока. Посмотрю на сколько это работоспособно и затратно по ресурсам.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:24
a3dline
Neodrop писал(а):Зачем вообще этот форум, если его никто не читает? ~x(

[V] Octree отсечение : http://unity3d.ru/distribution/viewtopi ... =66&t=1623
[V] Скрыть/Показать на дистанции http://unity3d.ru/distribution/viewtopi ... =66&t=1409 (0.001 секунды на 10 000 объектов)



Вообще то эти 2 ветки я читал и скрипт смотрел. Однако, смею заметить, что моя задаче не относится к показу или непоказу обьектов на заданной дистанции. Моя задача в Удалении! Дестрое! объектов за приделами дистанции.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:25
Neodrop
А не хватает смекалки подправить пару строк?
Это в точности две одинаковые задачи.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:37
a3dline
Дак а в чем смысл. Ваш скрипт перебирает массив объектов в текущем "рендере", мой первоначальный скрипт перебирал массив объектов в определенном мной массиве.
Вопрос то стоит как раз в том, что способ перебора, если объектов в сцене даже 100*100 уже значительно требует затрат (хотябы для простого перебора) . Прада я перебор ограничивал интервалом времени в 1-м кадре.

Я ищу имеено идеи и подходы, отличные от предложенного мной. Так как считаю постоянные переборы массивов или каких либо списков - не хорошим подходом к решению проблемы.
Система с событиями от камеры меня заинтересовала. Пока рассматриваю это направление.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 17:47
Neodrop
Чего ? Где мой скрипт чего перебирает? Вы даже приблизительно не поняли принципа работы.
Там вообще нет перебора чего-бы-то-ни-было.
И, как я писал уже, 100 х 100 объектов занимают 1 миллисекунду. Если это для вас много, копайте дальше.

Re: Удаление объектов вне зоны видимости.

СообщениеДобавлено: 21 сен 2011, 18:26
a3dline
Ну почему же не перебирает.
если вешать скрипт на каждый создаваемый объект - это потеря памяти, иначе: явно перебор:

void HideChildrens(bool show)
{
if ( childs == null || childsMode == HideChilds.ALLWAYS_CHECK_CHILDS_COUNT) childs = gameObject.GetComponentsInChildren<Renderer>();
count = childs.Length;
for (int i = 0; i < count; i++) childs[i].enabled = show;
}

И прошу вас, давай будем спокойно. Если я чего либо не понимаю, или вы не понимаете чего я хочу. Иначе, зачем вообще нужен форум.