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

UnsafeUtility.PinGCArrayAndGetDataAddress

Declaration

public static void* PinGCArrayAndGetDataAddress(Array target, out ulong gcHandle);

Параметры

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

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

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

Описание

Прикрепляет массив, собранный с помощью garbage-collection (GC), и возвращает адрес его первого элемента, обеспечивая, чтобы расположение массива в памяти оставалось фиксированным.

Метод PinGCArrayAndGetDataAddress прикрепляет управляемый массив к памяти, предотвращая его перемещение сборщиком мусора. Это крайне важно при взаимодействии с собственным кодом или при выполнении операций низкого уровня в памяти, связанных с управляемыми массивами. Используйте этот метод для получения стабильного указателя на элементы массива для операций, имеющих критическое значение для производительности.

После прикрепления массива освободите обработчик GC с помощью UnsafeUtility.ReleaseGCObject, когда массив больше не требуется прикреплять, чтобы избежать утечки ресурсов.

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

public class PinArrayExample : MonoBehaviour { void Start() { int[] managedArray = { 1, 2, 3, 4, 5 };

// Pin the managed array and get the address of its first element unsafe { void* dataPtr = UnsafeUtility.PinGCArrayAndGetDataAddress(managedArray, out ulong gcHandle);

Debug.Log($"Address of first element: {(IntPtr)dataPtr}");

// Manipulate the array data directly using the pointer int* intPtr = (int*)dataPtr; for (int i = 0; i < managedArray.Length; i++) { intPtr[i] *= 2; // Double each element in the array }

// Verify changes by logging the updated array Debug.Log("Contents of managed array after manipulation:"); for (int i = 0; i < managedArray.Length; i++) { Debug.Log(managedArray[i]); // Expected output: 2, 4, 6, 8, 10 }

// Release the GC handle once done UnsafeUtility.ReleaseGCObject(gcHandle); }

// Confirm that the GC handle is released Debug.Log("GC handle released, managed array unpinned."); } }

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