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

UnsafeUtility.PinGCObjectAndGetAddress

Declaration

public static void* PinGCObjectAndGetAddress(object target, out ulong gcHandle);

Параметры

Параметр Описание
Цель Объект для прикрепления. Это должен быть управляемый объект, расположение памяти которого должно оставаться фиксированным во время сбора мусора.
gcHandle Обработчик, связанный с прикрепленным объектом. Правильно управляйте этим обработчиком, чтобы обеспечить его освобождение, когда он больше не требуется.

Возвращаемое значение

void* Указатель на расположение в памяти прикрепленного объекта. Используйте этот указатель для прямого доступа к данным объекта в памяти.

Описание

Прикрепляет объект к памяти, обеспечивая его сохранение в фиксированном месте памяти во время сбора мусора.

Метод PinGCObjectAndGetAddress прикрепляет управляемый объект, предотвращая его перемещение сборщиком мусора. Это особенно полезно, когда необходимо поддерживать стабильные адреса памяти при взаимодействии с неуправляемым кодом или выполнении низкоуровневых операций памяти. Убедитесь, что вы освободили обработчик GC с помощью UnsafeUtility.ReleaseGCObject, чтобы предотвратить утечку ресурсов.

using UnityEngine;
using Unity.Collections.LowLevel.Unsafe;

public class PinGCObjectBoxedStructExample : MonoBehaviour { private struct MyStruct { public int value; }

void Start() { // Create and box a struct object myObject = new MyStruct { value = 20 };

// Pin the boxed struct and get the address of its memory location unsafe { void* dataPtr = UnsafeUtility.PinGCObjectAndGetAddress(myObject, out ulong gcHandle);

// Move the pointer to skip the object header to get to the struct value int objectHeaderSize = UnsafeUtility.SizeOf<long>() * 2; // Typical object header size in bytes int* valuePtr = (int*)((byte*)dataPtr + objectHeaderSize);

// Log the initial value Debug.Log($"Initial struct value: {*valuePtr}"); // Expected output: 20

// Modify the value through the pointer *valuePtr = 40;

// Release the GC handle after manipulation UnsafeUtility.ReleaseGCObject(gcHandle); }

// Re-cast the object to a struct to verify modifications MyStruct modifiedStruct = (MyStruct)myObject; Debug.Log($"Modified struct value: {modifiedStruct.value}"); // Expected output: 40

// Confirm the GC handle is released Debug.Log("GC handle released, boxed struct unpinned."); } }

Дополнительные ресурсы: UnsafeUtility.PinGCArrayAndGetAddress.