Уничтожение LowLevelPhysics2D API объектов и управление памятью
Примечание: Эта документация посвящена написанию C# скрипты с использованием LowLevelPhysics2D API. Использовать 2D физики в Unity Editor используя компоненты, такие как Rigidbody 2D компонент, см. 2D физика вместо этого.
Уничтожайте миры, тела и формы, когда они вам больше не нужны. Если вы получаете физические объекты в NativeArray или ReadOnlySpan, вы также должны освободить их память, чтобы избежать утечки памяти.
Уничтожение физических объектов
Чтобы уничтожить мир, тело или форму, вызовите метод Destroy объекта. Например:
// Create a physics body
PhysicsBody myBody = world.CreateBody();
// Destroy the body when you no longer need it
myBody.Destroy();
Для быстрого уничтожения объектов используйте следующие методы:
- Уничтожение физического тела автоматически уничтожает все его формы и цепи, а также все соединения, к которым оно подключено.
- Уничтожение мира автоматически уничтожает все его тела и формы.
Unity регистрирует ошибку в окне Консоли, если вы пытаетесь уничтожить объект, который больше не существует. Чтобы проверить, не был ли объект уже уничтожен, получите свойство isValid объекта.
Unity может уничтожить ваш мир автоматически при входе или выходе из режима игры.
Уничтожение партии объектов
Чтобы уничтожить пакет объектов, вместо этого используйте следующие методы:
DestroyBodyBatch, если вы создали пакет с помощьюCreateBodyBatch.DestroyShapeBatch, если вы создали пакет с помощьюCreateShapeBatch.
Защита объектов от удаления
Чтобы защитить объект от удаления, вызовите SetOwner метода PhysicsBody объект. SetOwner возвращает уникальное целое число ключа. Если вы пытаетесь уничтожить тело, вы должны передать ключ, иначе уничтожение не удастся. Для получения дополнительной информации, см. PhysicsBody.
Предупреждение: Ключ служит только для сдерживания и не соответствует криптографическим стандартам.
Предотвращение утечек памяти
Большинство методов LowLevelPhysics2D API избегает создания памяти, которая нуждается в удалении или сборе мусора, и большинство методов возвращает простые типы struct.
Однако, если вы используете API, который хранит и возвращает физические объекты или результаты запросов в виде типа NativeArray или ReadOnlySpan, рекомендуется удалять собственную память, когда она больше не нужна. Удаление позволяет избежать утечек памяти.
Например, если вы создаете массив определений тела, используйте метод Dispose для высвобождения памяти, когда она больше не нужна. Например:
void Start(){
// Create a native array to hold body definitions
// The allocator property determines the lifetime of the array
NativeArray<PhysicsBodyDefinition> bodyDefinitions = new NativeArray<PhysicsBodyDefinition>(bodyCount, Allocator.Temp);
}
void OnDestroy()
{
// Dispose of the native array to free up memory
bodyDefinitions.Dispose();
}
Также можно создать собственные массивы с инструкциями using, чтобы автоматически удалять их, когда они выходят за пределы области. Например:
using NativeArray<PhysicsQuery.WorldCastResult> results = world.CastGeometry(objectGeometry, translation, filter, PhysicsQuery.WorldCastMode.Closest, Allocator.Temp);
Чтобы сделать результаты NativeArray или ReadOnlySpan сохраняющимися за пределами их области, например, если требуется сохранение данных для нескольких кадров, передайте методу Allocator.Persistent. Этот подход может уменьшить производительность, и вы все равно должны удалить основной массив или пространство только для чтения, когда он больше не нужен.
Дополнительные сведения о собственной памяти и выделениях см. в Собственная память.
Дополнительные ресурсы
- Оптимизация LowLevelPhysics2D API с многопоточной
- PhysicsCore2D хранилище на GitHub