Unity 6.3
0 онлайн 20 гостей 3 в системе
Вход

Оптимизация лучевой графики и других физических запросов

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

Использовать версии запросов без выделения

Стандартные физические запросы, такие как 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 (или других запросов), которые могут обрабатываться параллельно.

Чтобы использовать пакетные запросы, выполните следующие действия:

  1. Создайте и заполните NativeArray<RaycastCommand> параметрами для всех ваших raycasts.
  2. Выделить NativeArray<RaycastHit> для хранения результатов.
  3. Планируйте пакетную обработку с помощью RaycastCommand.ScheduleBatch, которая возвращает JobHandle.
  4. Затем вы можете выполнить другую работу, а позже убедиться, что задание завершено, используя jobHandle.Complete перед доступом к результатам. Например, убедиться, что задание завершено в начале следующего кадра или по мере необходимости.

Дополнительные ресурсы