Обмен сообщениями/событиями в приложении

Общие вопросы о Unity3D

Re: Обмен сообщениями/событиями в приложении

Сообщение Neodrop 03 июл 2013, 16:37

Приводить весь листинг я не хочу. Он длинноват. А работает так :
(методы-расширения)
Регистрация :
public static void MessageRegister(this object entryPoint, string messageName, Action messageListener)
Но, предпочитаю использовать второй вариант, без стрингов (меньше мусора в GC) :
public static void MessageRegister(this object entryPoint, MessageName messageName, Action messageListener)
(MessageName - enum с быстрым доступом к кешированному стринг-значению)
Так же, имеются перегрузки для делегатов с параметрами (до пяти параметров)
Пример :
public static void MessageRegister<T0, T1, T2, T3, T4>(this object entryPoint, string messageName, Action<T0, T1, T2, T3, T4> messageListener)


Дерегистрация
:
public static void MessageUnRegister(this object entryPoint, string messageName, Action messageListener)
public static void MessageUnRegister(this object entryPoint, MessageName messageName, Action messageListener)


Вызов цепочки :
public static void MessageCall(this object entryPoint, string messageName)
или
public static void MessageCall(this object entryPoint, MessageName messageName)
или для цепочек с параметрами :
public static void MessageCall<T0, T1, T2, T3, T4>(this object entryPoint, string messageName, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)

Для максимальной скорости, рекомендую не использовать стринги. От них много мусора в GC (особенно это может быть чувствительно на мобилках). В моём текущем менеджере я не до конца от них избавился, всё руки не доходят. В результате это создаёт 16 байтов мусора за кадр. Не критично, впрочем, потому руки и не доходят.

Вот как-то так. Весь код менеджера занимает 540 строк (с пустыми и форматированием). Львиная доля - многочисленные перегрузки методов. Является частью моей новой системы модульного программирования, которую я ещё не готов опубликовать для широкой общественности. Успешно использовался к примеру в этом проекте. Показал себя бодро \m/

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

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 03 июл 2013, 18:01

Johnson писал(а):Эмм. Ты либо не совсем понимаешь принципы программирования, либо не совсем понимаешь принципы делегирования.

Я вижу ты совсем меня не понял, и не понял насколько замечателен этот метод. - жаль... :(
И ты не понял, что дело тут вовсе не в том, откуда что вызывать...
Последний раз редактировалось Макс 03 июл 2013, 18:03, всего редактировалось 1 раз.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 03 июл 2013, 18:02

Фига
Последний раз редактировалось Макс 23 июл 2013, 23:40, всего редактировалось 1 раз.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Re: Обмен сообщениями/событиями в приложении

Сообщение Johnson 03 июл 2013, 18:38

Макс писал(а):
Johnson писал(а):Эмм. Ты либо не совсем понимаешь принципы программирования, либо не совсем понимаешь принципы делегирования.

Я вижу ты совсем меня не понял, и не понял насколько замечателен этот метод. - жаль... :(
И ты не понял, что дело тут вовсе не в том, откуда что вызывать...

какой метод я не понял? делегаты? я описал его тебе, ни каких новых потоков там не создается. и не имеет значения, откуда ты вызываешь код - непосредственно внутри самого апдейта, или вынеся его в функции/делегаты.
Либо, мы просто говорим о разном.
Johnson появился в результате деления на null. Кривокодер-рецидивист. Кусается.
Хорошо, что в больнице хирурги не такие же, как новички на этом форуме. Пришел вытащить гвоздь из руки, а они яйца оттяпали...
ProgrammerNotFoundException on line 0!
Аватара пользователя
Johnson
UNIверсал
 
Сообщения: 447
Зарегистрирован: 09 июн 2013, 16:31
Откуда: Пермь
Skype: Johnson1893
  • Сайт
  • ICQ

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 03 июл 2013, 18:48

Johnson писал(а):какой метод я не понял? делегаты? я описал его тебе, ни каких новых потоков там не создается. и не имеет значения, откуда ты вызываешь код - непосредственно внутри самого апдейта, или вынеся его в функции/делегаты.
Либо, мы просто говорим о разном.

Да причём тут потоки?
Я просто с помощью этой системы делегатов, программно подключаю в Update, нужные мне методы, когда они там нужны, и отключаю, когда они больше ненужны. И ни 1 лишнее сравнение, у меня там не висит, не говоря уж про циклы.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Re: Обмен сообщениями/событиями в приложении

Сообщение Johnson 03 июл 2013, 18:50

Макс писал(а):
Johnson писал(а):какой метод я не понял? делегаты? я описал его тебе, ни каких новых потоков там не создается. и не имеет значения, откуда ты вызываешь код - непосредственно внутри самого апдейта, или вынеся его в функции/делегаты.
Либо, мы просто говорим о разном.

Да причём тут потоки?
Я просто с помощью этой системы делегатов, программно подключаю в Update, нужные мне методы, когда они там нужны, и отключаю, когда они больше ненужны. И ни 1 лишнее сравнение, у меня там не висит, не говоря уж про циклы.


Правильно у Нео написано в подписи -
Протратившись на блядях байтах, на битах не экономят.


Поверь, один if погоды не сделает, если конечно его условие не вычисляется динамически в нем самом...
Johnson появился в результате деления на null. Кривокодер-рецидивист. Кусается.
Хорошо, что в больнице хирурги не такие же, как новички на этом форуме. Пришел вытащить гвоздь из руки, а они яйца оттяпали...
ProgrammerNotFoundException on line 0!
Аватара пользователя
Johnson
UNIверсал
 
Сообщения: 447
Зарегистрирован: 09 июн 2013, 16:31
Откуда: Пермь
Skype: Johnson1893
  • Сайт
  • ICQ

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 03 июл 2013, 19:07

Johnson писал(а):Поверь, один if погоды не сделает, если конечно его условие не вычисляется динамически в нем самом...

а никто про один и не говорит. В нормальном проекте, знаешь сколько в UPDATE их может собраться?
А ещё сколько в GUI...
И мало ли что там у Нео в подписи написано? Я больше верю тому что он говорил, что привык экономить на миллисекундах или как-то так...
- И это правильно! много экономии на мелочах, в итоге экономит львиную долю ресурсов.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Re: Обмен сообщениями/событиями в приложении

Сообщение Johnson 03 июл 2013, 19:53

Преждевременная оптимизация - одно из сильнейших зол в программировании. Экономить миллисекунды (и микросекунды, я бы сказал) - это хорошо. Но начинать их экономить стоит только после того, как логика работает хорошо, и смысл понятен.
Я писал (да и пишу периодически) прошивки к микроконтроллерам по работе. Там экономия микросекунд ещё более важна. Не подумайте, что я разбрасываюсь ресурсами.
Просто тут как - лучше посоветовать новичку не заморачиваться на экономиях, и посоветовать вникать в логики и технологии.
А до экономии он сам дойдет в своё время, если не забъет.
Johnson появился в результате деления на null. Кривокодер-рецидивист. Кусается.
Хорошо, что в больнице хирурги не такие же, как новички на этом форуме. Пришел вытащить гвоздь из руки, а они яйца оттяпали...
ProgrammerNotFoundException on line 0!
Аватара пользователя
Johnson
UNIверсал
 
Сообщения: 447
Зарегистрирован: 09 июн 2013, 16:31
Откуда: Пермь
Skype: Johnson1893
  • Сайт
  • ICQ

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 03 июл 2013, 20:56

Johnson писал(а):Преждевременная оптимизация - одно из сильнейших зол в программировании.

- Это кто изрёк? бог?! Я не сторонник таких старых штампов и догм.
Я наоборот, сторонник своевременной оптимизации и упорядочивания кода, поэтапно, по мере его написания.
Сделал удачный код, отладил - приступаю к упорядочиванию и оптимизации, и минимизации.
А затем можно двигаться дальше, когда тут всё в порядке, и ничего не мешает.
Впрочем, у каждого свой стиль программирования и свои подходы.
Я считаю, поздно кидаться оптимизировать, когда уже горы замусореного кода. поди потом разберись... темболее половину уже забудешь, пока будешь писать остальное.
И в программировании я далеко не новичёк, только в C#, да и то уже почти освоился.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Re: Обмен сообщениями/событиями в приложении

Сообщение Johnson 03 июл 2013, 21:45

Макс писал(а):
Johnson писал(а):Преждевременная оптимизация - одно из сильнейших зол в программировании.

- Это кто изрёк? бог?!


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

Про "я не новичек" - я охотно верю. Но почему все, кто переходит с одного языка на другой - тащат с собой все привычки от старого языка? Путешествуй налегке.
Эти догмы и правила написаны и повторены тысячекратно не зря.
Я сменил уже порядка 7 языков, и только относительно недавно (при переходе с дельфи на джаву, и при переходе с джавы на шарп) усвоил это правило. Стало на много проще понять новый язык.

Вот пруфлинк, если так уж и не верится. Не думаю, что в яндексе появилось бы СТОЛЬКО результатов на этот запрос, если бы это было пустяком.
Вот конкретика, если нужна... Или вот, тоже интересная статья.

PS: Хм... А знаешь, ты прав. Кнут, пожалуй, бог программирования... Изначатьно фразу "Преждевременная оптимизация - корень всех бед" произнес именно он.
Johnson появился в результате деления на null. Кривокодер-рецидивист. Кусается.
Хорошо, что в больнице хирурги не такие же, как новички на этом форуме. Пришел вытащить гвоздь из руки, а они яйца оттяпали...
ProgrammerNotFoundException on line 0!
Аватара пользователя
Johnson
UNIверсал
 
Сообщения: 447
Зарегистрирован: 09 июн 2013, 16:31
Откуда: Пермь
Skype: Johnson1893
  • Сайт
  • ICQ

Re: Обмен сообщениями/событиями в приложении

Сообщение Neodrop 03 июл 2013, 23:54

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

Re: Обмен сообщениями/событиями в приложении

Сообщение pestantium 04 июл 2013, 15:22

Код.

Creator.cs

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Creator : MonoBehaviour
{
    private List<SomeGameObject> _some = new List<SomeGameObject>();
    private float t = 0;
    void Start()
    {
        t = Time.realtimeSinceStartup;
        for (int i = 0; i < 100; i++)
        {
            GameObject go = new GameObject("go" + i.ToString());
            _some.Add(go.AddComponent<SomeGameObject>());
        }
        Debug.Log("Create: " + (t - Time.realtimeSinceStartup));

        t = Time.realtimeSinceStartup;
        for (int i = 0; i < _some.Count; i++)
            EventManager.OnNeed += _some[i].DoStuff;
        Debug.Log("Event Add: " + (t - Time.realtimeSinceStartup));

        t = Time.realtimeSinceStartup;
        for (int i = 0; i < _some.Count; i++)
            EventManager.AddE(_some[i].DoStuff);
        Debug.Log("List Add: " + (t - Time.realtimeSinceStartup));

        StartCoroutine(LetsGo());
    }

    IEnumerator LetsGo()
    {
        yield return new WaitForSeconds(3);
        t = Time.realtimeSinceStartup;
        EventManager.OnNeedFire();
        Debug.Log("Event Fire: " + (t - Time.realtimeSinceStartup));
        t = Time.realtimeSinceStartup;
        EventManager.OnNeed2Fire();
        Debug.Log("List Fire: " + (t - Time.realtimeSinceStartup));
       
        t = Time.realtimeSinceStartup;
        for (int i = 0; i < _some.Count; i++)
            EventManager.OnNeed -= _some[i].DoStuff;
        Debug.Log("Event Del: " + (t - Time.realtimeSinceStartup));
        t = Time.realtimeSinceStartup;
        for (int i = 0; i < _some.Count; i++)
            EventManager.DelE(_some[i].DoStuff);
        Debug.Log("List Del: " + (t - Time.realtimeSinceStartup));
    }

}
 

SomeGameObject.cs
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SomeGameObject : MonoBehaviour
{

    public void DoStuff()
    {
        for (int i = 0; i < 10000000; i++)
        { }
    }

}
 

EventManager.cs
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class EventManager
{

    public delegate void OnNeedHandler();
    public static event OnNeedHandler OnNeed;
    public static void OnNeedFire()
    {
        if (OnNeed != null)
            OnNeed();
    }

    public delegate void OnNeed2Handler();
    private static List<OnNeed2Handler> _list = new List<OnNeed2Handler>();
    public static void AddE(OnNeed2Handler we)
    {
        _list.Add(we);
    }
    public static void DelE(OnNeed2Handler we)
    {
        _list.Remove(we);
    }
    public static void OnNeed2Fire()
    {
        for (int i = 0; i < _list.Count; i++)
            if (_list[i] != null)
                _list[i]();
    }
}
 


Пока не попробовал - не поверил. Таки да - быстрее.
Create: -0.003709592
Event Add: -0.001357514
List Add: -0.000159815
Event Fire: -2.592425
List Fire: -2.549495
Event Del: -0.001935959
List Del: -0.0009317398

Neodrop писал(а):enum с быстрым доступом к кешированному стринг-значению

Как это? Сам не могу придумать как уйти от стрингов. С ними код понятнее, но медленее.
Созданные игры: MemoUp, Stop Robots, Hippo Gum, Rainbow Team
Аватара пользователя
pestantium
UNITрон
 
Сообщения: 269
Зарегистрирован: 23 сен 2010, 19:30
Откуда: Украина, Кировоград
  • ICQ

Re: Обмен сообщениями/событиями в приложении

Сообщение broken 04 июл 2013, 16:06

Просьба к хозяину предыдущего сообщения нормально отформатировать код. Не получается все листинги нормально развернуть.
Проекты на Unity3D:
Монополия 3D: http://unity3d.ru/distribution/viewtopic.php?f=10&t=25816
Битва валют 3D (файтинг): http://unity3d.ru/distribution/viewtopic.php?f=17&t=17186
Аватара пользователя
broken
UNITрон
 
Сообщения: 243
Зарегистрирован: 29 мар 2013, 15:00
Откуда: Набережные Челны, Россия
Skype: al.ryazanov

Re: Обмен сообщениями/событиями в приложении

Сообщение Woolf 04 июл 2013, 17:11

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

Re: Обмен сообщениями/событиями в приложении

Сообщение Макс 04 июл 2013, 18:14

Woolf писал(а):По поводу оптимизаций.. Ну бред же пишете. Не нужно оптимизировать циклы, условия и прочую фигню. Это пустая и даже вредная работа. Получается экономия на спичках. Оптимизируйте алгоритмы! Вот здесь можете развернуться во всю ширь. Основа быстроработющего кода - это именно хорошие алгоритмы.

Прогрессивные программисты вообще стараются избавляться от условных переходов и свичей, путём замены их на делегатов.
Заодно и код заметно упрощается и упорядочивается.
Макс
UNIверсал
 
Сообщения: 372
Зарегистрирован: 20 июн 2013, 23:05

Пред.След.

Вернуться в Общие вопросы

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

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


cron