Оптимизация. Пул объектов (Objects Pool). Рассказываю на примерах в Unity3d

  Рет қаралды 17,089

Лавка Разработчика

Лавка Разработчика

Күн бұрын

Пікірлер: 81
@mistertwink
@mistertwink 9 ай бұрын
Начала писать свой пул с этого видео, потом пошла на другие, и в итоге все равно вернулась сюда, потому что здесь все намного понятнее. И есть хорошая возможность перестроить под себя то, что нужно, без излишних напряжений извилин) Спасибо большое! Это видео сильно упростило мне жизнь)
@sutr4531
@sutr4531 5 ай бұрын
пул хороший, но медленный - O(n). потому как каждый раз в цикле ищет свободный элемент. если ввести индекс на текущую позицию в пуле, то отпадёт необходимость в цикле. и сложность алгоритма будет уже O(1). а это уже значительно веселее, т.к. скорость работы пула уже не будет зависеть от количества данных в нём.
@gamedevlavka
@gamedevlavka 5 ай бұрын
@@sutr4531 отличное предложение
@gen_nady
@gen_nady 3 жыл бұрын
Делай дальше. Ролики отличные. Вечером попробую
@nomad4994
@nomad4994 3 жыл бұрын
Привет! Комментарий поддержки) Очень интересные видео) Не останавливайся)
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Привет! Спасибо за поддержку)
@PasterLak
@PasterLak 3 жыл бұрын
Спасибо! Очень хороший и понятный пример пула объектов!
@mizzzlo6536
@mizzzlo6536 2 жыл бұрын
Спасибо тебе и твоему ObjectPool. Вы мне очень помогли
@tarastaras5595
@tarastaras5595 3 жыл бұрын
Супер! Спасибо за труд!
@МихаилКовалев-н4д
@МихаилКовалев-н4д Жыл бұрын
То что нужно, спасибо
@vladisslavss
@vladisslavss 3 жыл бұрын
Хорошо показан пример. Отличный ролик.
@neverworld8815
@neverworld8815 2 жыл бұрын
По сути, просто на сцене заранее есть объекты, либо создаются 1 раз при старте, и потом включаются или выключаются имитируя создание и разрушение, глобально это не увеличивает производительность но избавляет от ненужных фризов на любой платформе , кроме того пул можно расширить разными объектами, и вообще какой-то иерархией с типами
@kitws
@kitws 3 жыл бұрын
Спасибо! Очень понятно
@alexixrugis
@alexixrugis 3 жыл бұрын
Это просто великолепно! Почему здесь так мало подписчиков?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Потому что канал еще молодой. Но ты можешь помочь ему, поделившись роликом в соц. сетях :)
@zhizhikkkk3796
@zhizhikkkk3796 Жыл бұрын
пасиб большое
@antonpashkevich5061
@antonpashkevich5061 2 жыл бұрын
Спасибо, наверное лучший Pool который я видел на KZbin, и на Unity Learn. Сейчас по рандому смотрю твои видосики, хоч сказать что мне старые больше нравиться... В новых видосиков ты столько создаешь интерфейсов :c Шо просто путаешься, а здесь 1 скрипт и Pool готов!
@tuz3682
@tuz3682 2 жыл бұрын
Классный ролик! По Вашим видео изучаю Unity и C#. Имя пользователя - это Ваша мечта?)
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Все верно)
@ВасилийМигулин-т1й
@ВасилийМигулин-т1й Жыл бұрын
Отличный вариант, чтобы делать снаряды выстрелов и другие эффекты
@ПавелЖуравлев-б2г
@ПавелЖуравлев-б2г Жыл бұрын
Отличные видео, спасибо! Но вопрос, зачем ты используешь " this" там где это не обязательно? привычка?
@grayhouse6925
@grayhouse6925 3 жыл бұрын
Видео классное. Одно замечание важное для следующих видео: null - это не ноль;
@АндрейЗахаров-ц3г
@АндрейЗахаров-ц3г 3 жыл бұрын
Отлично, 😉 спасибо 👍
@nightyonetwothree
@nightyonetwothree 2 жыл бұрын
думаю включать элемент в HasElement() не очень логично, т.к. исходя из названия метода мы ожидаем получить ссылку на объект/либо нуль, а вовсе не проихводить с ним какие то действия (включение). Логичнее включать его в GetElement(), где уже логика подразумевает доставание/создание объекта и его активацию (в случае создания - флагом).
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Полностью согласен, так не надо делать!
@kat.shnaider
@kat.shnaider Жыл бұрын
очень полезные видео у тебя и понятно объясняешь, спасибо большое! подписка и лайк однозначно! было бы здорово, если бы ты снял видео о паттерне фабрика)
@gamedevlavka
@gamedevlavka Жыл бұрын
Да, надо заняться и этой темой)
@kat.shnaider
@kat.shnaider Жыл бұрын
@@gamedevlavka спасибо 🤗
@Evgeniy_LuxorGame
@Evgeniy_LuxorGame 3 жыл бұрын
С таким пулом могут быть проблемы.. например, я использую этот пул для пуль/ракет или т.п. Снаряд, при попадании в коллайдер игрока должен отключиться и нанести урон. Вот в чем ошибка: если игрок не двигается, то снаряд, который ранее в него попал и отключился снова берётся из пула и активируется там же, где все ещё стоит игрок. И событие OnTrigerEnter срабатывает ДО того как мы переместили снаряд в нужное место. Потому что он активируется сразу как берётся из пула, а перемещается в нужное место после активации
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Хорошее замечание. Для такого случая можно дописать в пул дополнительный метод GetFreeElement с параметром Position. То есть по сути расширить его поведение для ваших целей.
@IgorKu-m4o
@IgorKu-m4o 3 жыл бұрын
Пул используют только для слабых телефонов? Для ПК не обязательно?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@IgorKu-m4o их использование рекомендуется везде. Лаг может происходить и на ПК, он просто меньше будет.
@neverworld8815
@neverworld8815 2 жыл бұрын
Изменить порядок действий легко, это даже проблемой не назвать, кроме того можно просто хранить статичный класс с булевой которая отвечает за активность, а в тригере проверять активен он или нет, в таком случае первые условно 2 вызова ничего не успеют сделать т.к активен он станет после перемещения
@Fenix72rus
@Fenix72rus 3 жыл бұрын
Спасибо за видео!
@tarastaras5595
@tarastaras5595 3 жыл бұрын
Супер! Спасибо за труд! Вопрос. В методе CreateCube сначала создается обьект на сцене, а потом меняется его позиция, верно?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Объект не создаётся, он включается. Создаётся он при создании пула, то есть в старте. Да, он включается на сцене и затем меняется его позиция
@ПавелЖуравлев-б2г
@ПавелЖуравлев-б2г Жыл бұрын
Все круто и понятно, одно не понял, как происходит, что в проверке на 59 сточке , при вызове метода HasFree, возвращается елемент , тогда как он возващает bool. Просто не могу врубиться, если не трудно может кто то обьяснит в кратце
@ПавелЖуравлев-б2г
@ПавелЖуравлев-б2г Жыл бұрын
Все догнал) , коммент для продвижения)
@ЛюдмилаСигаева-э4д
@ЛюдмилаСигаева-э4д 2 жыл бұрын
касательно кубика, кто новичок, вместо корутин, установите себе unitask библиотеку это гораздо удобнее, смотрите как у меня это выглядит, поверьте, вы везде будете это юзать это в библиотеки using UnityEngine; using System; using Cysharp.Threading.Tasks; это в ваш класс [SerializeField] private float _lifetime; void OnEnable() { Destroy(); } async void Destroy() { await UniTask.Delay(TimeSpan.FromSeconds(_lifetime)); this.Deactivate(); } public void Deactivate() { this.gameObject.SetActive(false); }
@yaroslav5933
@yaroslav5933 Жыл бұрын
Чет я не понимаю, зачем использовать generic class в юнити, ведь все объекты на сцене имеют 1 тип GameObject.
@Абелис-т2в
@Абелис-т2в 24 күн бұрын
Я тоже не понимаю для чего)
@tadwhat
@tadwhat Жыл бұрын
Классные видео! Удачный выбор ли в пользу массива типа List? Он имеет capacity и выделяет под него достаточно памяти, при большом количестве обьектов рациональнее, использовать Stack - при большем количестве и вытягивать от туда , ну или Linked List , но при обращении по индексу, сложность - линейная , но тут это не используется, Object Pull сам выпрашивает фабрику - это как бы входная точка для создания и вытягивания фабрик😀
@yaskadef
@yaskadef 8 ай бұрын
хз как сломать эту кнопку лайка
@lakostyali2583
@lakostyali2583 2 жыл бұрын
Привет , для чего мы создали 2 конструктора PoolMono?
@ОлегНахаев-у7с
@ОлегНахаев-у7с 3 жыл бұрын
Спасибо!
@РоманЕгер-ч4й
@РоманЕгер-ч4й 2 жыл бұрын
Что делать, если скрипт (L10 Pool Example) отказывается принимать префаб?
@Noulderleito
@Noulderleito 10 ай бұрын
Интересно мы после смерти обратно в пул попадаем или в сборщик мусора
@Yan-i7g
@Yan-i7g 2 жыл бұрын
Спасибо за видео, очень хорошая подача и материал, но подскажи пожалуйста: Почему prefab типа L10Cube, и когда в инспекторе вы его перетягиваете в Тестер - он тоже забирает только элемент L10Cube, но пул спавнит его вместе с 3D телом куба, как префаб ведь указан только скрипт
@serhiipodoliak9212
@serhiipodoliak9212 2 жыл бұрын
Привет, если нашел ответ на свой вопрос, скинь пожалуйста ссылку на ответ, или в каком направлении копать
@tomasgammister5776
@tomasgammister5776 2 жыл бұрын
А как ты заспавнишь один скрипт без объекта ? ))) это просто ссылка на объект с компонентом L10Cube. не было бы этого скрипта, не перетянул бы
@exregisterqq
@exregisterqq Жыл бұрын
@@Toki- внутри этого скрипта есть методы, которые управляют кубом, в конце показал он
@Sv9zlsT
@Sv9zlsT 3 жыл бұрын
привет, хорошее видео, но есть пару вопросов по СОЛИДности метода HasFreeElement он всё таки выглядит печально, так как имеет больше одной ответствнности, лучше его разделить, и out нас полностью обязывает использовать этот функционал
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Привет! СОЛИДность в плане единой ответственности предназначается для классов, а не для методов. Да, соглашусь, что принцип нужно соблюдать и в методах, по-хорошему. Но бывает, что метод выполняет не одно действие, и HasFreeElement() не единственный такой случай. В таких случаях мы либо делаем соответствующее название метода (чтобы было понятно, что делается внутри), либо, как в моем случае, мы можем использовать обязательный вывод наружу через out. Таким образом, если элемент есть он сразу попадает к нам в руки. Таким же способом устроен например Physics.Raycast() - внутренний метод Unity, где через out выводятся данные о попадании рейкаста, если таковое имеется.
@Rustam_Ildarovich
@Rustam_Ildarovich 2 ай бұрын
@@gamedevlavka Я бы советовал тогда переименовать метод в TryGetFreeElement, так отражается смысл метода вернуть свободный элемент в случает его наличия
@ArIsm-rg7tw
@ArIsm-rg7tw 3 жыл бұрын
👍👍👍
@crazist3325
@crazist3325 3 жыл бұрын
Видео очень хорошее, для уровня уже выше начинающего, но вот вопрос что делать если разный префа и в разное время, стоит создать просто 2ва пула или уже в самом пуле менять
@neverworld8815
@neverworld8815 2 жыл бұрын
Построить иерархию, и управлять ей, например есть главный объект пул, внутри 4 объекта (4 типа), и в каждом типе группа своих объектов, через главный пул можно манипулировать всеми ветками по первому принципу Solid, если кроме как по типу, будут другие сортировщики, то тогда всё-ровно нету смысла создавать доп классы, достаточно сделать грамотный поиск внутри пула
@PS-vj6jz
@PS-vj6jz 3 жыл бұрын
Хороший ролик, но это пул через list, есть ли более быстрые реализации (драсти оптимизация)). Я как-то натыкался на pool через queue.
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Есть загвоздка, ты не можешь пробежаться по Queue, чтобы найти неактивный элемент. Поэтому очередь не совсем подходит под большинство задач, связанных с пулом)
@PS-vj6jz
@PS-vj6jz 3 жыл бұрын
@@gamedevlavka а есть вообще варианты кроме списков?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@PS-vj6jz список самый оптимальный, он быстрый, он динамический, и его достаточно. Лучше не получится, с тем функционалом, что представлен в видео
@PS-vj6jz
@PS-vj6jz 3 жыл бұрын
@@gamedevlavka окей.
@neverworld8815
@neverworld8815 2 жыл бұрын
@@PS-vj6jz List это по сути копирование массива в новый, и "удаление" предыдущего, максимально оптимально это использовать 1 массив за всю жизнь который выделит фиксированное количество памяти, а для этого надо с 100% уверенностью установить лимиты по количеству объектов
@goga19980
@goga19980 3 жыл бұрын
Для чего/Почему везде пишешь this - где это необязательно?)
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Ответ на этот вопрос здесь => t.me/gamedevlavka/15
@leningradetsfromshusharsta985
@leningradetsfromshusharsta985 3 жыл бұрын
@@gamedevlavka но ведь для того чтобы отличать поля от локальных переменных, придумали называть поля с _, и вместо this.feild писать _feild и так и так понятно, что речь идёт о поле, а не переменной, но с подчеркиванием быстрее, и меньше раздуваются строки
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@leningradetsfromshusharsta985 это касается не только полей, но и методов. Вообще это индивидуальный подход, я ничего не имею против _ в общей практике. Это больше для себя. Мне так читать удобнее, и пишу я this быстрее, чем ставлю _.
@dmytromahas9207
@dmytromahas9207 3 жыл бұрын
Зачем создавать 2 конструктора для PoolMono если можно по дефолту для контейнера поставить значение null? public PoolMono(T prefab, int count, Transform container = null) { this.container = container; }
@neverworld8815
@neverworld8815 2 жыл бұрын
Потому что он может быть не null, но если не указан то будет null
@dmytromahas9207
@dmytromahas9207 2 жыл бұрын
@@neverworld8815 ну если укажешь то уже не будет null, в противном по дефолту подставится null
@neverworld8815
@neverworld8815 2 жыл бұрын
@@dmytromahas9207 я то-же самое сказал, только короче
@dmytromahas9207
@dmytromahas9207 2 жыл бұрын
@@neverworld8815 ахахах, так зачем 2 конструктора ??
@neverworld8815
@neverworld8815 2 жыл бұрын
@@dmytromahas9207 я уже ответил
@MesokiDante
@MesokiDante 3 жыл бұрын
Здравствуйте, я новичок в Unity3D поэтому хотел бы узнать как сделать так чтобы добавлять не один объект а несколько объектов и вызывать их рандомна, спасибо за раннее за ответ.
@dmytromahas9207
@dmytromahas9207 3 жыл бұрын
Привет, если ты новенький в юнити то лучше не спеши с такими темами, это более продвинутый левел, только зря время потратишь.
@DenisB-d5f
@DenisB-d5f 3 жыл бұрын
а зачем два конструктора охерел, что так вообще бывает у нас, у HTML-программистов, все не так
@IgorKu-m4o
@IgorKu-m4o 3 жыл бұрын
Почему свойства именуются с маленькой буквы? Свойства принято именовать с большой, а поля с маленькой. В типовом коде Юнити тоже с маленькой 🤔
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Есть разные конвенции и стили написания кода. То, что Майкрософт так рекомендует - не значит, что это удобно всему миру. Юнити решили, что будут использовать camelCase для публичных полей и свойств, а я решил, что не хочу, чтобы мой стиль отличается от стиля юнити. Такие дела)
@neverworld8815
@neverworld8815 2 жыл бұрын
Это по сути косметика, в некоторых командах разработчиков могут быть свои собственные знаки или ключевые слова для удобства
Настраиваем вторую камеру в Unity
6:23
Лавка Разработчика
Рет қаралды 7 М.
А я думаю что за звук такой знакомый? 😂😂😂
00:15
Денис Кукояка
Рет қаралды 5 МЛН
Lazy days…
00:24
Anwar Jibawi
Рет қаралды 7 МЛН
Farmer narrowly escapes tiger attack
00:20
CTV News
Рет қаралды 13 МЛН
ScriptableObject в Unity на примере информации о сундуках
10:05
Лавка Разработчика
Рет қаралды 20 М.
Динамическая оптимизация в UNITY! GPU instancing
7:40
Яковлев Илья - IT и игры
Рет қаралды 24 М.
Сохранение игры в файл в Unity
20:13
Лавка Разработчика
Рет қаралды 16 М.
Архитектура проекта в Unity. Часть 1
20:52
Лавка Разработчика
Рет қаралды 37 М.
А я думаю что за звук такой знакомый? 😂😂😂
00:15
Денис Кукояка
Рет қаралды 5 МЛН