UnsafeUtility.MemCpyStride
Declaration
public static void MemCpyStride(void* destination, int destinationStride, void* source, int sourceStride, int elementSize, int count);Параметры
| Параметр | Описание |
|---|---|
| место назначения | Указатель на начало блока памяти назначения. Блок памяти должен размещать данные в соответствии с требованиями к шагу назначения и размеру элемента. |
| destinationStride | Шаг в байтах между последовательными элементами в блоке памяти назначения. Этот шаг облегчает пропуск байтов. |
| источник | Указатель на начало блока исходной памяти, содержащего копируемые данные. Размер этого блока должен быть основан на шаге и количестве исходных данных. |
| sourceStride | Шаг в байтах между последовательными элементами в блоке исходной памяти. Это позволяет правильно извлекать данные из переплетенных или заполненных макетов. |
| elementSize | Размер в байтах каждого отдельного элемента для копирования. Обеспечьте согласованность размера элемента между источником и назначением для точного копирования. |
| Количество | Число элементов, которые будут перенесены из блока источника в блок назначения. И источник, и назначение должны иметь место для этого элемента. |
Описание
Копирует данные между блоками памяти с заданными шагами, позволяя пропускать байт как в источнике, так и в назначении.
Метод MemCpyStride похож на UnsafeUtility.MemCpy, но поддерживает переменные шаги для блоков памяти источника и назначения. Эта функция особенно полезна для работы с несмежными расположениями памяти, такими как те, которые встречаются в структурах с заполнением или переплетением данных. Она позволяет эффективную передачу данных, когда прямое выравнивание элементов не осуществимо.
Убедитесь, что указатели источника и назначения действительны и что их области памяти не перекрываются неправильно, что приведет к неопределенному поведению. Этот метод не выполняет проверку границ, поэтому крайне важно убедиться, что есть достаточно места для передачи данных.
using UnityEngine; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using System.Runtime.InteropServices;
public class MemCpyStrideExample : MonoBehaviour { [StructLayout(LayoutKind.Sequential)] struct VertexData { public float x; public float y; public float z; public int id; }
void Start() { // Create source NativeArray of VertexData with padding NativeArray<VertexData> vertexArray = new NativeArray<VertexData>(5, Allocator.Temp); // Create destination NativeArray to hold just the IDs, without extra floats NativeArray<int> idArray = new NativeArray<int>(5, Allocator.Temp);
// Fill the vertex array with sample vertex data for (int i = 0; i < vertexArray.Length; i++) { vertexArray[i] = new VertexData { x = i, y = i, z = i, id = i + 100 }; }
// Use UnsafeUtility.MemCpyStride to copy only the IDs from the padded structure unsafe { void* vertexPtr = vertexArray.GetUnsafeReadOnlyPtr(); void* idPtr = idArray.GetUnsafePtr();
int elementSize = UnsafeUtility.SizeOf<int>(); // Size of ID element int srcStride = UnsafeUtility.SizeOf<VertexData>(); // Complete size of VertexData struct int idOffset = UnsafeUtility.AlignOf<float>() * 3; // Offset bytes past the floats to the ID
UnsafeUtility.MemCpyStride(idPtr, elementSize, (byte*)vertexPtr + idOffset, srcStride, elementSize, vertexArray.Length); }
// Log the copied IDs from the idArray to verify the result for (int i = 0; i < idArray.Length; i++) { Debug.Log($"ID: {idArray[i]}"); // Expected output: 100, 101, 102, 103, 104 }
// Clean up resources vertexArray.Dispose(); idArray.Dispose(); } }
Дополнительные ресурсы: ,UnsafeUtility.SizeOf,, ,UnsafeUtility.MemCpy,.