using System; using UnityEditor.MemoryProfiler; using UnityEngine; namespace MemoryProfilerWindow { //this is the highest level dataformat. it can be unpacked from the PackedCrawledMemorySnapshot, which contains all the interesting information we want. The Packed format //however is designed to be serializable and relatively storage compact. This dataformat is designed to give a nice c# api experience. so while the packed version uses typeIndex, //this version has TypeReferences, and also uses references to ThingInObject, instead of the more obscure object indexing pattern that the packed format uses. public class CrawledMemorySnapshot { public NativeUnityEngineObject[] nativeObjects; public GCHandle[] gcHandles; public ManagedObject[] managedObjects; public StaticFields[] staticFields; //contains concatenation of nativeObjects, gchandles, managedobjects and staticfields public ThingInMemory[] allObjects; public MemorySection[] managedHeap; public TypeDescription[] typeDescriptions; public PackedNativeType[] nativeTypes; public VirtualMachineInformation virtualMachineInformation; } public class ThingInMemory { public int size; public string caption; public ThingInMemory[] references; public ThingInMemory[] referencedBy; } public class ManagedObject : ThingInMemory { public UInt64 address; public TypeDescription typeDescription; } public class NativeUnityEngineObject : ThingInMemory { public int instanceID; public int classID; public string className; public string name; public bool isPersistent; public bool isDontDestroyOnLoad; public bool isManager; public HideFlags hideFlags; } public class GCHandle : ThingInMemory { } public class StaticFields : ThingInMemory { public TypeDescription typeDescription; public byte[] storage; } }