
Комментарии 12
крутая статья! все понятно новичкам нужно именно такое объяснение)
Спасибо за статью! Продолжай. Данная реализация BulletPool не является пулом, прелесть пула в том, что объекты создаются заранее. В твоей реализации создаются по одному при вызове метода гет. Плюс лучше заранее создать необходимое количество объектов, что не было пересоздания массива (списка) объектов при добавлении нового элемента.
Спасибо за комментарий)
Ты не совсем прав, суть ObjectPool в том, что мы не удаляем объекты при их возвращении, а сохраняет (выключаем) для дальнейшего использования.
А создавать заранее некоторое количество - это просто вопрос оптимизации. Можно создать, а можно и так оставить, если не требуется большое количество объектов за один кадр создавать. В первом случае мы просто тратим ресурсы на создание при загрузке игры и не вызываем лагов. А это актуально не всегда:)
Object pool patter как раз про набор преинициализированных объектов. Мы их не создаем в момент, когда они нужны, а берем готовые
Мы берем готовые тогда, когда они есть в пуле. Если их нет, мы создаем новые и добавляем в пул. В этом суть данного паттерна. Еще раз повторюсь, нет никакой проблемы в начале инстанциировать какое-то количество.
Вовсе нет, это просто деталь реализации, если бы в шарпе в ArrayPool.Shared все бакеты под все размеры прединициализировались, то память бы сжиралась еще при запуске приложения.
Привет! Спасибо тебе большое за предоставленную информацию. Если не секрет какие у тебя планы на следующие статьи, мне очень понравилось то как ты преподносишь материал. Буду ждать еще.
Singleton - это мощный инструмент, который при правильном использовании может значительно упростить управление состоянием приложения
Что же в нем такого мощного?
По поводу приведённого примера реализации Singleton:
Если загрузить новую сцену, в которой есть другой экземпляр
GameManager, оригинальный код не уничтожит этот экземпляр// Вручную создаем новый экземпляр GameManager
GameObject newGameManager = new GameObject("AnotherGameManager"); GameManager manager = newGameManager.AddComponent<GameManager>();
// Это нарушает синглтон, так как теперь существует два экземпляра// Код, вызываемый из нескольких потоков одновременно
void Start() {
// Создаем несколько потоков, каждый из которых пытается получить доступ к экземпляру GameManager
for (int i = 0; i < 10; i++)
{
new Thread(() =>
{
GameManager manager = GameManager.Instance;
// Может привести к созданию нескольких экземпляров
}).Start();
}
}
Хорошая статья для введения в тему. При этом необходимо, получив эти знания, копать глубже. Вот то, что сразу пришло в голову:
Singleton, конечно же, нужно абстрактным объектом и наследовать от него все синглтоны, а не копипастить код синглтона в каждый класс. К тому же, надо подумать, нужно ли уничтожать его при выходе из сцены? И, наконец, можно же дергать менеджер через Observer, либо вообще использовать поиск объекта класса менеджера в сцене. Это переводит Синглтон из необходимого (как в других типах проектов) в разряд синтаксического сахара. Это чистая вкусовщина и выбор разработчика конкретной игры
Observer - вещь очень полезная. Мне очень понравилось делать таким образом связи внутри префаба. Можно добавлять звуки и эффекты на какие-то события, не лезя в код. Контроллер персонажа очень сильно облегчается и становится проще. Вот это мастхэв. А главное, в Unity это поддерживается красивой менюшкой на инспекторе, которая понравится тем, кто будет собирать префабы.
Factory - очень плохой пример. Вместо этого нужна библиотека префабов или Sctiptable-объектов. Зачем вообще в коде писать классы окров или троллей, если они отличаются только контентом (моделька, анимации)? Если у них есть разные механики, то их можно добавлять на префаб дополнительными отдельными скриптами или делать опции (тип магии, дальние атаки и т.д.)? Только разве что босса перегрузить, но мы опять же сможем задамажить врага через какой-нибудь интерфейс IDamagable. Наследование вообще не подходит. Просто забудьте
ObjectPool - мастхэв... или нет. Года с 2018 сборщик мусора в Юнити больше не создает таких сильных лагов. Можно смело все инстанциировать и уничтожать. Хотя для пуль может и пригодиться
Паттерны проектирования в Unity: от Singleton до Object Pool