//the idea is to only expose the very very lowest level data in the unity api. this data is uncrawled. //you get the raw heap bytes, you get typedescriptions, and an overview of native objects, and that's it. // //the crawler, the higher level "c# idiomy api", and the UI window that uses that api //we can develop in an opensource github project, and iterate //on outside of the unity release trains. /* using System; namespace UnityEditor.Profiler.Memory { [Serializable] //note: this snapshot is completely serializable by unity's serializer. public class PackedMemorySnapshot { public PackedNativeUnityEngineObject[] nativeObjects; public PackedGCHandle[] gcHandles; public Connection[] connections; public ManagedHeap managedHeap; public TypeDescription[] typeDescriptions; public string[] classIDNames; } [Serializable] public struct PackedNativeUnityEngineObject { public string name; public int instanceID; public int size; public int classID; } [Serializable] public struct PackedGCHandle { public UInt64 target; } [Serializable] public struct Connection { //these indices index into an imaginary array that is the concatenation of snapshot.nativeObject + snapshot.gcHandles snapshot. public int from; public int to; } [Serializable] public class ManagedHeap { public HeapSegment[] segments; public VirtualMachineInformation virtualMachineInformation; } [Serializable] public class HeapSegment { public byte[] bytes; public UInt64 startAddress; } [Serializable] public struct VirtualMachineInformation { public int pointerSize; public int objectHeaderSize; public int arrayHeaderSize; public int arrayBoundsOffsetInHeader; public int arraySizeOffsetInHeader; public int allocationGranularity; }; [Serializable] public class TypeDescription { public string name; public string fullname; public int @namespace; public int assembly; public FieldDescription[] fields; public byte[] staticFieldBytes; public int baseOrElementTypeIndex; public int size; public UInt64 typeInfoAddress; public int typeIndex; public bool IsValueType { get { return (flags & TypeFlags.kValueType) != 0; } } public bool IsArray { get { return (flags & TypeFlags.kArray) != 0; } } public int ArrayRank { get { return (int) (flags & TypeFlags.kArrayRankMask) >> 16; } } private TypeFlags flags; private enum TypeFlags { kNone = 0, kValueType = 1 << 0, kArray = 1 << 1, kArrayRankMask = unchecked((int) 0xFFFF0000) }; } [Serializable] public class FieldDescription { public string name; public int offset; public int typeIndex; public bool isStatic; } }*/