Menu
CoddyTech

Зачем нужен пул объектов

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 37 из 50.

Пистолет, стреляющий 10 пулями в секунду в течение минуты, вызывает Instantiate 600 раз и Destroy 600 раз. Каждый Instantiate копирует префаб со всеми его компонентами и запускает их Awake, OnEnable и Start. Каждый Destroy запускает OnDisable и OnDestroy и оставляет память объекта в виде мусора. Сборщик мусора C# освобождает эту память позже, и его работа приходится на одни кадры, но не на другие, что проявляется в виде рывков, особенно заметных на медленных телефонах.

Пул сохраняет объекты, а не уничтожает их. Использованная пуля выключается с помощью SetActive(false) и возвращается в пул; следующий выстрел извлекает одну пулю и включает её, а Instantiate вызывается только тогда, когда пул пуст. После первых нескольких секунд стрельбы новые объекты больше не создаются, и мусор не образуется. При повторном использовании Awake и Start не запускаются снова: они сработали один раз, когда объект был создан. Всё, что должно сбрасываться при каждом использовании, например таймер, здоровье или скорость, сбрасывается в OnEnable или в коде, который извлекает объект.

Пулинг полезен для объектов, которые часто создаются и выбрасываются: пуль, искр, чисел урона, врагов в волновой игре. Он не нужен для босса, который появляется один раз, или меню, которое открывается время от времени. Пул постоянно хранит в памяти неактивные объекты, поэтому он сохраняет разумное их количество, а лишние освобождает.

Попробуйте сами

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Архитектура игр в Unity