Войти
ПрограммированиеФорумОбщее

подобающая реализация С# unity

#0
2:30, 18 фев. 2018

Название темы получилось обобщенным, но в виду разностороннего рассмотрения небольшой задачи, появились разные ее реализации. Вот интересно какая из них имеет место быть, а у какой больше недостатков.
Суть задачи является поддержка различных языков. Есть ассоциативный список Dictionary<string, string>, ключем которого является уникальный тек отдельного GUI с текстом, который нужно заменить на соответствующее значение из этого списка. И тут первый момент можно просто описать этот список как есть или сделать двойной список как:
  public static Dictionary<string, int> DataNames;
  public static Dictionary<int, string> DataValues;
То есть если в место тега (string) будет использоваться id (int) то можно уже выполнять поиск не по строке, а по номеру. Возможно это чересчур.

Второй момент, когда при смене языка нужно отыскать все эти элементы GUI и выполнить при помощи поставленных в них тегах замену текста.

первый пример через HashSet:
HashSet<LanguageText> Updates = new HashSet<LanguageText>();
При создании класса или запуске скрипта добавляется в список сам компонент "Updates.Add(text)" и в последствии смены языка по списку заменяется текст.

Второй пример:
Поскольку это unity то список не нужен, а при смене языка просто вызывать:
Canvas.GetComponentsInChildren<LanguageText>();
И перебрать их.

Третий пример опять со списком но через EventHandler:
event EventHandler<LocalizaionEvent> LanguageChanged;
Где также как и в первом при старте заносим каждый GUI "Localization.LanguageChanged += OnLanguageChanged;"
и без перебора просто вызываем LanguageChanged(null, new LocalizaionEvent(language));

что из этого целесообразнее?

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


#1
22:23, 18 фев. 2018

на сколько понимаю это же вызывать надо один раз при смене языка, а не при update, поэтому подход не важен - любой из 3х - как удобней, проблем с производительностью/памятью не вижу. и еще бы тему называли как подобает.
у меня в игре была система со списком из нескольких десятков надписей для локализации на сценах - никаких проблем. для удобства можно заполнять и автоматом через GetComponents.. <type>

#2
23:41, 18 фев. 2018

Ну это все микро оптимизации, не больше. А иногда все таки может дать плюс хоть и не большой, хотя бы при загрузке сцены как минимум. Конечно все три варианта имеют место быть, но свои аргументы за и против я уже привел.

#3
4:46, 19 фев. 2018

Ну язык же не меняется каждую секунду, обычно он меняется при старте игры и пользователем в настройках. Т.е. GetComponent - достаточно и оптимизировать смысла особого нет.

#4
9:04, 19 фев. 2018

я об этом и написал

ПрограммированиеФорумОбщее

Тема в архиве.