如何通过memcpy实现Unity中两个NativeArray按索引与长度的片段拷贝
问题根因
- 错误使用GCHandle锁定NativeArray结构体:NativeArray是值类型,内部仅持有非托管内存的指针,直接锁定结构体无法获取实际存储元素的原生内存地址,你调用
AddrOfPinnedObject拿到的是NativeArray结构体本身的地址,不是元素数据的地址,拷贝操作完全作用在了错误的内存区域 MemCpy参数单位错误:UnsafeUtility.MemCpy的第三个参数是拷贝的字节数,你直接传了元素个数,就算地址正确也只会拷贝length个字节,远小于实际需要拷贝的数据量
正确实现
完全符合你要求的无额外检查、纯memcpy逻辑的实现如下:
using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; namespace Unity.Collections { public static class NativeArrayExtensions { public static unsafe void CopySuperFast<T>( this NativeArray<T> src, int srcIndex, NativeArray<T> dst, int dstIndex, int length) where T : struct { int elementSize = UnsafeUtility.SizeOf<T>(); byte* srcPtr = (byte*)src.GetUnsafeReadOnlyPtr() + srcIndex * elementSize; byte* dstPtr = (byte*)dst.GetUnsafePtr() + dstIndex * elementSize; UnsafeUtility.MemCpy(dstPtr, srcPtr, length * elementSize); } } }
注意事项
- 该实现无任何边界校验、生命周期校验,调用方必须自行保证:源数组从
srcIndex开始存在length个有效元素、目标数组从dstIndex开始有足够空间存储length个元素、两个数组在拷贝过程中未被释放、泛型T为无托管引用的blittable值类型 - 该实现完全兼容Burst编译,性能和原生memcpy完全一致
内容的提问来源于stack exchange,提问作者Confused
相关产品推荐
相关产品推荐

