Оптимизация лучевой графики и других физических запросов
Оптимизируйте производительность запросов физики и уменьшите накладные расходы на сбор мусора, используя эффективные версии запросов и пакетную обработку.
Использовать версии запросов без выделения
Стандартные физические запросы, такие как Physics.Raycast, Physics.SphereCastили Physics.OverlapSphere, выделяют память в куче для своих результатов. Это выделение может привести к паузам в сборе мусора, особенно если они вызываются часто.
Вместо этого используйте не выделяющие аналоги этих запросов, которые записывают свои результаты в предварительно выделенный массив, который вы предоставляете. Не выделяющие аналоги могут включать:
Например:
int hitCount = Physics.RaycastNonAlloc(ray, preAllocatedHitsArray, distance, layerMask);
При использовании запросов без выделения вы должны предоставить предварительно выделенный массив. Например, RaycastHit[] preAllocatedHitsArray = new RaycastHit[10];.
Размер этого массива должен быть соответствующим: сделайте его достаточно большим, чтобы захватить максимальное количество ожидаемых попаданий в типичных сценариях, но не настолько большим, чтобы тратить память. Если число фактических обнаруженных коллайдеров превышает размер вашего массива буфера, возвращаются только результаты до вместимости массива, а остальные игнорируются.
Совет: Выберите размер буфера, который балансирует типичные потребности с соображениями памяти. Профиль вашей игры, чтобы понять общие количества хитов.
Использование пакетных запросов для нескольких операций
Запуск многих индивидуальных физических запросов (например, много raycasts на кадр) может снизить производительность из-за накладных расходов каждого вызова. Если вам нужно выполнить много запросов одновременно, пакетируйте их с помощью APIs как RaycastCommand, SpherecastCommand, или BoxcastCommand в связи с проведением система работы.
Этот подход использует многопоточность для параллельной обработки запросов, значительно повышая производительность операций массового запроса. Это особенно мощно, когда у вас есть много независимых raycast (или других запросов), которые могут обрабатываться параллельно.
Чтобы использовать пакетные запросы, выполните следующие действия:
- Создайте и заполните
NativeArray<RaycastCommand>параметрами для всех ваших raycasts. - Выделить
NativeArray<RaycastHit>для хранения результатов. - Планируйте пакетную обработку с помощью
RaycastCommand.ScheduleBatch, которая возвращаетJobHandle. - Затем вы можете выполнить другую работу, а позже убедиться, что задание завершено, используя
jobHandle.Completeперед доступом к результатам. Например, убедиться, что задание завершено в начале следующего кадра или по мере необходимости.