Вступить в клуб →
средняявопросПрофилирование и оптимизация

Проверка земли под врагами: какие два изменения снимут нагрузку

Проверка поверхности под каждым врагом сделана так:

void Update()
{
    foreach (var enemy in _enemies)
    {
        RaycastHit[] hits = Physics.RaycastAll(enemy.transform.position, Vector3.down, 50f);
        enemy.SurfaceType = Classify(hits);
    }
}

Врагов на волне до 150. Профайлер показывает и заметное время в физике, и выделение памяти каждый кадр. Какие два изменения дадут наибольший эффект?

правильных вариантов может быть несколько

  • Использовать вариант проверки, пишущий попадания в заранее выделенный буфер, вместо создания нового массива
  • Перенести цикл в FixedUpdate: там число вызовов в секунду фиксировано и обычно меньше, поэтому массивы перестанут выделяться вовсе
  • Заменить foreach на for: перебор списка через foreach всегда упаковывает перечислитель в объект, и это главный источник мусора в кадре
  • Ограничить проверку маской слоёв и разумной дистанцией, чтобы луч не перебирал постороннюю геометрию
  • Запускать сборку мусора после цикла, чтобы память не накапливалась между кадрами

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела