//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;
|
|
}
|
|
}*/
|