Правильно ли в OnGUI() брать значение из Dictionary?

Раздел, посвящённый самому важному - скорости.

Правильно ли в OnGUI() брать значение из Dictionary?

Сообщение Maramak 08 авг 2012, 17:55

Добрый день! Сегодня начал заниматься локализацией своего приложения. Воспользовался скриптом Guyver из этой темы, за что ему большое спасибо. У меня получился такой класс для локализации:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;

public class LocalizationHelper
{
        public const string TAP_TO_CONTINUE = "tap.to.continue";
        public const string LEVEL_TUTORIAL_POINT_1 = "level.tutorial.point1";
       
        private static Dictionary<string, string> dictionary = new Dictionary<string, string> ();
        private static Locale currentLocale = Locale.English;
        private static IniParser parser = new IniParser ("Localization");
       
        public static void ChangeLocalization (Locale locale)
        {
                dictionary.Clear();
                currentLocale = locale;
               
                string[] keys = parser.EnumSection (locale.ToString ());
                foreach (string key in keys) {
                        dictionary.Add (key, parser.GetSetting (locale.ToString (), key));
                }
        }
       
        public static string GetString (string key)
        {
                if (!dictionary.ContainsKey (key.ToUpper ()))
                        ChangeLocalization (currentLocale);
               
                return dictionary [key.ToUpper ()];
        }
       
        #region Nested type: Locale

        public enum Locale
        {
                English,
                Russian
        }

    #endregion
}


Теперь сам вопрос. Насколько плохо (в плане производительности) текст для GUI.Lable сетить прямо в методе OnGUI()? Как видно в примере кода ниже, я каждый раз считываю текст для GUI.Label из Dictionary методом LocalizationHelper.GetString(...). Я понимаю, что можно, например, создать переменную класса, засетить в нее текст из Dictionary в методе Awake() и потом использовать эту переменную в методе OnGUI(), но сейчас меня интересует именно вариант, показанный мною в примере ниже. Спасибо!
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Point1 : MonoBehaviour
{
        public GUIStyle guiStyle;
        private Rect tooltipPosition;
        private int lableWidth = Screen.width / 3;
        private int paddingY = Screen.height / 4;
       
        private void Awake ()
        {
                tooltipPosition = new Rect (lableWidth, 0, lableWidth, Screen.height);
        }
       
        private void OnGUI ()
        {
                guiStyle.contentOffset = new Vector2 (lableWidth, 0);
                guiStyle.padding = new RectOffset (10, 10, paddingY, 10);

                GUI.Label (tooltipPosition, tooltipText, LocalizationHelper.GetString(LocalizationHelper.LEVEL_TUTORIAL_POINT_1));
                GUI.Label (new Rect (0, 0, Screen.width, Screen.height), LocalizationHelper.GetString(LocalizationHelper.TAP_TO_CONTINUE));
        }
}
 
Maramak
UNец
 
Сообщения: 18
Зарегистрирован: 08 сен 2011, 15:26

Re: Правильно ли в OnGUI() брать значение из Dictionary?

Сообщение Citrus 10 авг 2012, 13:45

если ты сам его писал не врублюсь , и если тупо скопировал а так если переписывал то лучше переписывай в точности строго надо соблюдать большие и маленькие буквы )))))) и обращай внимание на открытие скобок кавычек и.т.д))) (popcorn1) (popcorn1) (popcorn1) (popcorn1) (popcorn1) (popcorn1) (popcorn1)
System Of A Down Rock'n'Roll music FOREVER
Скрытый текст:
Аватара пользователя
Citrus
UNIт
 
Сообщения: 147
Зарегистрирован: 05 авг 2012, 12:24

Re: Правильно ли в OnGUI() брать значение из Dictionary?

Сообщение Guyver 10 авг 2012, 14:06

Вы имеете ввиду, что на каждый вызов отрисовки у вас происходит выборка по словарю?

Наверно это всёж не самая лучшая идея.
Поидее generic словарь ищет быстро и наверно там даже в недрах какие нибудь Hash и KDTree ... но лишний раз грузить рендер поиском в контейнере по строке - плохо (идеологически .. даже если не ботлнек).
В любом случае .. можете потестить для себя, если устроит (наприер всего 2 надписи на экране), то путь так .. но при загруженном ГУИ наверно не стоит так делать.

У себя в ГУИ я сделал ключики у контролов и дефолтные значения. При вызове Localize, GUI менеджер пробегает по зареганным контролам и пытается дать результат по ключу и локейлу .. если нет, то дефолт остаётся. В цикле отрисоки всех контролов юзается всегда дефолт.

Т.о. можно в любой момент локализовать всё ГУИ на лету .. и нет оверхеда на поиск переводов при каждой отрисовке.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск


Вернуться в Оптимизация

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2