Пятница, 19 Апреля 2024, 12:54

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Какая операция быстрее SendMessage или GetComponent? (для проверки урона от оружия по персонажам)
Какая операция быстрее SendMessage или GetComponent?
alexsilentДата: Четверг, 07 Января 2016, 10:24 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Интересно какая операция быстрее, для проверки урона от оружия по персонажам:
1) SendMessage (отправка сообщения столкнувшемуся объекту)
2) GetComponent (взять скрипт из столкнувшегося объекта, т.е. на старте один раз не инициализируешь этот компонент)

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


Сообщение отредактировал alexsilent - Четверг, 07 Января 2016, 10:31
Storm54Дата: Четверг, 07 Января 2016, 10:39 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
SendMessage сам по себе является каким-то костылем и работает всегда медленней, чем GetComponent.
Лично я советую вообще его не использовать, т.к. рефакторинг с такими методами невыносим, да и отследить вызов в некоторых случаях достаточно проблематично.


Сообщение отредактировал Storm54 - Четверг, 07 Января 2016, 10:40
FlowДата: Четверг, 07 Января 2016, 10:54 | Сообщение # 3
-=[.FSProduction.]=-
Сейчас нет на сайте
alexsilent, SendMessage во много раз медленее, чем GetComponent. Даже не пытайся использовать SendMessage, там где можешь использовать GetComponent.
RangerДата: Четверг, 07 Января 2016, 11:18 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата Storm54 ()
рефакторинг с такими методами невыносим, да и отследить вызов в некоторых случаях достаточно проблематично.

Нутызагнул!!! biggrin biggrin biggrin
С уазвращением на гцуп )))))))))))

Цитата alexsilent ()
Передавал урон через SendMessage, но через него грамотно не передашь сразу кучу параметров, в

Передашь )))


А Ваще мог бы самостоятельно стресс-тест сделать на 2 варианта и посмотреть, что для теб приемлемо..
Сильно врядли, что по урону счет будет идти на тысячи каждый кадр.


alexsilentДата: Четверг, 07 Января 2016, 12:15 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата Ranger ()
public class AClass : MonoBehaviour {

      // Use this for initialization
    void Start() {
        GameObject go = GameObject.Find("111");
        go.SendMessage("ObjMethode", new AClassExt { a = 2, b = gameObject});
    }
    public void ObjMethode(AClassExt _a)
    {
        Debug.Log(_a);
        Debug.Log(_a.a);
        Debug.Log(_a.b);
    }
}

public class AClassExt
{
    public int a;
    public GameObject b;
    
}


Очень интересно, а на ЯваСкрипте такое можно сделать?
FlyOfFlyДата: Четверг, 07 Января 2016, 12:20 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Цитата alexsilent ()

public class AClassExt
{
public int a;
public GameObject b;

}

Очень интересно, а на ЯваСкрипте такое можно сделать?

Вроде бы на js можно делать классы, так в чем проблема? Тут фишка в том что классы можно использовать как пользовательские типы данных и их отправлять


Сообщение отредактировал FlyOfFly - Четверг, 07 Января 2016, 12:22
berilДата: Четверг, 07 Января 2016, 12:45 | Сообщение # 7
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Не используй SendMessage и BroadcastMessage никогдА!
Или стандартные ивенты и специальные системы вроде этой




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
FlyOfFlyДата: Четверг, 07 Января 2016, 13:16 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата beril ()

Или стандартные ивенты и специальные системы вроде этой

Эвенты не подходит под его цели
RangerДата: Четверг, 07 Января 2016, 16:14 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Цитата beril ()
Или стандартные ивенты

Ну с ивентами свои заморочки.
броадкастить ими можно, главное не забывать отписываться, когда не нужны.
Когда делаешь на ивентах нужно четко представлять архитектуру, иначе м.б. задвоения еще нек неприятные вещи, а sendmessage работает по принципу плюнул и забиыл.
Если не злоупотреблять ими, то они вполне "аллё".

Кста... С Рождеством!

Добавлено (07 января 2016, 16:14)
---------------------------------------------

Цитата alexsilent ()

1) SendMessage
2) GetComponent

Вот же самый простой способ ( Оливье дает о себе знать: biggrin ) я его у себя пользовал.
Код

public static Dictionary<GameObject,AllActiveObjectsScript> AllActiveObjects = new Dictionary<GameObject,AllActiveObjectsScript >();

по эвейку объекта засовывать инстанс его скрипта в пулл. Ключом ставить объект.. и вуаля... Дальше просто поиск по ключу.

Правда не знаю работает ли на юнити скрипт




Сообщение отредактировал Ranger - Четверг, 07 Января 2016, 13:26
alexsilentДата: Пятница, 08 Января 2016, 13:37 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Цитата beril ()
Не используй SendMessage и BroadcastMessage никогдА!

:< Тлен, у меня больше половина скриптов замешано на SendMessage (а их около сотни), но судя по профайлу, больше всего жрёт всё равно графика. smile
berilДата: Пятница, 08 Января 2016, 15:48 | Сообщение # 11
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата alexsilent ()
:< Тлен, у меня больше половина скриптов замешано на SendMessage (а их около сотни), но судя по профайлу, больше всего жрёт всё равно графика. smile

Цитата
So, on my (rather old) machine, a loop of 5000000 SendMessage calls, using an empty function, takes 9.872 seconds. A loop of 5000000 direct calls (using a cached GetComponent) takes .024 seconds. Therefore, direct calling seems to be about 400 times faster, although considering that the loop itself takes up some time, it's probably more than that.


Цитата
Time for SendMessage 1000 times: 0.00137501955032349
Time for direct functon call 1000 times: 0.000117003917694092

iPhone, no stripping, "Slow and Safe" call optimization:

Time for SendMessage 1000 times: 0.0327930450439453
Time for direct functon call 1000 times: 0.00520801544189453

iPhone, micro mscorlib, "Fast but no exceptions":

Time for SendMessage 1000 times: 0.0356040000915527
Time for direct functon call 1000 times: 0.00104284286499023


Поговаривают еще, что на мобильных устройствах из за SendMessage могут быть фризы wacko Если не в Update используешь , то думаю не сильно страшно, если платформа Пк.
Но лучше присмотрись к альтернативам, та что выше система или в asset store есть бесплатные плагины




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
berilДата: Пятница, 08 Января 2016, 18:25 | Сообщение # 12
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Посмотри еще это, думаю будет полезно



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Какая операция быстрее SendMessage или GetComponent? (для проверки урона от оружия по персонажам)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг