Проверка земли под врагами: какие два изменения снимут нагрузку
Проверка поверхности под каждым врагом сделана так:
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 всегда упаковывает перечислитель в объект, и это главный источник мусора в кадре
- Ограничить проверку маской слоёв и разумной дистанцией, чтобы луч не перебирал постороннюю геометрию
- Запускать сборку мусора после цикла, чтобы память не накапливалась между кадрами
