Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Set Data Pointer of native array

Discussion in 'Entity Component System' started by Spy-Shifty, Dec 1, 2018.

  1. Spy-Shifty

    Spy-Shifty

    Joined:
    May 5, 2011
    Posts:
    546
    Hi there,

    is there a way to set the pointer of a native array?

    What I try is to convert the DataStreamReader from the unity.multiplay package to an native array without to copying it.


    Something like this:
    Code (CSharp):
    1.  
    2. static unsafe class DataStreamExtensions {
    3.  
    4.     public static NativeArray<byte> ToNativeArray(this DataStreamReader streamReader) {
    5.         var nativeArray = new NativeArray<byte>();
    6.         NativeArrayUnsafeUtility.SetUnsafeReadOnlyPtr(DataStreamUnsafeUtility.GetUnsafeReadOnlyPtr(streamReader));
    7.         return nativeArray;
    8.     }
    9.  
    10.  
    11.     //OR
    12.     public static NativeArray<byte> ToNativeArray(this DataStreamReader streamReader) {
    13.         var nativeArray = new NativeArray<byte>(DataStreamUnsafeUtility.GetUnsafeReadOnlyPtr(streamReader));
    14.         return nativeArray;
    15.     }
    16. }
    17.  
    18.  
    19.  
    20.  
     
  2. Spy-Shifty

    Spy-Shifty

    Joined:
    May 5, 2011
    Posts:
    546
    Ok I got it!

    Code (CSharp):
    1. static unsafe class DataStreamExtensions {
    2.  
    3.     public static NativeArray<byte> ToNativeArray(this DataStreamReader streamReader) {
    4.         return NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(DataStreamUnsafeUtility.GetUnsafeReadOnlyPtr(streamReader), streamReader.Length, Allocator.Invalid);
    5.     }
    6. }
     
    sisyphuso and 5argon like this.
  3. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    You also need to setup / copy the atomic safety handle.
     
    Minchuilla and Spy-Shifty like this.
  4. Spy-Shifty

    Spy-Shifty

    Joined:
    May 5, 2011
    Posts:
    546
    Thank you!

    But there is no GetAtomicSafetyHandle for DataStreamReader...

    The NativeList implementation also don't take a SafetyHandler.

    DataStreamWriter version:
    Code (CSharp):
    1.     public static NativeArray<byte> ToNativeArray(this DataStreamWriter streamWriter) {
    2.         var nativeArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(DataStreamUnsafeUtility.GetUnsafePtr(streamWriter), streamWriter.Length, Allocator.Invalid);
    3.         NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref nativeArray, DataStreamUnsafeUtility.GetAtomicSafetyHandle(streamWriter));
    4.         return nativeArray;
    5.     }
     
    eizenhorn likes this.
  5. Minchuilla

    Minchuilla

    Joined:
    Feb 28, 2014
    Posts:
    16
    For others, you can also just create a new AtomicSafetyHandle
    Code (CSharp):
    1. var array = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<uint>(pointer, length, Allocator.Temp);
    2. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref array, AtomicSafetyHandle.Create());
     
    sisyphuso likes this.
  6. chadfranklin47

    chadfranklin47

    Joined:
    Aug 11, 2015
    Posts:
    221
    But what about releasing that safety handle?