Получение доступа к Массиву.

Начинающий
Статус
Оффлайн
Регистрация
9 Фев 2021
Сообщения
90
Реакции[?]
24
Поинты[?]
1K
Всем хай, у меня есть малая проблема с оптимизации софта. Я слишком глуп и не понимаю как можно правильно и оптимизировано получать по кд доступ к массиву. Делал через List and HashSet, не получалось.
Вот строки кода как получаю в данный момент доступ к массиву.
Это более менее оптимизировано. Но хотелось бы проверку сделать по кд, без просада fps. (Надеюсь я правильно и понятно описал в чем проблема, и как я хочу)
C#:
   public static DateTime Second = DateTime.Now;
        void Update()
        {
            if ((DateTime.Now - Second).TotalSeconds > 3)
            {
                if (true) { players = FindObjectsOfType<HeroBase>(); }
                if (true) { item = FindObjectsOfType<ItemPickup>(); }
                Second = DateTime.Now;
            }
        }
        private HeroBase[] players;
        private ItemPickup[] item;
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Доступ к любому элементу массива всегда осуществляется за O(1), что Вы пытаетесь оптимизировать?
 
Пользователь
Статус
Оффлайн
Регистрация
11 Июн 2020
Сообщения
177
Реакции[?]
82
Поинты[?]
0
1) Если тебе нужно читать массив, и ты думаешь что из-за этого проседает фпс, то это не так, и Irval написал почему -- чтение массивов имеет постоянное время.
2) Если ты вставляешь в массив -- из-за этого может проседать производительность, поэтому в этом случае надо решить, что ты делаешь больше: читаешь или вставляешь? Если второе, то лучше использовать связные списки.
3) Если твой массив невероятно огромный, самым простым решением для его чтения станет бинарный поиск.
 
Начинающий
Статус
Оффлайн
Регистрация
9 Фев 2021
Сообщения
90
Реакции[?]
24
Поинты[?]
1K
Спасибо за ответ, я не успел сообщить что решил данный вопрос. Чуть позже могу скинуть каким оброзом, по факту можно сказать. Мне нужно было чтение массива для того, что бы на данный объект повесить GUI.label с Name and Distance [Проще говоря просто WH]
(Надеюсь я правельно сказал)
 
Начинающий
Статус
Оффлайн
Регистрация
9 Фев 2021
Сообщения
90
Реакции[?]
24
Поинты[?]
1K
C#:
void Start()
        {
            i.start(this);
        }
        public static objects<ItemPickup> i = new objects<ItemPickup>();
public class objects<T> where T : UnityEngine.Object
        {
            public float interval { get; private set; }
            public T[] Objects { get; private set; }
            public objects(float updateInterval = 4.5f)
            { interval = updateInterval; }
            public IEnumerator Update()
            {
                while (true)
                {
                    Objects = GameObject.FindObjectsOfType<T>();
                    yield return new WaitForSeconds(interval);
                }
            }
            public void start(MonoBehaviour mono)
            { mono.StartCoroutine(this.Update()); }
        }
//пример
foreach (ItemPickup f in i.Objects)
                    {
                        if (f != null)
                        {
                            if (main.transform.InverseTransformPoint(f.transform.position).z > 0f)
                            {
                                Vector3 vector = main.WorldToScreenPoint(f.transform.position);
                                int distance = (int)Vector3.Distance(Network.PLAYER.transform.position, f.transform.position);
                                if (distance <= 100 && f.ITEM_ID >1)
                                {
                                    DrawEsp.DrawString(new Vector2(vector.x, (float)Screen.height - vector.y - -10f), Color.red, DrawEsp.TextFlags.Centered, $"[{distance} m.]");
                                }
                            }
                        }
                    }
 
Начинающий
Статус
Оффлайн
Регистрация
9 Фев 2021
Сообщения
90
Реакции[?]
24
Поинты[?]
1K
[UPD]
Сделал более оптимизированный вариант. И простой.
C#:
private int frames = 0;
        public IEnumerator UPD()
        {
            while (true)
            {
                try
                {
                    frames++;
                    if (frames == 5)
                    {
                        frames = 0;
                        f.Clear();
                        foreach (var net_Player in UnityEngine.Object.FindObjectsOfType(typeof(OnlinePlayer)) as OnlinePlayer[])
                            f.Add(net_Player);
                    }
                }
                catch
                { Debug.LogError("Error Start [OnlinePlayer]!"); }
                yield return new WaitForSeconds(1f);
            }
        }
        public static List<OnlinePlayer> f = new List<OnlinePlayer>();
 
Сверху Снизу