首页 > 解决方案 > memcpy NativeArray Index to NativeArray Index, Length,怎么办?

问题描述

Unity 中的 NativeArrays 没有从一个到另一个的部分复制功能。

有多种解决方法(NativeSlices 和 GetSubArray),但理想的方法是零检查、全信任、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 {
      
      GCHandle dstHandle = GCHandle.Alloc ( dst, GCHandleType.Pinned ) ;
      GCHandle srcHandle = GCHandle.Alloc ( src, GCHandleType.Pinned ) ;
      UnsafeUtility.MemCpy ( 
                            ( void* ) ( dstHandle.AddrOfPinnedObject (  )
                                      + dstIndex * UnsafeUtility.SizeOf<T> ( ) ), 
                             ( void* ) (  srcHandle.AddrOfPinnedObject ( ) 
                                       + srcIndex * UnsafeUtility.SizeOf<T> ( ) ), 
                            length ) ;
      dstHandle.Free (  );
      srcHandle.Free (  ) ;
    }
  }
}

标签: c#arraysunity3dmemcpyunsafe

解决方案


我不相信这会回答您的问题,但我无法将其正确格式化为评论。

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 : unmanaged
        {
            T* srcPtr = (T*)NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(src);
            {
                var d = dst.GetUnsafePtr();
                UnsafeUtility.MemCpy(d, srcPtr + dstIndex, sizeof(T) * length);
            }
        }
    }
}

上面的代码片段未经测试,我不确定它是否会起作用。更多将其留在这里作为您可能弄清楚的起点。


推荐阅读