You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:57:02