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

Программирование на Юнити.

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

Сообщение a3dline 21 сен 2011, 02:37

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

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

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

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

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

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

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

Сообщение DbIMok 21 сен 2011, 03:20

я бы наверное пошел читать справку по камере, зная, что у нее есть "дальний" конец видимости. там бы прочитал:
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.

и попробовал бы этот метод.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение a3dline 21 сен 2011, 12:10

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

Прошу обратить внимание на то, что мир у меня динамический, т.е. изначально никакой локации я не рисую, все строиться программно (мешь поверхности, префабы с моделями и т.д.)
Аватара пользователя
a3dline
UNец
 
Сообщения: 31
Зарегистрирован: 29 авг 2011, 00:52

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

Сообщение DbIMok 21 сен 2011, 13:30

a3dline писал(а):Если я правильно понял, то использовать farClipPlane для отсечения объектов на дистанции.

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

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

ее не будет видно
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение a3dline 21 сен 2011, 15:45

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

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

Сообщение DbIMok 21 сен 2011, 16:26

вы определитесь, хотите или не хотите удалять объекты вне поля видимости. "за" камерой они, слева или справа от области видимости, это уже второстепенные детали.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение a3dline 21 сен 2011, 16:53

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

Естественно настроил слой, определил в него объекты, задал дистанцию.
Аватара пользователя
a3dline
UNец
 
Сообщения: 31
Зарегистрирован: 29 авг 2011, 00:52

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

Сообщение Neodrop 21 сен 2011, 17:06

Зачем вообще этот форум, если его никто не читает? ~x(

[V] Octree отсечение : viewtopic.php?f=66&t=1623
[V] Скрыть/Показать на дистанции viewtopic.php?f=66&t=1409 (0.001 секунды на 10 000 объектов)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

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

Сообщение DbIMok 21 сен 2011, 17:15

в билде или в редакторе? потому что в редакторе есть своя камера, которая может видеть то, что не видит ваша. а раз она объект рендерит, инвизибл не вызывается
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение a3dline 21 сен 2011, 17:19

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

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

Сообщение a3dline 21 сен 2011, 17:24

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 ветки я читал и скрипт смотрел. Однако, смею заметить, что моя задаче не относится к показу или непоказу обьектов на заданной дистанции. Моя задача в Удалении! Дестрое! объектов за приделами дистанции.
Аватара пользователя
a3dline
UNец
 
Сообщения: 31
Зарегистрирован: 29 авг 2011, 00:52

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

Сообщение Neodrop 21 сен 2011, 17:25

А не хватает смекалки подправить пару строк?
Это в точности две одинаковые задачи.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

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

Сообщение a3dline 21 сен 2011, 17:37

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

Я ищу имеено идеи и подходы, отличные от предложенного мной. Так как считаю постоянные переборы массивов или каких либо списков - не хорошим подходом к решению проблемы.
Система с событиями от камеры меня заинтересовала. Пока рассматриваю это направление.
Аватара пользователя
a3dline
UNец
 
Сообщения: 31
Зарегистрирован: 29 авг 2011, 00:52

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

Сообщение Neodrop 21 сен 2011, 17:47

Чего ? Где мой скрипт чего перебирает? Вы даже приблизительно не поняли принципа работы.
Там вообще нет перебора чего-бы-то-ни-было.
И, как я писал уже, 100 х 100 объектов занимают 1 миллисекунду. Если это для вас много, копайте дальше.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

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

Сообщение a3dline 21 сен 2011, 18:26

Ну почему же не перебирает.
если вешать скрипт на каждый создаваемый объект - это потеря памяти, иначе: явно перебор:

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;
}

И прошу вас, давай будем спокойно. Если я чего либо не понимаю, или вы не понимаете чего я хочу. Иначе, зачем вообще нужен форум.
Аватара пользователя
a3dline
UNец
 
Сообщения: 31
Зарегистрирован: 29 авг 2011, 00:52

След.

Вернуться в Скрипты

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

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