Задать вопрос
PragmaGames
@PragmaGames
Увлекаюсь Unity.

Какая реализация паттерна проектирования ObjectPooler наиболее эффективная?

Упрощенный код ObjectPooler, вопрос в том что лучше использовать для хранения объектов, List или Queue или что-то другое, какая разница в производительности ? Реализация функций GetObject в зависимости от структуры данных которые мы используем, функция RemoveActivity только для работы с очередью. При работе с листом проверяем весь лист на нахождение первого активного элемента и возвращаем его (В листе содержатся и активные и не активные элементы) изменяем активность после того как элемент отработал в коде который вызывал функцию GetObject. В очереди же содержатся только активные элементы, поэтому просто извлекаем элемент если есть доступные, но при этом когда элемент отработал его снова нужно вернуть в эту очередь.

Для тех кто не знаком с Unity, но знаком с паттерном
.activeInHierarchy - возвращает true если объект активен на сцене
GameObject базовый класс для всех объектов на сцене

public class ObjectPoolItem
{
    public List<GameObject> Objects;

    public ObjectPoolItem()
    {
        Objects = new List<GameObject>();
    }
}

private Dictionary<Types, ObjectPoolItem> _pool;

public GameObject GetObjectList(Types type)
{
        for(int i = 0; i < _pool[type].Objects.Count; i++)
        {
              if (!_pool[type].Objects[i].activeInHierarchy)
              {
                    return _pool[type].Objects[i];
              }
        }

        return null;
}

public GameObject GetObjectQueue(Types type)
{
        if (_pool[type].Objects.Count > 0)
        {
                return  _pool[type].Objects.Dequeue();
        }

        return null;
}

// Только при работе с очередью
public void RemoveActivity(GameObject obj)
{
        _pool[obj.GetComponent<IPooleable>().Type].Objects.Enqueue(obj);
}
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Средний 8 комментариев
Пригласить эксперта
Ответы на вопрос 1
sarapinit
@sarapinit
Точу водой камень
Какая реализация паттерна проектирования ObjectPooler наиболее эффективная?

Microsoft.Extensions.ObjectPool<T> вероятно

из пакета Microsoft.Extensions.ObjectPool
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы