Built-in array обнулейшн

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 04:46

Товарищи, подскажите, каков принцип удаления массива?
Синтаксис:
Используется csharp
       
private GameObject[] tails;
void Dosomething {
tails = GameObject.FindGameObjectsWithTag ("tail");
Debug.Log(tails.Length.ToString());
for (int i = 0; i < tails.Length; i++)
{
Destroy (tails [i]);
tails[i] = null;
}
Debug.Log(tails.Length.ToString());}


Оба дебага показывают одинаковое число. Каким образом можно удалить массив, чтобы он действительно был пуст?
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

Re: Built-in array обнулейшн

Сообщение Woolf 24 янв 2013, 04:58

tails=null
не ?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Built-in array обнулейшн

Сообщение eligma 24 янв 2013, 05:07

что значит одинаковое число. Ты по русски можешь сказать? вот тут же ясно написано что он его удаляет
Синтаксис:
Используется javascript
for (int i = 0; i < tails.Length; i++)
{
Destroy (tails [i]);
 
не знаю - объяви var i : int; только не глобалкой
Gleeko Multiplayer Gameplay------Знаете ли вы что протокол IPV6 в 1 000 000 раз превышает по возможностям протокол IPV4? А также протокол IPV6 официально был запущен в прошлом году 6.06 числа в 6 часов утра. Это событие отмечали во всем мире.
Аватара пользователя
eligma
Старожил
 
Сообщения: 778
Зарегистрирован: 29 фев 2012, 03:35
  • Сайт

Re: Built-in array обнулейшн

Сообщение Nicloay 24 янв 2013, 06:19

Если стандартный массив, то удалить или добавить в него элементы нельзя. когда делаешь ресайз - создается новый экземляр массива с новым количеством элементов, и после этого ссылки из старого копируются в новый.

Если используешь чтонибудь из колекций, то внутри класса сидят теже самые Массивы - размер которых изменить нельзя, и логика класса занимается тем что для начала создает массив с запасом. Предположим ты созадешь Класс Array с 100 элементами, клас Array делает массив из 120 элементов, оставляя 20 элементов null на случай если ты будешь добавлять новые элементы. (про 20 взял с потолка).


В твоем случае, когда ты присваиваешь null элементам массива, ты лишь присваиваешь null сам массив остается не изменным.

Ну и как сказал Woolf - если хочешь удалить массив, то скорее тебе нужно присвоить этой переменной null- ну и наверняка после этого garbage collector когда посчитает что этот массив больше не нужен, удалит его.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 16:59

Товарищи, вот код

Синтаксис:
Используется csharp
tails = GameObject.FindGameObjectsWithTag ("tail");
                if (tails !=null){
                for (int i = 0; i < tails.Length; i++) {
                        Destroy (tails [i]);
                }
                tails = null;}
                tails = GameObject.FindGameObjectsWithTag ("tail");
                Debug.Log(tails.Length.ToString());
                for (int i = 0; i < lenght; i++) {
                        GameObject tail = (GameObject)Instantiate (tailprefab);
                        if (i < lenght) {
                                tail.tag = "tail";
                        }
                        current = tail.transform;
                }


Таким образом, если вызывается функция впервые, то дебаг показывает 0, во второй раз вызываем - дебаг показывает столько, сколько по length. Каждый последующий вызов, даже после tails = null; дебаг показывает length. Т.е, как и было сказано - размер сохраняется. Допустим, длина - 40. Проблема в том, что при повторном запуске массив хранит 40 null элементов, а потом добавляет еще 40, итого 80. Такое удвоение очень неудобно, для вызовы каждого конкретного элемента. Придется делать проверку, первый ли это вызов или последующий, для исп-ия? Неужели нет другого варианта?
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

Re: Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 17:05

Nicloay писал(а):Если стандартный массив, то удалить или добавить в него элементы нельзя. когда делаешь ресайз - создается новый экземляр массива с новым количеством элементов, и после этого ссылки из старого копируются в новый.

Если используешь чтонибудь из колекций, то внутри класса сидят теже самые Массивы - размер которых изменить нельзя, и логика класса занимается тем что для начала создает массив с запасом. Предположим ты созадешь Класс Array с 100 элементами, клас Array делает массив из 120 элементов, оставляя 20 элементов null на случай если ты будешь добавлять новые элементы. (про 20 взял с потолка).


В твоем случае, когда ты присваиваешь null элементам массива, ты лишь присваиваешь null сам массив остается не изменным.

Ну и как сказал Woolf - если хочешь удалить массив, то скорее тебе нужно присвоить этой переменной null- ну и наверняка после этого garbage collector когда посчитает что этот массив больше не нужен, удалит его.


Если и встроенный и Array не позволяют делать так, чтобы количество существующих (!=null) хранимых объектов соответствовало его length или count, то как быть? Проверку на захламленность(автокопирование ссылок во встроенном и прибавка запасных в Array) отдельно?
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

Re: Built-in array обнулейшн

Сообщение Nicloay 24 янв 2013, 17:46

Если будешь переиспользовать место зарезервированое в твоем массиве, то лучше оставить, и просто хранить указатели на 1й и последний элемент, ну или размер массива.
Но в твоем случае, что то мне подсказывает что тебе нужна очередь а не массив. там как раз есть методы enque и deque и массивы там вобще не используются. но там минус что поиск по очереди очень медленный.

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

вот еще почитай
http://msdn.microsoft.com/en-us/library ... ylist.aspx
там есть методы и remove и TrimToSize....
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 19:08

Nicloay,
Большое спасибо Вам за помощь! :-bd

P.s Про очереди почитаю, а для геймобджектов(а мне в массиве нужны именно они) ArrayList не катит, List - для типизированных объектов как раз то. Однако, говорят, кушает многовато. А идея с сохранением первого и последнего эл-та - здравая, спасибо. :)
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

Re: Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 20:20

И все же, приходится снова вернуться к этой теме. Попробовал через List, размер не фиксированный, та же проблема, товарищи!

Синтаксис:
Используется csharp
List<GameObject> tails = new List<GameObject> ();
                Debug.Log (tails.Count.ToString ());
                tails.AddRange (GameObject.FindGameObjectsWithTag ("tail"));
                Debug.Log (tails.Count.ToString ());
                if (tails != null) {
                        for (int i = 0; i < tails.Count; i++) {
                                Destroy (tails [i]);
                        }
                        tails.Clear();
                }
                tails.AddRange (GameObject.FindGameObjectsWithTag ("tail"));
                Debug.Log (tails.Count.ToString ());
                for (int i = 0; i < length; i++) {
                        GameObject tail = (GameObject)Instantiate (tailprefab);
                        tail.tag = "tail";
                }
                tails.AddRange (GameObject.FindGameObjectsWithTag ("tail"));
                Debug.Log (tails.Count.ToString ());


Дебаги:
Первый запуск : 0, 0,0, length.
Второй запуск: 0, length,length, 3*length.

Что происходит? Что за черная магия? 8-x
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

Re: Built-in array обнулейшн

Сообщение Nialit 24 янв 2013, 22:24

Черная магия, оказалось, заключалась в том, что "Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering."
Корутина и все хорошо, товарищи :)

Да, и, надо сказать, все отлично работает и с built-in arrays, никаких проблем с индексацией и обнулением (popcorn)
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 14