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

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,.