как избавиться от GetComponent()?

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

как избавиться от GetComponent()?

Сообщение DedoK 24 фев 2013, 22:55

Прочитал вот здесь
http://habrahabr.ru/post/169451/

4 Минимизируйте вызовы Object.Find().
Думаю, не стоит объяснять, что время этой операции зависит от кол-ва объектов на сцене. Сюда же относятся функции типа GetComponent().


С минимизацией финда согласен, но вот с гет компонент ... вроде он ничего не перебирает, в нём используется название скрипта, но количество скриптов вроде обычно много не бывает , ну ладно, стал думать как избавится от него тоже.
Придумал сделать массив2д[ переменные обьекта , обьект]
С "переменные обьекта" всё просто, а вот "обьект" научился получать его ID = -1*Ooo.GetInstanceID() умножаю на -1 потому что ID отрицательный выдаёт.... шестизначный и при повторном запуске увеличивается на 3000 в среднем.
я обьявил массив
int[,] _TTH = new int[11,999999];
но понятно что это к хорошему не приведёт.
посоветуйте как избавиться от GetComponent()? может есть какие нибудь другие ID у геймобджектов в юнити?
DedoK
UNец
 
Сообщения: 31
Зарегистрирован: 25 янв 2013, 08:50
  • ICQ

Re: как избавиться от GetComponent()?

Сообщение waruiyume 25 фев 2013, 00:30

Если перемотать на пол экрана вниз, можно увидеть:
Скрипты

Не используйте GetComponent<>() в Update, FixedUpdate и других подобных функциях. Вместо этого лучше кэшировать компонент в Awake() или Start(). Если объектов, использующих скрипт, очень много, такое кэширование может значительно сократить время работы скрипта.
Кэшируйте встроенные компоненты типа transform, renderer и тд. Особенно если они используются в функциях типа Update(). Ибо каждый такой вызов делается через GetComponent(). См. правило выше. Это можно сделать, например, так:

Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: как избавиться от GetComponent()?

Сообщение Woolf 25 фев 2013, 00:33

Мой вас совет - не занимайтесь ерундой. Если по поводу Find - это справедливо, то уж getComponent оптимизировать - это лишнее. Но! Если вам все-таки хочется это оптимизировать, то в скрипте Объявите переменную нужного класса и инициализируйте её на Awake или Start Gameobject-a.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: как избавиться от GetComponent()?

Сообщение pod4444 26 фев 2013, 19:54

для самых популярных аля transform, rigidbody, gameObject можно делать кэш-свойства, кажется они описаны в статье. я давно сделал оболочку для монобеха где просто делаю так:
Синтаксис:
Используется csharp
        private Transform cachedTransform;

        public new Transform transform
        {
            get
            {
                if (cachedTransform == null)
                    cachedTransform = base.transform;
                return cachedTransform;
            }
        }
 

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

След.

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

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

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