Когда нужно часто спавнить много объектов лучше вместо instantiate и destroy включать, перемещать, настраивать и отключать уже готовые объекты на сцене. В официальном уроке от юнити написано:
public GameObject GetPooledObject()
{
for(int i=0; i < amountToPool; i++)
{
if(!pooledObjects[i].activeInHierarchy)
{
return pooledObjects[i]
}
}
return null;
}
То есть все объекты проходятся по очереди пока не будет найден неактивный. То есть чтобы брать таким образом по одному объекту прийдется каждый раз перебирать допустим тысячи объектов. А если еще таких пулов много с разными объектами. Почему бы например не иметь два листа вместо одного, один с ожидающими отключенными объектами, другой с работающими объектами. Если нужно достать, то из ожидающих берем один удаляем там и добавляем к активным, если нужно убрать, наоборот удаляем из листа активных и добавляем лист ожидающих