NativeArray<T>を高速にシリアライズ/デシリアライズ

高速化TIPSです。以前、ARKitの顔の頂点のデータをUnityEditorに送るプログラムを書きました。

mobile.twitter.com この様なことができます。

UnityEditorには毎フレーム以下のデータを送っています。

public NativeArray<Vector3> vertices; 
public NativeArray<Vector3> normals; 
public NativeArray<int> indices; 
public NativeArray<Vector2> uvs;

頂点の数が多くシリアライズ、デシリアライズがパフォーマンスのネックになっていました。直接ポインタをゴニョゴニョすると行けるのではないかと調べているとNativeSliceにSliceConvertという型を変換できるメソッドがあることに気づきました。これを使うと以下の様なことができます。

gist.github.com

使い方です。

NativeArray<Vector3> vertices;

// シリアライズ
byte[] verticesBytes = vertices.ToRawBytes();

// デシリアライズ
NativeArray<Vector3> vertices2 = NativeArrayExtension.FromRawBytes<Vector3>(verticesBytes, Allocator.Temp);