using Axibug; using System; using System.Collections.Generic; using UnityEngine; namespace Axibug.Runtime { public sealed partial class DebuggerComponent : GameComponent { private sealed class ReferencePoolInformationWindow : ScrollableDebuggerWindowBase { private readonly Dictionary> m_ReferencePoolInfos = new Dictionary>(StringComparer.Ordinal); private readonly Comparison m_NormalClassNameComparer = NormalClassNameComparer; private readonly Comparison m_FullClassNameComparer = FullClassNameComparer; private bool m_ShowFullClassName = false; public override void Initialize(params object[] args) { } protected override void OnDrawScrollableWindow() { GUILayout.Label("Reference Pool Information"); GUILayout.BeginVertical("box"); { DrawItem("Enable Strict Check", ReferencePool.EnableStrictCheck.ToString()); DrawItem("Reference Pool Count", ReferencePool.Count.ToString()); } GUILayout.EndVertical(); m_ShowFullClassName = GUILayout.Toggle(m_ShowFullClassName, "Show Full Class Name"); m_ReferencePoolInfos.Clear(); ReferencePoolInfo[] referencePoolInfos = ReferencePool.GetAllReferencePoolInfos(); foreach (ReferencePoolInfo referencePoolInfo in referencePoolInfos) { string assemblyName = referencePoolInfo.Type.Assembly.GetName().Name; List results = null; if (!m_ReferencePoolInfos.TryGetValue(assemblyName, out results)) { results = new List(); m_ReferencePoolInfos.Add(assemblyName, results); } results.Add(referencePoolInfo); } foreach (KeyValuePair> assemblyReferencePoolInfo in m_ReferencePoolInfos) { GUILayout.Label(Utility.Text.Format("Assembly: {0}", assemblyReferencePoolInfo.Key)); GUILayout.BeginVertical("box"); { GUILayout.BeginHorizontal(); { GUILayout.Label(m_ShowFullClassName ? "Full Class Name" : "Class Name"); GUILayout.Label("Unused", GUILayout.Width(60f)); GUILayout.Label("Using", GUILayout.Width(60f)); GUILayout.Label("Acquire", GUILayout.Width(60f)); GUILayout.Label("Release", GUILayout.Width(60f)); GUILayout.Label("Add", GUILayout.Width(60f)); GUILayout.Label("Remove", GUILayout.Width(60f)); } GUILayout.EndHorizontal(); if (assemblyReferencePoolInfo.Value.Count > 0) { assemblyReferencePoolInfo.Value.Sort(m_ShowFullClassName ? m_FullClassNameComparer : m_NormalClassNameComparer); foreach (ReferencePoolInfo referencePoolInfo in assemblyReferencePoolInfo.Value) { DrawReferencePoolInfo(referencePoolInfo); } } else { GUILayout.Label("Reference Pool is Empty ..."); } } GUILayout.EndVertical(); } } private void DrawReferencePoolInfo(ReferencePoolInfo referencePoolInfo) { GUILayout.BeginHorizontal(); { GUILayout.Label(m_ShowFullClassName ? referencePoolInfo.Type.FullName : referencePoolInfo.Type.Name); GUILayout.Label(referencePoolInfo.UnusedReferenceCount.ToString(), GUILayout.Width(60f)); GUILayout.Label(referencePoolInfo.UsingReferenceCount.ToString(), GUILayout.Width(60f)); GUILayout.Label(referencePoolInfo.AcquireReferenceCount.ToString(), GUILayout.Width(60f)); GUILayout.Label(referencePoolInfo.ReleaseReferenceCount.ToString(), GUILayout.Width(60f)); GUILayout.Label(referencePoolInfo.AddReferenceCount.ToString(), GUILayout.Width(60f)); GUILayout.Label(referencePoolInfo.RemoveReferenceCount.ToString(), GUILayout.Width(60f)); } GUILayout.EndHorizontal(); } private static int NormalClassNameComparer(ReferencePoolInfo a, ReferencePoolInfo b) { return a.Type.Name.CompareTo(b.Type.Name); } private static int FullClassNameComparer(ReferencePoolInfo a, ReferencePoolInfo b) { return a.Type.FullName.CompareTo(b.Type.FullName); } } } }